Start from a NetHack 3.3.1 source tree. Remove the following files: Remove sys/amiga/amilib.c Remove sys/amiga/amiwbench.c Remove sys/amiga/ask.uu Remove sys/amiga/char.c Remove sys/amiga/charwin.uu Remove sys/amiga/clipwin.uu Remove sys/amiga/colors.uu Remove sys/amiga/dflticon.uu Remove sys/amiga/dispmap.s Remove sys/amiga/hackwb.hlp Remove sys/amiga/HackWB.uu Remove sys/amiga/NewGame.uu Remove sys/amiga/NHinfo.uu Remove sys/amiga/randwin.c Remove sys/amiga/randwin.uu Remove sys/amiga/scroll.uu Remove sys/amiga/string.uu Remove sys/amiga/wb.c Remove sys/amiga/wbcli.c Remove sys/amiga/wbdata.c Remove sys/amiga/wbdefs.h Remove sys/amiga/wbgads.c Remove sys/amiga/wbprotos.h Remove sys/amiga/wbstruct.h Remove sys/amiga/wbwin.c Remove sys/amiga/wbwin.uu Remove sys/amiga/splitter/amiout.h Remove sys/amiga/splitter/arg.c Remove sys/amiga/splitter/arg.h Remove sys/amiga/splitter/loader.c Remove sys/amiga/splitter/multi.c Remove sys/amiga/splitter/multi.h Remove sys/amiga/splitter/split.doc Remove sys/amiga/splitter/split.h Remove sys/amiga/splitter/splitter.c Remove sys/mac/old/DCproj.hqx Remove sys/mac/old/Install.mpw Remove sys/mac/old/Install.thk Remove sys/mac/old/LCproj.hqx Remove sys/mac/old/macsegs Remove sys/mac/old/MDproj.hqx Remove sys/mac/old/mhdump.c Remove sys/mac/old/mpwhack.h Remove sys/mac/old/mstring.c Remove sys/mac/old/NetHack.r Remove sys/mac/old/NHmake.hqx Remove sys/mac/old/NHproj.hqx Remove sys/msdos/old/exesmurf.c Remove sys/msdos/old/exesmurf.doc Remove sys/msdos/old/maintovl.doc Remove sys/msdos/old/Makefile.dat Remove sys/msdos/old/MakeMSC.src Remove sys/msdos/old/MakeMSC.utl Remove sys/msdos/old/ovlmgr.asm Remove sys/msdos/old/ovlmgr.doc Remove sys/msdos/old/ovlmgr.uu Remove sys/msdos/old/README.old Remove sys/msdos/old/schema.old Remove sys/msdos/old/trampoli.c Remove sys/winnt/Makefile.nt Remove sys/winnt/winnt.cnf Remove win/win32/tile2bmp.c Then apply the rest of this using patch to create a number of new files and then change many old files, to end up with a NetHack 3.4.0 source tree. *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes22.0 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,353 ---- + NetHack Fixes List Revision 2.2 + + Fixes and Modified Features + --------------------------- + Guidebook.mn New file "Guide to the Mazes of Menace". By Eric Raymond. + Guidebook A file for preparation using the "mn" macros supplied with + the 2.11 news release, as well as an ascii version of the + same. + + NetHack.cnf Sample configuration file for the PC. (creps@silver) + + Makefiles Corrected problem in which the linking was done on build and + (unix/xenix) on install. (Contributed by Janet Walz - walz@mimsy) + + Makefile.att Added a makefile for the AT&T Unix PC using shared libraries. + (Contributed by ahby@umn-cs) + + Makefile.pc Streamlined compilation of main.o, tty.o, and unix.o + Makefile.tcc (Contributed by polder@cs.vu.nl). + + data.base deletion of duplicate lines and spelling fixes. (sweet@scubed) + + invent.c REDO problem with "What do you want to..." text fixed. + down stairway identification fixed. + Alloc "buf" to allow for variable length HI/HE. (tom@uw-warp) + + engrave.c Correction to "feel" code. (mike@genat) + Corrected switch for message determination. (patrickm@hpisof0) + BURN'ed engravings made un-erasable again. (kyrimis@princeton) + + pri.c Added colour highliting functions (sweet@scubed) + + prisym.c changed "symbol.room" to "ROOM_SYM" (one I missed) + (Ralf.Brown@b.gp.cs.cmu.edu) + Changed "dirlet()" to return an int. (maartenj@cs.vu.nl) + + msdos.c Changed "symbol" to "showsyms" (Ralf.Brown@b.gp.cs.cmu.edu) + Fixed up REDO & IBMBIOS stuff. (Kevin Sweet - sweet@scubed) + + do.c Dropping gold asked for only when gold posessed. (walz@mimsy) + Potential unsigned value problem fixed (u.ucreamed) + Added leash dropping code. (maartenj@cs.vu.nl) + Blind modifications for blindfolding. (eric@snark) + Value wrap fixed for u.ucreamed + + fight.c Dog's name now used in hitting avoidence message. (walz@mimsy) + Variable initialization fixed w.r.t. #ifdef / #else. + (Reported by Erwin Unruh - unruh@infbs) + Added giant rats and kobolds back into code. (sweet@scubed) + + spell.c Potential unsigned value problem fixed (u.ulevel). + Typos corrected. (Tom May - tom@uw-warp) + Blind modifications for blindfolding. (eric@snark) + + shk.c "inshop" crash bug corrected (many sources). + extern declaration of carrying() moved to avoid a Turbo-C + type mismatch msg. (Ralf.Brown@b.gp.cs.cmu.edu) + Added new "online()" which executes faster. (tom@uw-warp) + Blind modifications for blindfolding. (eric@snark) + Added item pricing shopkeeper talk. + (Idea from a hacked up 1.0.1 source sent in by michael@stb) + Cleaned up Kops code. (sweet@scubed) + + mhitu.c Argument mismatches fixed. (walz@mimsy) + Scorpion/spider mixup fix. (William LeFebvre - phil@rice.edu) + Blind modifications for blindfolding. (eric@snark) + + potion.c Argument mismatch fixed. (walz@mimsy) + Blind modifications for blindfolding. (eric@snark) + Poison handling made more dependant on poison resistance. + (From an idea by Steve Creps - creps@silver) + + mklev.c Fixed up installation of vamp traps. (sweet@scubed) + + makemon.c Monster creation location bug fixed. (walz@mimsy) + Monster creation crash fixed. (many sources) + Monster posessions bug fixed. (S. Wrammerfors stewr@obelix) + Added giant rats and kobolds back into code. (sweet@scubed) + + hack.c "Elbereth" effectiveness increased under "HARD" option to + be reasonable. (walz@mimsy) + Declaration of "register struct monst *m_at()" fixed. (many) + Typo fixed. (tom@uw-warp) + Fixed scroll of scare monster pickup problems (and giveaway) + (polder@cs.vu.nl) + Documentation modifications for blindfolding. (eric@snark) + + ioctl.c ioctl call for SET changed to function properly under + + unixtty.c Sys V R3 mods. (tom@uw-warp) + + decl.c in_doagain initialized. (many sources) + + wield.c Ability to remove cursed weapons w. w- removed. (many sources) + + options.c Major rewrite of options help. Now uses pager. (mike@genat) + Rewrote GRAPHICS setup. (maartenj@cs.vu.nl) + Allowed reassignment of inventory order #ifdef DGK + (polder@cs.vu.nl) + + pray.c Fixed mk_obj of spellbook under all conditions to make book + if "SPELLS" defined, and scroll otherwise. (unruh@infbs) + Fixed typo in "gods angry" text. (tom@uw-warp) + Fixed blessing code. (Simon Brown - simon@its63b) + Blind modifications for blindfolding. (eric@snark) + + zap.c Potion of invis. breakage message improved. (unruh@infbs) + Added WAN_PROBING to "zapyourself". + Changed "dirlet()" to return an int. (maartenj@cs.vu.nl) + Fixed cancellation code to work properly on wands (spe + set to -1 instead of 0) this means no infinite wands of + wishing. (Ron Wessels - ron@utcsri) + Fixed bug in "buzz()" causing crash when destroying a + trapper from inside with a wand/spell. (mike@genat) + Added fcn to destroy wands with zero charges. (sweet@scubed) + + pcmain.c Added a routine to zero out the fileinfo array in order to + prevent crashes on level change. (ralf@b.gp.cs.cmu.edu) + Added chdir to HACKDIR before looking for .CNF file. + Added call "uptodate(savefile)". (polder@cs.vu.nl) + + pager.c changed "cornline()" to use xputs for HI/HE. (tom@uw-warp) + added choice for dowhatis() to allow letter or cursor object + selection. (polder@cs.vu.nl) + + cmd.c Added ^W (wish) and ^I (ident-all) commands for WIZARD-mode. + (Paul Polderman - polder@cs.vu.nl) + Added "Z" as alternate to "# cast" (Eric Raymond - eric@snark) + + u_init.c Expanded a tab which didn't show in raw mode. + Changed trobj.trotyp to "unsigned short" to avoid >255 + problems. (Maarten Jan Huisjes - maartenj@cs.vu.nl) + Removed wand of wishing from WIZARD's inventory (due to + the above cmd additions). (polder@cs.vu.nl) + Fixed declaration of leash. (simon@its63b) + Beefed up Wizard class. + Added Wakizashi for Samurai. + Added holy water for Priest(ess)es. + Modifications to provide blindfolds. (eric@snark) + + end.c changed inventory identification on death to list form. + (polder@cs.vu.nl) + added hallucination effects to done_in_by() + added posession of amulet flag for scoreboard (sweet@scubed) + + wizard.c corrected "nasties" decl. (maartenj@cs.vu.nl) + Blind modifications for blindfolding. (eric@snark) + + do_wear.c Prot. from shape changers logic fixed. (maartenj@cs.vu.nl) + + lev.c Prot. from shape changers logic fixed. (maartenj@cs.vu.nl) + + mon.c Inserted cast to fix compiler warning. (maartenj@cs.vu.nl) + Nymphs now leave potions of object detection when killed. + Kops now don't leave treasure behind. (sweet@scubed) + + topl.c Changed size of "toplines" to avoid overflow in "parseoptions" + when help is asked for. (probably n/a) (maartenj@cs.vu.nl) + + topten.c Added longer death descriptions, including name of + shopkeeper who killed character. (many sources) + + termcap.c Changed allocation of HI/HO for copying SI/SO to allow room + for null. (maartenj@cs.vu.nl) + Added PCHack 3.61 termcap stuff. + Added colour highliting code. (sweet@scubed) + + version.c Expanded a tab for rawmode io. (maartenj@cs.vu.nl) + + objnam.c Allow the WIZARD to wish for really excessive objects. + (polder@cs.vu.nl) + + makedefs.c Added "freopen" which works (MSC 4.0 drops first couple + of lines). Solves missing #define AMULET... problem. + (Nathan Glasser - nathan@mit-eddie) + + rnd.c Changed around random number generation: + BSD uses "random()". (Paul Eggert - eggert@grand) + SYSV uses "lrand48()". (mike@genat from above) + + eat.c Changed "choke()" code to waste food rather than choke on + it #ifndef HARD. (Allan Pratt - apratt@atari) + Blind modifications for blindfolding. (eric@snark) + + objects.h added blindfold object (tool). (eric@snark) + + you.h changed Blind/BLIND to Blinded/Blinded + added Blindfolded/BLINDFOLDED + redefined Blind in terms of above parameters. (eric@snark) + + apply.c added blindfold code. (eric@snark) + + timeout.c Blind modifications for blindfolding. (eric@snark) + + sit.c Blind modifications for blindfolding. (eric@snark) + + trap.c Blind modifications for blindfolding. (eric@snark) + Level teleportation to hell fixed so that it will not + do so unless character has Fire_resistance. (many sources) + Added polymorph trap. (many sources) + + monmove.c added check on presence of "fobj" before atl() call + to avoid potential segmentation problem with ROCKMOLE. + (Reported by Doug Rudoff - doug@wiley) + + various files Fixed typos. Also converted British English words to + American English for uniformity. (Original list of typos + submitted by Steve Creps - creps@silver) + + + New Features + ------------ + 1) New flags in "config.h" (some of these were included in 1.4f): + + COM_COMPL Command line completion by John S. Bien + GRAPHICS Funky screen character support (Eric S. Raymond) + HACKOPTIONS Support DGK-style HACKOPTIONS processing (ESR) + RPH Various hacks by Richard P. Hughey + KJSMODS Various changes made by Kevin Sweet + BVH Additions by Bruce Holloway + + In addition, in an MSDOS enviornment, when GRAPHICS is defined: + + MSDOSCOLOR Colour highlighting of monsters, etc. + + Of the above, I haven't tested HACKOPTIONS and MSDOSCOLOR. If you + find bugs in these, send me the reports. + + 2) New objects: + + blindfold - allows you to avoid the gaze of a Floating Eye and to + use your telepathy on command if you have it. + + mirror - scares monsters if you use it on them (and other uses). + + ring of polymorph - (usually cursed) forces random polymorphs. + + ring of polymorph control - prevents system shock and allows choice of + creature to polymorph into. + + 3) New Files: + + - A new set of documentation, the "Guidebook to the Mazes of Menace" + has been supplied by Eric S. Raymond. The guidebook is written for + nroff using the "mn" macro set supplied with Bnews 2.11 or greater. + Since not everyone has these macros, I have run the guidebook through + nroff, and supplied it in flat ascii format as well. [Moderator's + note: because of past problems, I ran the formatted version + through "col -b" before passing it on to remove ^H's, etc. -br] + + - A copy of "HACK.CNF" which has been renamed "NetHack.cnf" was + supplied by Steve Creps. The file decl.c has been updated to reflect + this change. + + - A new "Makefile" for the AT&T Unix machines has been added. + + - I was hoping to get documentation on "NANSI.SYS" as well, but got + no responses to the mail I sent the author, direct and via Bill + Randle at tekred. As per usual, I will gladly publish any relevant + documentation I get. + + 4) Major game changes: + + - Shop generation has been significantly changed. A new structure + has been introduced which allows shops (except the "general" type) + to have up to three different types of object inside. There is also + a new "distribution pattern" parameter which tells the generation + code how to lay out the shop (this is preliminary to the addition of + two new types of shop, the temple and barracks - more on this later). + + - Shopkeepers will now tell you how much they expect for each object + you pick up. This gives you the ability to haggle with the merchant + in question by dropping and picking up objects until you are more or + less satisfied with the price. I have re-written "getprice()" in + shk.c in an attempt to make sure that you cannot actually sell any + particular object for more than the shopkeeper will charge for it. + + - Another change to shopkeepers has them potentially getting angry if + you stay beside them after not paying your bill. Each they time they + ask you to pay up, there is a chance they will decide they don't like + people who don't pay... + + - A new monster, the hydra, has been added (as you have probably seen + on the net). I haven't had much chance to test out this feature of + the game. Mirrors have also been added, and seem to work quite well. + + - Changes have been made to the object ocurrence chances in objects.h, + so that the relatively rare tools, etc. have at least a 1% chance of + showing up. + + - Throwing and zapping code has been modified so that there is a + chance that said can be done through a doorway. Bolts can still + bounce however... + + - The infamous and dreaded makemon() bug has been eliminated. In + addition to this, "r"ats and "K"obolds have been added back into the + game. "K"ops no longer leave treasure (just what they were carrying, + plus maybe a club or whistle). + + - Two new "super"swords have been added. They are the katana named + "Snickersnee" which is +5 on damage (due to sharpness), and the long + sword "Excalibur" which is +rnd(10) to hit, +5 on damage, and has a + couple of other features I won't go into right now. The only way + for a character to get "Excalibur" is as a gift from someone. You + cannot write the word "Excalibur" on things for some reason... + + - There have been two additions to disallow infinite wand charges. + First of all, wands with less than zero charges will automatically + turn to dust (thanks to Kevin Sweet). Next, a wand of cancellation + will set the number of charges in the wand to -1, which will make it + forever useless, (thanks to Ron Wessels). + + 5) Minor game changes: + + - The fountain code has been tightened slightly so you can no longer + dip objects into a fountain or drink from one while you are floating + in mid-air due to levitation. + + - Teleporting to hell via a teleportation trap will no longer occur + if the character does not have fire resistance. I found this just + too arbitrary a way to die (and so did several other people who com- + plained about it). + + - A new trap, the "polymorph" trap has been added by Richard Hughey. + It's inclusion is dependant on having "KAA" defined. + + - In wizard mode, the wizard player has infinite wishes, and the + ability to instantly identify everything (s)he is carrying. The wizard + player is also no longer limited by the standard multiple / bonus res- + trictions on objects wished for. + + - Random number generation has been changed around to make it (I hope) + more unpredictable. + + - A large number of typos have been fixed, and all of the British + spellings converted to American. I would like to see a shell script + to allow conversion back (or something like that) in the future. + + - I have done a "make depend" for the makefiles to reflect a slight + restructuring in the order of inclusion of header files. + + 6) Future additions: + + - Steve Creps is working on "barracks" and "soldier" code which is + now ready for addition. I have added the "soldier" side into the + game, but haven't really tested it. Steve will be adding the + "barracks" section in and sending me the resulting patches. There + will be a minor (read patch) release as soon as he can get the code + integrated into this release and sent up here to me. + + - There are also several other new room projects in the works which + should be able to be included in that minor release, along with any + bug reports that are made in the interim. *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes31.1 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,110 ---- + Makefile.utl vs. GNU make (*_lex.o needs explicit *_lex.c dependency) + defining MAKE in more makefiles (symptom is "sh: makedefs: not found") + finding test in makefiles (needs shell meta-char, >/dev/null or || exit 1) + splitter hunk sizes with SAS 6.x (wouldn't fit on floppy) + + OpenWindows 2.x documentation (?) + ',' and ';' in help files, including Guidebook + Guidebook date (nroff and pre-processed versions) + VMS options syntax (config file description omitted "OPTIONS=" requirement) + + phase of moon for Mac and MSDOS ports -- revert to old, portable phase of + moon code + polymorphing into bees (divide by zero core dump, reported as + floating point error on Sparcs) + monster throwing boulder into pool could free object twice + candle burn-out accessing free'd object while traversing list (Mac core dump) + inappropriate candle merging (lit with unlit) + several levelflags (fountains, etc.) not being handled on special levels + subrooms[] not initialized + coredump on messed DEFAULT_WIN_SYS + deleting lock.0 files on early quit + number_pad/mouse coexistence + jumping onto doors or boulders + tombstone gold neglected gold in containers, although score was correct + initial gold record neglected gold in containers + reeling monsters leaving ghosts (missing newsym) + display getobj prompt for non-REDO + packorder option parsing + inconsisent option parsing with IBM vs. IBMg, etc. + throwing Mjollnir at adjacent hard things causes panic/core dump + throwing at ghosts in walls left objects stuck in walls + throwing unpaid objects in shops (donated to player by shk) + Shopkeeper administration out of order (buying group of used up items) + pricing chains, uball, or other nocharge objects, when they couldn't be sold + knocking uball down a hole by dropping another object caused crash + kicking monsters while levitating (core dump if monster "reels" or killed) + kicking empty space while levitating could give free move (recoil) + panic when nurse is fixing your damage and disappears + core dump 'D'ropping everything with gold but no inventory (null pointer access) + core dump using getpos() "move to feature" response when map shows something + covering furniture (displayed glyph leads to invalid subscript use) + deity gender reference in opening legacy message + makeplural() said "poisoned yas" instead of "poisoned ya" + zapping on entry to water left trails + allow level teleports to be cancelled + excess choking when eating corpses + funny death message (or coredump) when you choke on a tin of spinach + after partially eating something else + Magicbane expulsion confused cutworm() + charging for several overlooked items (mainly magical instruments) + taming a sticking monster (e.g mimic) wouldn't set you free + panic when tinning while standing on stairs with a full pack and object drops + zapping down into ice with wand of digging (core dump) + rust monsters wouldn't ever hurt armor, even non-rustproof armor. conversely, + unrustable things rusted. + mysterious rust damage on damp levels (improper object chain traversal + when any item landed in pool after being thrown or dropped) + very eroded nonrustable/corrodable/flammable objects displayed as "very +0..." + map window wasn't being initialized correctly, causing some 'a'filled screens + using magic marker with full pack leaves you with an item in the '#' slot + spellbook merging caused multiple books to fade away when you re-read + them enough times + Master of Thieves in Tourist quest not created with Bell of Opening, making + game virtually un-winnable + could wish for quest items + If an eel managed to drown you, it would say "Drowned by a drowning" + stop making bones from non-branch portal levels + reading blank scrolls exercised wisdom + inverted use of crystal ball "vision in unclear" feedback message + special room entry messages (shop welcome) given before level change map update + limbless blobs like gelatinous cubes could not pick up + The level compiler missed first level flag if more than one was specified. + The level compiler accumulated level flags when compiling multiple files. + make the 32-bit monster flags fields unsigned long rather than just long + mksobj() created gold a factor of 10 too light + indefinite articles in quest text + Alt-n didn't execute #name on some ports, made Alt-? do #? + correct tense and grammar of various messages + obsolete oracle about using mirror to locate Wizard & Medusa removed + Nurses would zap you with wands, et al, instead of healing you + Shopkeepers residence was sometimes wrong on bones level, esp. in the minetown + Some zaps, esp. by monsters, at the map edge could cause core dumps + panic relmon bug possible when #turn'ing multiple monsters at once + it wasn't possible to get underwater when polymorphed to a swimmer + total digestion wasn't working + lycanthropy could change sex + interrupting dosinkring() allowed free ring identification + killing some hostile humans (like Croesus and priests) lost telepathy, etc. + + tty specific: long input lines and improved interrupt handling + X11: NetHack.ad: "*map*grey" should be "*map*gray" + X11: NetHack.ad: remove excess quotes + HPs and X (SYSV conflict caused by X11 headers) + Handle WM_DELETE_WINDOW protocol in X11 window-port. + X11 popups are now positioned so that the cursor is bottom center. + Both X11 fonts now have a pool symbol that coveres the whole rectangle. + X11_getlin will now allow empty strings to be returned. + X11: implement score in the status window. + X11: make displaying experience optional. + X11: position getline and yn popups center,bottom instead of center,center. + X11: autofocus mode made more reliable at program startup + X11: number of objects removed from containers could wrap negative + X11: allow translation tables + X11: initial window would "sweep" shut and reopen + micros: save and restore progress reports weren't appearing during save + and restore (they would appear immediately afterwards) + also error messages from dots aimed off right edge of screen + Atari: colors were not properly set in medium resolution + Atari: terminal size was set incorrectly after a ^Z + OS/2: HPFS support was incomplete *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes31.2 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,92 ---- + revived barbarians didn't gain levels from potions + pets wouldn't keep their armor or weapons (blessed figurine of Archon) + avoid "rot" v. "burn" damage for organics + identify +/- known rings/armor as "uncursed" + loop through identification as long as additional "charges" are available + successive disease attacks made you less sick, also make nurses cure sickness + NO_MAILREADER non-mail daemon message fix + make fortune cookies, pancakes yellow and lightning white + cavemen were red while cavewomen and all other characters were "domestic" + monsters might not change color when growing up + redisplay cancelled objects in case their color changed (potions, spellbooks) + ask if you want to play heard passtune + add: make ^T intrinsic teleports use magical energy + don't encase the Amulet (or invocation tools) inside cockatrice induced statues + fix eating taking 1 turn less than number necessary, cheating you of nutrition + fix inventory to avoid % in user-supplied names [pline(xprname())] + fix crash when #force destroys unpaid chest in shop + fix crash when movement reaches edge of screen on rogue level + fix crash when two items in a row vanish from magic bag + set bknown when Priests see item, fixing missing checks elsewhere + set alignment of priest's quest artifact to match priest's starting alignment + if the Mitre of Holiness gets stolen by the Wizard, reset int & wis stats + always unlock quest stairs whenever leader acknowledges quest completion + make mysterious force which locks quest stairs block objects as well as player + duplicate shopkeeper names were possible on town level + trying to rename shopkeepers left dangling pointers + credit balance can prevent Kop summoning when player leaves shop suddenly + suppress several shopkeeper messages (and buy|sell) is shk is asleep|paralyzed + using charged objects ((engrave) wands, horns of plenty, etc.) in shops was free + don't double bill for food eaten off shop floor (multi-turn to eat only) + fix to prevent unpaid objects differing only in price from merging (only in + inventory; they're not "unpaid" any more when dropped, so might merge) + missing #ifdef SOUNDS in vault.c + inconsistent MFLOPPY/MICRO use of dotcnt for saving + add: wands of striking break potions + add: directional healing spells + add: pickup_types option, pickup -> autopickup + disclosure option takes optional string value; killed counts and genocide list + give better message when trying to set options which are compiled out + add: hungry pets make begging noises + centaurs and mariliths could wear inappropriate armor + remove Medusa's tail and give her wings + separate creatures that don't breathe from creatures that can breathe water + you can't choke if you don't breathe + Fort Knox eels were placed outside moat + jellies for Juiblex, not Jabberwocks + don't heal while praying, so that gods are more likely to heal you + fix fireballs burning fire resistant players + floating eyes could paralyze monsters indefinitely + fix monster sleep/wakeup induced my musical instruments + players hit by wands of sleep get chance to wake up when attacked by monster + iron balls keep their "very heavy" weight + fix vorpal blade/long worm misses + allow monsters to kill players with vorpal blade and tsurugi + fix objects falling through trapdoors; "shipping destination"'s overloaded use + of obj coordinates could cause bogus screen update attempt (y >= ROWNO) + prevent bad argument to rnl() from prayer_done() when praying in gehennom + display message when boulder is pushed into pit + avoid monsters deciding displaced or invisible characters were off the screen + kicking embedded objects loose would break fobj chain (-> freeobj() panic) + when using the cursor to look at remote objects, if the target object is + embedded in something, mention that fact + dropping gold inside a monster -> freeobj() panic + gold picked up by pets wasn't in mgold and thus didn't show up on probing + fix "stop *opening* the lock" even when you were locking it + succubus stealing ring of adornment caused crash if she already had one + monsters created by monster reading create monster didn't appear for scroll ID + monsters explicitly casting spells of sleep or cold had messages reversed + elf character could get impossible("snow boots not found?") stepping onto ice + accept gray/grey except for spellbooks + keep monsters from teleporting on no-teleport levels + don't allow digging of trapdoors on the three wizard levels + don't allow digging down (including drum of earthquake) to destroy portals + fix digging down from within walls and solid rock; monsters could enter + the resulting trapdoor/pit, but players couldn't + fix digging down while flying; don't fall through + destroy any engraving if a hole is dug down thru it, or ice it's in gets melted + change many hardcoded "floor"s and a few "ground"s to use actual surface type + fix blessed unicorn horn's restore ability feature (strength gain when weak) + underwater: prevent turbulence from placing character inside solid wall + underwater: suppress "you inhale water" message when removing amulet of + magical breathing if you're polymorphed into a swimmer or nonbreather + when using the 'A' command to take off armor from underneath other armor, + account for time needed to take off and put back on outer garment(s) + don't create doors over pits and trap doors when using a wand of locking + fix mapping when you drop objects while following the guard out of a vault + + X11: some status didn't show up after restore + UNIX: fix potential security hole accessing file through NETHACKOPTIONS setuid + VMS: disable installed privileges when assigning i/o channel to terminal, + opening termcap, or accessing user-specified config file + Amiga: invalid showscore and numberpad options inserted by frontend *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes31.3 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,22 ---- + avoid divide by zero crash for eggs produced from horn of plenty + prevent monsters from eating the invocation tools or Rider corpses + make artifacts much less likely to be destroyed + fix freezing lava in front a raised drawbridge + fix digging pits in front of raised drawbridge; improve digging next to pools + since random teleports have no --More-- prompt, have them purge REDO data + to avoid repeating previous command before noticing changed context + make magic portals function for monsters + make numerous priest blessings increasingly rare, with an upper limit + fix missing quotation marks in quest speech + prevent monsters like killer bees from opening tins + add: keep track of # player deaths, save game start time in struct u + don't used "uncursed" with gold in containers in ending inventory display + + PC: Fix black/gray/white display problem + + X11: set input text portion of the dialog box so it is the width of the box + X11: fix message window seperator redraw problem (thanks to + Ivan D. Brawley ) + VMS: avoid false "trickery" detection for bonesX#.##;1 levels + VMS: prevent display of really long broadcast messages from clobbering stack + VMS: prevent endless input loop upon remote terminal disconnect *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes32.0 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,344 ---- + protect the Amulet and invocation tools from being destroyed when a + disintegrated monster's inventory gets deleted + prevent the Amulet and invocation tools from being buried, similar to box + behavior (Book of the Dead would rot away as paper when buried) + don't let polymorphed players eat any of the invocation tools + pets are no longer highlighted when hallucinating + keep glass gems from shattering in chests + return errors from dgn_comp and lev_comp when called for + fix hallucinated fruit juice message + fix several monsters conveying inappropriate resistances + fix misspellings of "Assassins' Guild" and "Minion of Huhetotl" + set personal name flag for Pelias and Thoth Amon; clear it for Chromatic Dragon + don't say "Picking the lock..." when using a skeleton key + give feedback when applying key to current location but no boxes are present + can't manipulate floor locks (chests) while levitating + don't crash onto sink if permanently levitating due to eating a ring + avoid resuming interrupted lock operation on chest that's been polymorphed + wide-angle disintegration Beams O' Wrath disintegrate non-resistant + shields and armor + don't access zapped wand after it's been destroyed by divine lightning bolt + separate graphics symbols for each trap, differently-colored traps + allow wishes for greased objects, correct wishes for "poisoned + rustproof" objects + damage was calculated incorrectly when hitting with statues and boulders + allow digging to finish when digging statues embedded in undiggable walls + list identified invocation tools as "the item" instead of "a item" + ignore rknown for unerodable objects when determining if it's fully identified + flush output after eating mimic so '$' appears right away + update botl for spell power after ^T or #invoke of "energy boost" artifact + correct hunger check when casting spells + correct various messages + fix deliberately jumping into Stronghold trap doors + make random level changes while escaping with Amulet more equitable + when mysterious force randomly picks a location on the current level, send + player into Wizard's tower if and only if already inside that tower + any level change from one tower level to another preserves occupancy state + mysterious force won't kick in when using portal to go up into Wizard's tower + avoid "bad cursor position" situation when mystery force or cursed gain + level potion causes level change within the Wizard's tower + don't allow the Wizard to be resurrected on the Astral level + only list "likely" objects when prompting for what to #invoke + reset encumbrance and movement rate during successful prayer, in case it + cures lycanthropy + prevent cursed weapon that slips when thrown by monster from embedding in stone + ki-rin is not humanoid + all elves can see invisible + gain intrinisics from eating amulets + lose divine protection by killing co-aligned priests or converting alignment + have quest leader check for absolute alignment as well as for piousness + fix tombstone message when dying from kicking door while levitating + bite, &c. attacks on displaced images said "swings wildly and misses" + calculate score before creating bones, otherwise gold in bags gets overlooked + Unique monsters no longer placed in bones files + for blessed genocide, don't report failure for other classes' quest monsters + could get both compressed and uncompressed explore mode save files + ZEROCOMP's bwrite ignored possibility of write failure + mimics imitating fruit caused "Bad fruit #0" on help commands + fix off by one bug in level teleport trap destination for monsters + if g.cube eats a non-empty container, engulf contents rather than devour them + allow wizard to use blessed genocide of '*' to wipe out all monsters on level + when digging a hole in ice, don't describe it as digging in the "floor" + and unearth any objects buried there even when it refills with water + when digging in a pit trap which ends up filling with water instead of + becoming trap door, remove the trap; likewise for overflowing fountains + can't dig pits under drawbridge portcullis; break bridge if hole would be made + can't dig while caught in a web + don't "swing your pick-axe through thin air" if target location is a web + mark webs as seen when "monster is caught in a web" message is given + whirly monsters pass through webs; some huge monsters tear them + Sting cuts through webs + have shk use plural if called for when referring to player's pick-axe(s) + fix price stated by shk when picking up container holding merged items + fix price stated by shk for #chat when standing on a container + don't adjust food price due to hunger when player is selling, only when buying + don't double bill shop corpses turned into tins + don't make mundane objects known when they're outside the shk's expertise + change to have shks possibly identify items sold for credit just like for cash + when player sells something to broke shk for credit, don't offer more for it + in credit than will be charged for it if player buys the item back + when selling items in shop, don't try to adjust message/prompt based on COLNO + when dying in shop entrance, make sure inventory in bones data is placed all + the way inside the shop, hence owned by the shk + make shk notice when shop door destroyed by wand or spell or digging downward + reset unpaid objects if shk poly'd into jumpy monster teleports out of shop + fix handling for shop objects kicked or thrown from one shop into another + and for shop objects hit by cancellation beam + add potions of oil; lamps can be refilled with them + dipping rusty weapons in potions of oil removes rust + allowing drinking from surrounding water if you are underwater + fix non-merging potions of water due to water damage's incompatible dilution + fix mon-merging scrolls of blank paper due to SCR_SCARE_MONSTER's spe usage + fix D(ropping) subset of wielded darts,&c (worn mask got out of synch) + fix #adjust merging wielded darts,&c into non-wielded ones + allow #adjust when fixinv option disabled + fix getobj's '?' help displaying one item when fixinv option disabled + don't give characters with maxed out luck complete immunity to water damage + don't allow AC -17 or better to provide invulnerability to zap attacks + kicking cockatrices while barefooted will stone you + change to inhibit displacement from operating through solid walls + fix mblinded assignment for monsters hit by potion fumes + give runesword same damage adjustments as broadsword + extra verbosity for attacks caused by Stormbringer + allow ghosts to step on garlic + don't let vampires step on altars + don't let monsters jump into polymorph traps covered by boulders, unless + they can carry such, pass through, or squeeze under + giants polymorphed into something else must drop any boulders being carried + giants in pits become untrapped if a boulder is pushed in + prevent traps from being generated on ladders + don't "detect trigger hidden in soil" for previously detected land mine + exploding and crashing doors wake up nearby monsters + factor rings of increase damage into kicking damage + handle omitted case for ball movement that would leave chain in odd position + returning to stairs on top row of map is valid (fixes rogue quest bug) + avoid giving "sad feeling" message for pet if lifesaving prevents its death + don't rot away Rider's corpse if something is standing on it at revival time + kill any engulfer (including poly'd player) trying to digest a Rider + give Riders non-zero nutritional value so tinning kit doesn't ignore them + save & restore u.usick_cause properly + an eating pet can continue & finish eating while you're off its level + fix object names: "a Dark One corpse", "statue of a Wizard of Yendor" + killer_format: poisoned "by Pestilence", not "by a Pestilence"; ditto Juiblex + killer prefix might be wrong after having been life-saved + fix to avoid "invisible invisible {Priest|Minion of Whoever}" on tombstone + fix bug with cold-resistant monsters attacking jellies (etc.) + fix possible panics when restoring while swallowed or held + when taming, make holder/swallower let go even if it just becomes peaceful + reset area of visibility when hurtling backwards from recoil while levitating + don't let hostile monsters who follow up/down stairs share final ascension + add bodypart(HAIR) to correct some inappropriate messages + display monsters inventory (if any) when mon zapped with wand of probing + display inventory of encased items in statues zapped with wand of probing + display inventory of buried items below, by zapping wand of probing downwards + set dknown bit for all objects hit by probing beam + add ceiling function to alter the ceiling messages appropriately + fix 3.1.2's fix for reseting certain class-specific artifact properties + add selection menus to pickup and some apply functions + pre-menu container interface: don't let "%a" select all objects if no food + is present; make user's " a" become "A" instead + wake up monsters hit by potions thrown by other monsters + suppress vault hint messages if player is in the vault + make lev_comp check full object and monster names ([ring of] "protection" in + objects[] was matching "protection from shape changers" in .des file) + guarantee that stairs down from Juiblex swamp level always get created + [sometimes got impossible("couldn't place lregion type 0")] + prevent a three room level which has the stairs to the mines from also having + a special room [so that those stairs can't end up placed in a shop] + allow quest nemeses and other invocation tool guardians to wield artifacts + Mitre of Holiness is not a weapon + don't give "heat and smoke are gone" message when entering Vlad's tower if + arriving from somewhere other than Gehennom (portal via W's quest arti) + when a wielded cockatrice corpse rots away, set `unweapon' so that + further combat will elicit "bashing with gloved hands" message + fix behaviour of wielded eggs (breaking, stoning, etc) + tiny chance for "queen bee" eggs, rather than always killer bee eggs + change Tourist quest home base to Ankh-Morpork + prevent activated statue traps from creating hidden monsters + handle activated statue being the only object poly'd player is hiding under + prevent reference to unseen underwater object when hiding monster attacks + don't pluralize name when smelling opened tin of unique monster's meat + make tins of unique monster's meat be empty in bones file + don't leave a corpse in bones file if killed by disintegration breath + don't leave a corpse when monsters disintegrate other monsters + any food could be tinned (yielding giant ant meat) when corpse in inventory + destroy all boulders in invocation area when creating stairs down to sanctum + boulders landing on previously seen trapdoors will plug them instead of + falling through or settling on top + boulders on ice which gets melted will fill pool as if dropped + don't let dead or sleeping priests give temple greetings + chatting wakes up sleeping priests + don't exercise wisdom when making prediscovered objects known during init + don't generate any generic giants (mummy/zombie placeholder) on castle level + pets and g.cubes will polymorph if they eat chameleon corpses + slippery ice (temporary fumbling) only lasts until the next move + avoid leash limbo if quest leader ejects you while leashed pet's not adjacent + (ditto other unconventional level changes, like W's quest artifact) + release attached leash if poly'd player eats it + crash fix: handle other forms of monster-induced level change besides quest + ejection (swallower expels onto portal, level teleporter, trap door) + fix magic mapping of previously mapped maze walls dug away out of view + assorted drawbridge fixes (kill credit, auto-pickup, drown survival handling) + passtune becomes fully known once successfully played + wiping out engravings leaves partial letters + wipe random letters of trap engravings ("ad aerarium", "Vlad was here") + eating wolfsbane while in werecritter form rehumanizes in addition to purifying + don't penalize player (shop charges in general; bad luck for mirror) when + a monster breaks something with a wand of striking + when loading bones, keep track of unique monsters to avoid their duplication + don't allow a demon prince to summon two copies of a unique demon lord + enlightenment luck display ("extra", "reduced") did not agree with actual luck + avoid duplicate spellbooks in character's initial inventory (affects priest) + fix pets moving reluctantly onto cursed objects + can't #loot while overtaxed + time passes when items disappear on use of a cursed bag of holding + #offer cannot convert or destroy an unaligned altar + MUSEr's reflecting shield or amulet shouldn't become known when not seen + fix check for wearing shield when monsters wield two-handed weapons + don't restrict MUSE scimitar usage to strong monsters + make dwarves less eager to switch back and forth between weapon and pick-axe + clip swallow display at left & right map borders + prevent recoil [hurtle() while levitating] when caught in a trap + downward zap which freezes water or lava shouldn't bounce back up + Vorpal Blade: don't let damage penalty (very low strength, negatively charged + ring of increase damage) prevent beheaded monster from dying + make sure player polymorphed into jabberwock is vulnerable to beheading + make sure that when "The fiery blade burns the shade!" that it actually does + damage (double-damage for non-silver must do at least 1hp damage) + prevent divide by zero crash when hitting tame shade with non-silver weapon + don't lose alignment when throwing gems to/at peaceful unicorns + don't apply grease to worn armor if it's covered by other armor + fix unnaming monsters via `C ' + fix calling object types via `#name n ' + fix off by one problem when shuffling some descriptions (scroll label "KIRJE" + and "thick" spellbook never used; breathing amulet always "octagonal") + exploding land mines can scatter or destroy objects at the trap location + add rolling boulder traps + try harder to make monster hit point and level gain avoid anomalous losses + reduce odds of undead corpses on castle level and priest quest home level, + to make it harder to lure wraiths to more favorable spot + can't polymorph large piles of rocks into gems + hit point gain from nurse healing throttled substantially + make cursed bells be much less effective as instruments of abuse + fully implement object charges for Bell of Opening + allow '%' as destination on rogue level when specifying position by map feature + fire traps can burn up scrolls and spellbooks on the floor + fix inverted cancellation check for AD_SLOW and AD_DREN damage + bullwhips can be applied to disarm monsters and hero + bullwhips can be applied by hero to haul themself out of a pit + ensure that thrown potions hit their mark if you are swallowed + attempting to engrave on an altar causes altar_wrath + differentiate between a hole and a trapdoor, digging always makes a hole + check the right hit point values when polymorphed and encumbered + improve guard behaviour in vaults when player is blind + prevent dwarves from digging while wielding cursed weapons + displacing a pet mimic unhides it + '(' shows the proper tools as in use + improve shk's handling of pick-axe damage and taming + aging of items in ice boxes left in bones files + fix genocide of '@' while polymorphed + add gender to some unique monsters + disallow digging down while phasing through non-diggable walls + general fixes to various message sequencing problems + prevent shopkeeper names from showing up while you are hallucinating + prevent paralyzed pets from picking up items + jellies for Juiblex, not Jabberwocks (done properly this time) + rust monsters can't eat rustproofed objects + general fixes to inventory merging of items + monster inventory undergoes merging too; potentially affects probing and theft + monsters ignore items they want to pick up that are on 'Elbereth' + bows wielded by monsters now do proper (low) damage + even nymphs may not pick up rider corpses + treat cockatrice corpses in multiple item piles the same as one item piles + "PACKORDER" feedback incorrect on parsing failure + you can no longer choke on liquid + stethoscope on secret doors displays properly when blind + monster-hurled potions no longer produce quaff messages (or djinn) + giant eels now hide with mundetected, not invisibility + eels on the plane of water don't hide and aren't negatively impacted by being + out of water + don't give the big point bonus for eels if player is wearing breathing amulet + fix display bug (newsym after Wait! message) + temple priests now wear their cloaks + Orcus is no longer peaceful (had been made so by bad bribery check) + 'uskin' save and restore done properly + don't improperly adjust int & wis for stolen non-worn P quest artifact + don't allow Vorpal Blade to behead a monster when it swallowed you + golems are not living and don't "die" in messages + fix "Rocky solidifies. Now it's Rocky!" + polymorphing into a flesh golem, which gets petrified by turning into a stone + golem, now works when stoned + correct "killed by a died" + allow the Wizard to come back and harass at his next reincarnation time even + if he's been left alive on some other level (fixes "paralysis" cheat) + make monsters subject to "mysterious force" in Gehnnom while climbing stairs + with the Amulet, so that once the Wizard has stolen it, his retreat + when wounded doesn't become an easy way to carry it up + changing attributes immediately checks encumber messages + confused monsters get confused SCR_TELEPORTATION effects + fixed "choked on eating too rich a meal" + kicked objects won't stop at stairs if they don't fall + general fixes to stealing from monster carrying cockatrice corpse + a nymph who polymorphs herself while you're frozen during a multi-turn armor + theft can't complete the theft if transformed into non-stealer monster + consistent corpse probability no matter what killed monster (also removes a + loophole allowing permanent rider death) + MUSE monsters no longer wield weapon same as (not better than) current one + incubi/succubi have hands, not claws + make #jump be ineffective on air and water levels + allow multiple sickness causes; vomiting only cures those involving food + #prayer reward: give books for not-yet-known spells preference to known ones + marker use no longer uses wishing interface, fixing several obscure bugs + archeologists' and rogues' initial sack starts out empty + candelabra "has now" 7 candles fixed. + kicked objects would set dknown when the kick caused an injury, even though + safely kicked objects wouldn't + make cloaks subject to burning + make exposed shirts subject to burning and rotting; greased ones defend + against wrap attacks + all types of fire damage affect worn armor [adds explosions, fire traps, and + zapping yourself to previously handled zap/breath attacks by monsters] + for explosions, destroy carried objects before killing player [affects bones] + replace triggered land mine with pit before doing damage [bones] + black dragon breath no longer referred to as "death" instead of disintegration + don't make ring of gain strength known when gauntlets of power mask its effect + can't have "slippery minor currents" or similar silly nohands body parts + proper support for polymorphed players using wrap attacks + cannibalism reduces luck as well as causing aggravation + picking up an item which will merge works even when all 52 slots in use + moving through diagonal openings checks how much you're carrying, not how much + free space you have left + monsters have same restrictions as players moving through diagonal openings + picking up subset of heavy group works for picking one and gets feedback right + taking subset of heavy merged group out of containers works the same as + picking up subset of heavy merged group from floor + when putting gold into containers, don't count its weight twice, thereby + messing up the status line's encumbrance feedback + fix the option parser's handling of attempting to negate string values + teleporting a monster on a trap with a magic whistle sets the trap off + iron ball dragging no longer confuses autopickup + cumulative temporary intrinsic increments can't spill over into permanent bits + eating food shouldn't give messages for intermediate states + don't make wand of death become known after casting finger of death at yourself + ignore case when checking artifacts against wish- or #name-specified name + ignore confusion when reading scrolls of mail + exploding runes for spellbook read failure doesn't imply that book explodes + divine rescue from strangling destroys worn amulet of strangulation + boulders pushed on level teleporters will level teleport; also, make one random + level teleport function to keep all level teleports consistent + + MSDOS: add fake mail daemon + MSDOS: add VGA tiles to tty port + VMS: switch to lint-free, non-GPL'd termcap support code + X11: map behind popup edges was occasionally not refreshed + X11: allow permanent inventory window + X11: when using tiles, highlight pets with "heart" overlay (should be changed + to honor the `hilite_pet' run-time option) + X11: click-in-message-windows crash fixed + tty: fix panic when freeing endwin + tty: fix behavior when recalled text needs to wrap beyond top line + tty: allow selection from single line "help menu" (getobj's '?' response) + tty: don't format data.base with hardcoded tabs that are ugly on non-tty ports + tty: get rid of extra NHW_MENU space (improperly added when the menu was longer + than the screen) + tty: fix repeated "who are you?" prompting at game startup *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes32.1 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,133 ---- + General Fixes and Modified Features + ----------------------------------- + give invocation message when teleporting onto invocation position + flying players with water breathing may retrieve things from water + remove message inconsistently assuming players can be mindless + monsters wear best armor (not first armor) and may switch armors + god doesn't give "strayed" message when your god is angry but a different god + is the one giving the message + divine wrath can hit engulfer if you are swallowed + plug minor topten and oracle memory leaks + monster throwing must allow for 0 damage (cream pies, non-silver vs. shades) + break drawbridge if wand of striking is zapped down at open bridge or either + up or down at its portcullis + wand of striking zapped at ceiling might cause a rock to drop (like digging) + wand of striking hitting a secret door with expose and break it + zapping {teleportation,cancellation,make invisible,polymorph} down affects + any existing engraving similarly to writing with such wands + monsters may use fire horns and frost horns + Guidebook.mn now formats backslashes correctly when using GNU groff tools + Add missing trident case to weapon type categorization. + Fix weapon proficiency handling for missiles. + accept "armour" spelling again for marker use (when writing was disconnected + from wishing, this got lost) + restrict writing scrolls and books by description + give better feedback for some writing results + whirly/wall-passing monsters should not be immune to falling rocks + relearn spellbook even when spell already known (object amnesia fix) + objects that have been called something but not ID'd are subject to amnesia + ask what to call unknown spellbook which crumbles to dust when mis-read + bullwhip only tries to get you out of a pit when you're in a pit + humanoids, gnomes, and ogres now eat; fungi and jellies don't + centaurs, giants, and various others can respond to #chat + potion of paralysis doesn't inherit prior nomovemsg + #naming a nameable artifact when the object already had a name of the same + length didn't create an artifact + applying unID'd potion of oil is possible even not carrying any other items + eligible to be applied + make potion of oil become known after lighting it via apply + fix remaining inconsistency which allowed diluted water + don't let breaking a wand of digging on castle level produce holes, just pits + make Nazgul's sleep gas actually put victims temporarily to sleep + applying a carried, unlocked, trapped chest will set off the trap + explosion due to #untrap failure on trapped door destroys it + shouldn't hear curse/bless status of unseen scroll being read by monster + give some variation in the amount of time it takes a corpse to rot away + breakable objects hitting the ceiling or the hero's head will now break + undead turning now gives credit to player for destroyed monsters + undead turning now brings dead eggs back to hatchable status + code added to support hatching of all eggs in a merged group of eggs + fix display updating at egg's former location when floor egg hatches + fix learning of egg type for hatched eggs + statue traps created with monster inventory inside them + probing shows contents of everything with contents, not just statues + spells of healing and extra healing don't make target monster angry + use cornuthaum cancellation factor + can't kick underwater objects from land or vice versa + objects falling through holes/trapdoors to random destinations obey arrival + restrictions imposed by special levels + being bare-handed counts as wrong projector when throwing projectiles + reduce the range that Mjollnir can be thrown + keep Medusa from continuing to move after she's been killed by reflection + of her own gaze (fixes relmon panic) + medusa's reflected gaze won't affect it if it has amulet/shield of reflection + eating amulet of strangulation can choke when not satiated; also not gluttony + intelligent pets hold onto one pick-axe and one unicorn horn + keep exploding boulders from land mines from hitting you with "a rocks" + objects carried by migrating monsters have no location + more robust parsing of user-supplied option names; trailing characters matter + don't generate spellbooks inside statues of tiny monsters + treat Medusa level statues as petrified monsters (can't be stone-resistant, + and have inventory) + Medusa doesn't gaze more than once per round + data.base: eliminate duplication of Orcrist/goblin king entry + handle luck conferring artifacts correctly (both inventory and enlightenment) + prevent arming land mines and bear traps in various inappropriate locations + prevent easy shop exit by having shopkeeper disarm and pick up trap objects + oilskin cloaks allow defender to slip away from grabbing attacker + make reading the cursed Book of the Dead riskier + enchanting stat-affecting armor now identifies it + fix crash caused by specifying "pickup_types" without a value in config file + or NETHACKOPTIONS (avoid attempt to use menu prior to interface init) + kicking at empty lit corridor with lit_corridor enabled doesn't redraw as unlit + when starting out with an oil lamp, make pre-discovered potions of oil show up + in the discoveries list so that their varying description is available + being crowned Hand of Elbereth enables minimal longsword proficiency even when + Excalibur isn't bestowed + bare-handed and martial arts weapon skill rankings use names instead of numbers + + + Platform- and/or Interface-Specific Fixes + ----------------------------------------- + tty: reduce alloc/free activity done for message history + tty: windowtype:unsupported_value pauses between listing allowed value(s) + and proceding under default interface + X11: free allocated memory during pre-exit cleanup + X11: display help when DLB is enabled + X11: fix popup inventory window shown for 'i' response to "what type of + object?" prompt with menustyle={T,C} + DLB: avoid excessive fseek calls (major performance hit for MSDOS) + MFLOPPY: wasn't safe to enter endgame! traps, timers, and other level- + specific data ended up being inherited from level 1 + MSDOS: now can re-enter game after chdir'ing in shell from "!" + MSDOS: fix it so -H allows starting a healer game, rather than usage statement + MSDOS: display cursor during input prompts, not just when in the map + MSDOS: fix several cursor-related glitches when moving the display + MSDOS: prevent the use of F3,F4, and F5 before the map window is ready + MSDOS: make flags.BIOS and flags.rawio the default when VGA tiles are used + TERMINFO: colors were wrong for some systems, such as Linux + Amiga: count substitute tiles properly + MAC: avoid MW 68K struct copy optimization bug (in all developer releases up + to and including DR9) by adjusting our structures so it doesn't + occur + MAC: fix crash when trying to drag scrollbar + MAC: add UPP setup for UserItem FrameItem() + MAC: boost partitions to 2M minimum + + + General New Features + -------------------- + #qualifications command eliminated; subsumed into #enhance + OEXTRA temporary compile-time option + menu support for group accelerators to choose objects by class + lev_comp supports specification of percentage chance for monsters and objects + wielding Sunsword provides protection from light-induced blindness + interactive setting of options via menu (Per Liboriussen, liborius@daimi.aau.dk) + + + Platform- and/or Interface-Specific New Features + ------------------------------------------------ + MSDOS: Add support for preloading all tiles in protected mode environments + MSDOS: Add support and initial tty Makefile for yet another compiler (Symantec) + BeOS: preliminary support for new BeBox platform; initially tty only + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes32.2 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,128 ---- + General Fixes and Modified Features + ----------------------------------- + make `recover' work with the additional element of version info added in 3.2.1 + floating eyes cannot escape down stairs and ladders + do not use body_part() inappropriately when snatching monster's weapon + fix feedback for a confused long worm attacking itself + avoid converting locked secret door into closed+locked normal door; + doors should be flagged as either locked or closed but not both + kicking a locked secret door mustn't yield an open normal door + fixes for dipping weapons into potions of oil + fix crash triggered when knocking off worn blindfold by applying cursed towel + update screen display for vault guard picking up gold from fake corridor + Chromatic Dragon was missing appropriate resistances for orange (sleep) and + yellow (acid + stoning) dragons + when triggering a chest trap, clear the trap flag immediately [bones fodder] + when a boulder gets pushed into a pit where a monster is trapped, immediately + redisplay the monster after giving messages + rings of hunger dropped in sinks should have an effect even if player is blind + player #offering a cockatrice corpse must pass a touch check + hitting a rust monster with a pick-axe, iron ball, or chain will trigger rust + damage to the weapon; ditto for rust traps when wielding such items + cosmetic martial arts and bare-handed changes to skill arrays in u_init.c + gain or lose weapon skill slots appropriately when polymorph into new person + fix crash occuring when self-hit by uncaught boomerang + when delivering a pline message during level change, don't display areas of + the new level using line-of-sight data from the old one + heavy iron balls may be thrown multiple spaces (presumably they roll), + restoring old ball behavior + get rid of "non-null minvent despite MM_NOINVENT" warning + prevent a negative damage adjustment from boosting a target monster's HP + give "bashing" message when first attacking something with unconventional + wielded items besides just throwing weapons and non-weapon tools + when restoring, reset weapon so that "bashing" message can be given again + hole traps in bones data shouldn't be marked as unseen + when carrying 52 items, don't check shop goods for mergability with invent + because it will give false matches, yielding non-gold in slot '#' + kicking a cockatrice corpse is now as dangerous as kicking a live cockatrice + fix set_apparxy() crash when the Wizard returns via migrating monster list + monster wearing armor is protected from disintegration breath like player + monster wearing amulet of life saving survives disintegration breath + greased helmets will block AD_DRIN attacks + get rid of ancient check for welded weapons, which arbitrarily named or didn't + name the weapon for no particular reason. + levitation: sitting makes you tumble, kicking requires bracing + empty bag of tricks won't cause bag of holding to explode + prevent "force bolt" from hitting false match on *orc* data.base entry + prevent "{wand,scroll,spellbook} of light" from matching "* light" entry + non-confused genocide of player should not kill by "genocidal confusion" + re-word message for monster grasping already-wielded unicorn horn + fix various killer reasons + when pushing boulders, make sure current is always top object at its location + always clear unpaid items off shop bill when shk is teleported away, even + if shk was already angry + don't let broken wand of digging create traps at locations which already + have traps (prevent it from turning a hole into a pit) + don't give messages about unseen objects falling down holes + fix to prevent kicked objects which stop on holes/downstairs from becoming + unattached from any object list + don't let flying creatures set off a rolling boulder trap + fix to prevent seeing into a room by kicking an undiscovered locked secret + door from outside + account for case of monster throwing gem at PC unicorn + schedule repair for shop door smashed by big monster + update status line for energy used when "you fail to cast the spell correctly" + polymorphed character will mimic gold after eating mimic corpse + fix relmon panic when bashing weak undead with wielded potion of holy water + holy and unholy water can trigger transformation in werecritters + call update_inventory() when discovering or undiscovering (call " ") an object + fix goto_level panic: if quest leader seals portal, delete portal trap from + quest home level as well as from main dungeon's branch level [possible + return to quest via 'W' quest artifact] + prefix quest leader and/or nemesis name with "the" when appropriate at + run-time rather than using hard-coded text in quest.txt + fix endgame crash caused by string overflow when formatting priest|minion names + dokick.c compiles when WEAPON_SKILLS is disabled + burning objects go out when kicked + monsters with arms but not legs (salamander, marilith) can't kick + knights can't jump while poly'd into anything without legs + try harder to get names for corpses of unique monsters right + very high dexterity doesn't guarantee a hit for thrown potions and eggs + blinding ammo thrown from inside an engulfer can't blind it + monsters going through endgame portals arrive in same area as the player + instead of ending up at the portal to the next level + treat most of the moat on fakewiz levels as outside the special central + area, so that falling or wading into the water and auto-teleporting + out of it can't strand the character inside the room + monsters created by animating a named figurine will inherit that name + prevent possible player-controlled creation of unique monsters via tossing + statues of such onto statue trap locations + activating a statue trap with wand or pick-axe won't discard statue contents + cursed non-weapons can't slip when thrown, as it was in 3.1.x + don't reveal patron deity of high priests with the 'C' command's prompt + two flags structures now, flags and iflags, the latter not saved with the game + object name prefix buffer wasn't big enough for biggest possible case + negatively enchanted weapons thrown by monsters could do negative damage + prevent xorns from phazing through walls on astral level + live Wizard won't teleport to your level if he's carrying the Amulet + can't use 'C' to give the Wizard a name + fix charging for shop goods broken via striking/force bolt + prevent disintegration breath from destroying Famine and Pestilence + and from triggering impossible("monster with zero hp?") for Death + prevent attached ball and/or chain from becoming part of iron golem formed + during polypiling (ball & chain movement later accessed freed memory, + which either crashed or got "remove_object: obj not on floor" panic) + + + Platform- and/or Interface-Specific Fixes + ----------------------------------------- + Mac: update `mrecover' + Mac: handle `-@' character name suffix for explicitly requesting random role + msdos: suppress tiles on rogue level when restoring games that were saved there + tty: support group accelerators for PICK_ONE menus + tty: after at a yn() prompt, don't blindly accept the character + used to get back to the prompt as the yn() result [could trigger + impossible("invalid sell response")] + Unix+tty: guard against problems with delay_output,TRUE/FALSE macros + X11: fix group accelerators and support them for PICK_ONE menus + X11: implement tty-style counts for menu selections + X11: proper pop-up placement with old-style window managers (eg X11R6 twm) + + + General New Features + -------------------- + + + Platform- and/or Interface-Specific New Features + ------------------------------------------------ + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes32.3 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,30 ---- + General Fixes and Modified Features + ----------------------------------- + Y2K fix: use 4 digit year values for the dates in the score file + updated COPYRIGHT_BANNER_A to reflect year of release + prevent "late" pline calls from triggering a crash when the RIP window was + displayed at end of game (observed when bones file rename failure + under Win95 was reported to wizard mode users) + being punished on the Plane of Water doesn't trigger a panic when air bubbles + try to move the ball&chain or you around + avoid rn2(0) divide by 0 for empty inventory when trying to crawl out of water + don't let randomly placed monsters on special levels prevent explicitly + placed monsters who target that location from being created (a web + trap's spider resulted in no quest nemesis) + don't let randomly placed stairs on special levels be covered by explicitly + placed features such as fountains + pager: guard against '%' in output from being treated as a printf formatting + directive (using '/' or ';' to look at food yields "% blah blah") + prayer result of ``escape from solid rock'' isn't inhibited by teleport + restrictions (attempting to fix all troubles got stuck in a loop) + report "file empty?" rather than "version mismatch" when that's the reason + why a data file fails its validation check + drum of earthquake can't destroy the high altars + + + Platform- and/or Interface-Specific Fixes + ----------------------------------------- + micro (assorted): readmail()--don't show fake mail text when blind; also, + update the "report bugs to" message to specify + msdos: fix missing $(INCL) in dependency in djgpp Makefile + mac: Will only dispatch events if the window system is initialized *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes33.0 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,372 ---- + General Fixes and Modified Features + ----------------------------------- + objects falling down a level don't cause everything at destination to scatter + randomize visible trap glyphs during hallucination + don't match statue entry when looking up statue trap [after trap detection] + do match statue entry when looking up "statue of a " when foo happens + to precede statue in the database; likewise for figurines + initialize random number generator before processing user configuration file + (random role selection always selected tourist) + support "character:X" and "role:X" in NETHACKOPTIONS as well as in config file + allow colon as an alternative to equals sign for `OPTIONS:whatever' and + equals sign as an alternative to colon for `pickup_types=?!="$' + make rndexp (blessed gain level) be safe for 16 bit integer configurations + don't add player's weapon proficiency bonus for weapon attacks by monsters + create quest artifact crystal balls with 5 charges instead of 0 + store ghost names in the same manner as other monster names (fix pet bug) + boost kobold shaman level to 2 (was 1, too low to ever cast a spell) + boost ogre king level to 9 (was 7, same as ogre lord) + throwing quest artifact to quest leader won't cause anger; also, artifact + will be caught and thrown back instead of being explicitly ignored + boost level of fake players in endgame to match their rank titles + don't lose odd hit points (integer division truncation) when splitting HP + for cloned monsters + update status line when cloning yourself halves your hit points + suppress clone's initial inventory for poly'd player just as for monsters + update the documention describing the O command + polyself: immediately update vision when reverting to human from eyeless form + use right pronoun when a mind flayer's attack is blocked by a monster's helmet + tins of lizard meat are never rotten, just like the corresponding corpses + tattered capes should not match ape entry in database + booze should not match ooze entry in database + lowered drawbridge should not match werecritter entry + lengthen option file line length to 4*BUFSZ + make zaps of death at polymorphed players work properly + change way invisibility works, add remembered invis monsters and 'F' command + don't list pick-axe and unicorn horn as likely candidates for charging + give more accurate message when nymph steals multi-turn armor from female char + fix splitting merged group of wielded weapons for menu mode version of #loot + if a buried container rots away, bury rather than destroy any contents + the 'W'ear command now only shows armor you can actually wear at this instant, + instead of all armor you're not currently wearing + wishing for a genocided monster egg gets a dead egg, not a generic egg + "Unfortunately it is still genocided" printed only if monster is in range + (particularly important for lifesaved monster genocided off-level). + message for monster growing into genocided monster only printed if in range + include number of attached candles when formatting candelabrum's name + support attaching already lit candles to candelabrum + range of candlelight varies with number of candles + dropping ring of hunger onto sink won't falsely claim that undestroyed objects + like the Amulet have vanished + winged gargoyle can't wear body armor + self probing and stethoscope display speed with same detail as enlightenment + throwing attacks can trigger reprisals similar to hand-to-hand and zap attacks + 'A' now works in dropping like when picking up + make setting bear traps and land mines be a multi-turn occupation + make lava be properly lit on special levels + add orig.female flag to handle E quest monster situation + clean up inconsistent quest text + in initial legacy message, use "goddess" when appropriate + allow FIRSTNEMESIS message to actually be printed + taking a peaceful monster's weapon with applied bullwhip will anger victim + applying an unpaid magic lamp will charge a low lighting fee instead of the + djinni release fee + teleporting a Rider will usually bring it near you instead of sending it away + Riders can open locked doors without a key, just like the Wizard + Riders, angels, and elves won't avoid stepping on Elbereth/scare monster when + deciding where to walk + Riders and angels will ignore the sanctuary effect of temples + mind flayers cannot suck out brains by hitting long worm tails + don't ignore object age when #offering a partially eaten corpse + inability to pick up is not as general as nolimbs (blobs may pick up with + pseudopods and purple worms by swallowing) + wishing for a magic lamp produces an oil lamp, not a no-charges, possibly lit, + magic lamp + blobs may not ooze under doors if their inventory can't be squeezed through + peaceful/tame monsters will not use bullwhips on the player + ghosts were not inheriting player gender in bones files + cannot wish for tins of untinnable (due to insubstantiality) monsters + flying monsters cannot fall down stairs + prevent divine retribution from destroying a wand which is being broken + fix resuming to read a spellbook which has become blank since the prior read + attempt got interrupted + make recharging cancelled wands behave like recharging other cancelled objects + prevent "late" pline calls from triggering a crash when the RIP window was + displayed at end of game (observed when bones file rename failure + under Win95 was reported to wizard mode users) + cannot shatter soft weapons (whips, rubber hoses) + being punished on the Plane of Water doesn't trigger a panic when air bubbles + try to move the ball&chain or you around + seen-invisible monsters are consistently visible but transparent, rather + than looking like normal monsters + kicked object message for hitting another object no longer claims it "stops" + kicked object hits objects (plural) if quan>1 but there is nothing else there + kicking an object which is embedded in a closed door behaves like one in rock + can't kick object out of a known pit, but could when pit hadn't been seen yet + pets, shopkeepers, unique monsters, trolls, and Riders retain + their characteristics when killed and brought back to life + being polymorphed into a black light makes you hallucination resistant + don't attempt to perform panic save if the game is already over + don't leave old game's timers, light sources, and shop data in place if + aborted restore attempt reverts to starting new game [eventual panic] + Magicbane carried by mplayers has a lower enchantment than other artifacts + if pets take longer to untame than to starve, make them go wild anyway + split up erosion to allow both rust and acid (or fire and rot) + rust/fire/corrosion/rot now work in all cases (monster/monster, monster/you) + upon arrival to quest, mark return portal as seen + can't be blinded by light while asleep + can't put boulders or big statues into containers + engulfers which engulf a pile engulf 'several objects' + polyself: use right set of hit points for hunger and strength loss + polyself: likewise when checking for troubles during prayer + polyself: stop mimicking gold immediately if shape change occurs + polyself: change monster type when sex change occurs for succubus or incubus + Y2K fix: use 4 digit year values for the dates in the score file + when changing levels, update the screen to show the new level sooner + when changing levels, a monster might displace you from the stairs upon arrival + petrify polymorphed player who has protected hands but is using a non-hand + attack on a cockatrice + fix bug where barehanded AT_WEAP by polymorphed player on cockatrice worked + prevent multiple purchases of clairvoyance at temple from overflowing the + intrinsic's timed subfield and becoming permanent + when cursed, greased or oilskin cloak might fail to protect against grabbing + when any corpse wielded by a monster rots away, unwield it to avoid "bad + monster weapon restore" + hallucination affects priest and minion names + don't try to make the word "aklys" singular + bullwhip can't yank welded weapon from target + eroded T-shirts now display the eroded shirt text consistently + fix "killed by kicking something weird" when kicking a fountain + disallow fruit names whose prefixes are valid for food (uncursed, numbers, etc.) + properly handle wishing for fruits which start with other prefixes + avoid rn2(0) divide by 0 for empty inventory when trying to crawl out of water + don't let randomly placed monsters on special levels prevent explicitly + placed monsters who target that location from being created (a web + trap's spider resulted in no quest nemesis) + don't let randomly placed stairs on special levels be covered by explicitly + placed features such as fountains + substitute random monsters when special level monsters have been genocided + fix intrinsic blockage by worn items so that wielding a mummy wrapping or + cornuthaum won't have the same special effect as wearing one + magic markers created via polymorphing tools are flagged as being recharged + unseen rust monster eating messages, and make tame rust monsters consistent + with wild ones with regard to rustproofed items + pager: guard against '%' in output from being treated as a printf formatting + directive (using '/' or ';' to look at food yields "% blah blah") + getpos: support shifted movement letters in number_pad as per help text + getpos: properly truncate diagonal movements at map edge + using #name to call an object type something could be used to distinguish + fake amulet of yendor (appeared in discoveries list) from real (didn't) + upon quest completion, leader now IDs quest artifact and also tells player + that Bell of Opening is necessary if character doesn't already have it + remove unwanted quote marks from quest message R 70 + make polymorphed objects be likely to retain magic state: non-magic items + usually yield other non-magic items, magic items yield magic ones + make artifact mirrors unlikely to break when used to hit monsters + make sure that nemeses don't leave corpses if the message says there's no body + fix wizard-mode problem with generating Master of Thieves (was singularizing it) + allow weapon-using monsters who ignore gems to throw darts + make flint stones be the preferred ammo for sling wielding monsters + gaining/losing telepathy via polymorph (i.e. mind flayer) redisplays monsters + prayer result of ``escape from solid rock'' isn't inhibited by teleport + restrictions (attempting to fix all troubles got stuck in a loop) + fix surviving level teleport to a negative destination from somewhere other + than the main dungeon (was corrupting the level maps) + surviving level teleport to a negative destination ("you float down to earth") + escapes the dungeon instead of arriving on level 1 + dying due to level teleport directly to heaven won't leave bones + kicking shades with blessed boots, punching with blessed gloves or when wearing + silver rings, does the appropriate damage to them + add artifacts to ending score and display + prevent used objects like scrolls and potions which immediately cause the + character's death from remaining in final inventory (disclosure+bones) + blessed genocide of '@' will list the player's role during genocide disclosure + moved skill definitions to their own file (skills.h) and embedded them in + the object table. + increased the maximum number of branches supported by dgn_comp. + increased the number of characters permitted in a role name. + the number of bits available for properties are expanded. + water demons should not chat about being freed. + since hallucinating players see monsters constantly change anyway, don't print + message when werecritter changes + artifacts which do fire/cold/electric damage to their targets can destroy + carried objects which are susceptible to that type of damage + some artifacts are now unaligned in order to be more accessible to all types + of characters + wizard mode ^F command reveals floor traps along with the map + pager: '/' was not finding data.base entries for shopkeepers, mimics, or + race/role spit when picking from the screen + small monsters like hobbits and gnome zombies couldn't wear cloaks/wraps + make sure non-erodable objects aren't eroded or erodeproof (could happen by + wishing or object polymorph) + consistently let iron non-weapons rust, etc. + handle more spelling variations ("boots of speed",&c) when granting wishes + fix 3.2.0 change which flags the castle and priest quest levels as graveyards + when stepping on a spot where "there are several objects here" (so many + objects that they aren't automatically shown to the user), report any + dungeon feature such as stairs just like when there are fewer objects + report "file empty?" rather than "version mismatch" when that's the reason + why a data file fails its validation check + to-hit bonuses don't accumulate for monsters with multiple weapon + attacks + skill definitions moved to skills.h + skills are stored in the objects[] table. + intrinsics and extrinsics are now >32 bit + number of roles no longer limited to 26 letters + renamed typename() to obj_typename() + add "You hear a nearby zap" when monster is close + fixed a bug that would print of "a Book of the Dead" instead of "The" + fixed a bug so there is no delay when a rolling boulder trap is + triggered completely out of sight + fixed emergency_disrobe() so it will drop gold + fixed a missing case that occurs (rarely) when praying during a + full moon and your god is very pleased + ask for confirmation before praying; no more accidental Alt-P + more guilt messages when you do something which lowers alignment + mplayers get more suitable equipment for their role + allow spaces before = in the options file + dragon scales/scale mail of all colors now work when worn by monsters (in + 3.2.x, only gray conferred any special benefit) + when shopkeeper takes cash from dead player's corpse, clear `been robbed' + status if there's enough gold to cover the amount so that next + player who loads level as bones data won't start out owing money + merged scrolls of scare monster crumble to dust together, matching the + existing feedback (was destroying one and leaving the rest) + properly disallow wishing for venom and allow wishing for iron balls by class + drum of earthquake can't destroy the high altars + potion of oil can't be ignited while underwater + zapping a wand of digging upwards while underwater won't dislodge a rock + from the ceiling + add "born" field so monster extinction limits the number created, not killed + allow "okonomiyaki", etc. to pluralize properly (Ranma 1/2 is popular) + fix off-by-one bug that disabled the check to see if you tried to name your + fruit after a previously existing corpse or egg + avoid a "glorkum" message if an object conveying a warning is stolen before + the warning message is delivered + flags.made_amulet flag was never being set + make sure proper message is given when tinning cockatrice while a flesh golem + fix punctuation on cancelled cobra's dry rattle message + leash cannot choke monsters that do not breathe + rothes are now brown, harder to confuse with much more powerful grey quadrupeds + defer level change for every schedule_goto() call, not just while monsters + are moving (player's move could cause an engulfer to expel character + onto a level changing trap, then attempt to access stale monster and + possibly trigger relmon panic or crash) + fix obscure worm bug which did not consider the tail tip to be visible. Bug + produced "You miss it" on 3.2 and a blatantly obvious 'I' in prerelease 3.3. + water prayer: treat already blessed potions as `other' rather than as `water' + water prayer: potions being blessed glow light blue rather than amber; + hallucination affects the color seen when changed potions glow + fix Death/Sandman #9 joke (should be 8) and make sure the message can be seen + zapping Death with wand of death multiple times could cause hit points to wrap + when pet attacks monster that attacks back, be sure it's in range (could be a + worm attacked on the tail) + + + Platform- and/or Interface-Specific Fixes + ----------------------------------------- + micro: -uwizard-{class} counts as -uwizard when allowing debug mode + micro (assorted): readmail()--don't show fake mail text when blind; also, + update the "report bugs to" message to specify devteam@nethack.org + msdos: fix overlay separations in weapon.c + msdos: fix problem breaking compile without REINCARNATION + msdos: fix dependency in djgpp Makefile (wintty.c -> hack.h) + tty: try to use terminfo sgr0 (aka termcap me) attribute to turn off all + text attributes, instead of just using "rmso" (aka "se") attribute. + tty: change name of nethack's termcap.h to be tcap.h + tty: ^P at a long prompt printed an extra newline (and then wrapped oddly) + tty: get repeat to work properly on extended commands + tty/ASCIIGRAPH: rogue level uses PC Rogue colors and symbols + nt: in TTY port, non-English keyboard layouts that depended on AltGr-+ sequence + were getting "Unknown command 'M-\'" for '\','@','$','{','[',']','}'. + tty and X11: avoid crashing trying to display long (>128 char) menu items + X11: avoid setuid install problems by changing uid to real uid while + opening the X11 connection. + unix: compress/uncompress detects failure of the compressor, such as for + filesystem full or missing compressor, and no longer deletes the + valid file. In the uncompress case, such as uncompressing the save + file, a message is generated as well. + dlb: handle situation where lseek(,,SEEK_END) doesn't yield the size of the + contents of a file (specifically, VMS "variable length" record format) + vms: install.com couldn't handle the `copy readonly files' step when DLB + wasn't enabled + mac: added unix tty-ish menu flexability + mac: stoped using OLDROUTINENAMES + mac: added dlb support + mac: Increased the maximum number of menu items, so the inventory + won't get cut off at the bottom. + mac: Changed the behavior of Cmd-Q so it uses the new #quit command. + mac: Will only dispatch events if the window system is initialized. + This fixes a bug that would crash the system if the user had an + invalid option in the NetHack Defaults file. + mac: Added an appropriate message when eating an apple. + mac: Change the askname dialog for the new role patch. + mac: Add a gray background to all dialogs. + mac: Replace some improper calls to InitCursor(). + mac: Remove a whole bunch of unused code. + mac: Added Balloon Help messages. + mac: Pop-up menus display the 3-letter file code instead of a single + letter. + mac: Pop-up menus and text item have a 3-dimensional look. + + + General New Features + -------------------- + incorporate the "wizard patch" + `#quit' command added + `*' command added; displays inventory of all equipment currently in use + add Stone To Flesh spell + wands eventually explode if rechaged too many times + show IDed Amulet of Yendor + invocation tools in own section of discoveries + list; likewise for IDed artifacts + add infravision + add Eyes of the Overworld + add lenses + split players race from role in life + cursed figurines cam spontaneously transform when carried + `in_use' struct obj field is unconditional rather than just #if !NO_SIGNAL + add the secondary weapon slot, e(x)change command, #twoweapon + command, and "pushweapon" option. + add the quiver slot, (Q)uiver command, (f)ire command, and + "autoquiver" option (defaults to false). + add the "pickup_burden" option which controls when the user + is asked for confirmation when picking up an item. + pole-weapons can be applied at a distance, and similarly used by monsters. + '/' command's pick-a-location input (getpos) supports shortcuts to bypass the + "more info?" prompt; ':' for '.'+'y', ',' for '.'+'n', ';' for ','+ESC + monsters can throw cockatrice eggs at players + prayer trouble "stuck in wall" takes boulders into consideration + crysknives can be "fixed" + vampires now #chat back + new monsters: chickatrice,pyrolisk,fox,coyote,winter wolf cub,dingo, + gas spore,flaming sphere,shocking sphere,lynx,panther,raven, + glass piercer,mastodon,woodchuck,centipede,master mind flayer, + pony,horse,warhorse,silver dragon,lichen,storm giant,arch-lich, + dwarf mummy,green slime,disenchanter,monkey,dwarf zombie,ghoul, + paper golem, gold golem,glass golem,prisoner,jellyfish,piranha, + shark + new objects: amulet of unchanging,silver dagger,silver spear, + silver dragon scales/mail,robe,alchemy smock,kicking boots, + kelp frond,eucalyptus leaf,scroll of earth,spell of drain life, + potion of acid,potion of full healing,potion of polymorph, + potion of sleeping,ring of free action,ring of gain constitution, + ring of increase accuracy,ring of slow digestion,grappling hook, + ring of sustain ability,wand of enlightenment,saddle,various gems + add Monk role + the old Elf role is replaced by the Ranger + add Human, Elf, Dwarf, Gnome, and Orc races + add multishot ammunition + add graves, iron bars, trees, and arboreal levels + dwarvish mattocks can be used to dig + add leprechaun, cockatrice, and anthole special rooms + add the Sokoban dungeon + implement talking artifacts + members of the clergy (aligned/high/player priests and monks) are + generated with a robe instead of chain mail. + new tin of meat types + tinning kits and cameras have charges + blessed magic mapping detects secret doors + starting spells are known at start of game + pre-discoveries are listed with an * + voluntary challenges with #conduct + add a funny message when eating tridents and flint stones + allow debug-mode level teleport to the sanctum + some #monster commands now consume energy + trees can be kicked as a possible source of fruit + Wile E. Coyote references when using '/' on a coyote + + Platform- and/or Interface-Specific New Features + ------------------------------------------------ + WinNT: implement mail support + WinNT: console mouse support added to TTY port + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes33.1 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,444 ---- + General Fixes and Modified Features + ----------------------------------- + discarding a tin without eating should not count towards food conduct + expand 'nethack.cnf' in dat/help to include new names on some platforms + using 'C' to name a steed produces a "pony tail" + stopping reading a spellbook when "too much to comprehend" left in_use set + conduct: eating meat{ball,stick,ring,huge chunk} counts as eating meat + don't select gems--aside from rocks and known glass or flint--via autoquiver + skilled slingers can shoot multiple rocks with one shot, like other archers + orcs shooting orcish arrows from orcish bows get multishot bonus, like elves + have 'Q' offer gems/stones as likely quiver candidates when wielding a sling + 'Q' command--don't offer tools as likely quiver candidates + spell hunger effect for wizards of high intelligence was not computed correctly + fix "killed by the [master] mind flayer" bug + redisplay correct trap glyphs when hallucination ends + monsters under Conflict cannot attack other monsters that are already dead + monsters that steal gold from monsters should teleport + fix mummy wrappings worn by monsters to block invisibility + applying a weapon or wieldable tool would sometimes give spurious messages + about two-weapon combat + applying a weapon or wieldable tool might not always end two-weapon combat + receiving a divine gift artifact while wielding two weapons would unrestrict + two-weapon skill instead of the skill for the artifact's type + throwing and kicking while wielding two weapons exercised two-weapon skill + when wielding two weapons, ')' command should show both + giants cannot "easily pick up" boulders on the Sokoban level + W command would let you wear an arbitrary item in your body armor slot if that + was empty & uncovered and you carried extra armor for any filled slot + W command would list entire inventory if you answered '?' to the "what do + you want to wear?" prompt when all unworn armor couldn't be worn + #looting and applying containers with menustyle != traditional would do bad + things if you split a merged stack in quiver or secondary weapon slot + save/restore while mounted or stuck could cause a game crash or other errors + baby gray dragons should not be visible to infravision + dying from a failed saddle attempt should name the monster without using + hallucination + spurious "Bummer, you've hit the ground" when hallucinating and dismounting + constitution of <3 and >18 (possible in 3.3 because the ring of gain + constitution was added) was not handled properly + potion and wand of invisibility (on yourself) should not print message if you + are already invisible, even if you can see invisible + reviving tame monsters ended up tame but not peaceful and would attack you + wishing for "rotproof" item is recognized as synonym for erodeproof + your pair of boots "are" not affected when kicking rust monster should be "is" + use article "a", not "an", with "eucalyptus leaf" + fix crash if reviving troll has been genocided + shouldn't see candles flicker when blind + gas clouds use cloud symbol + unchanging suppresses amulet of change, intrinsic lost by life-saving + missing lucern hammer, silver dagger, silver spear in monster weapons + buckled boots are brown + Scorpius and centipedes are not web-makers + race placeholders are M2_NOPOLY + Monk species/leader/guardians are M1_HERBIVORE + leader/nemesis flags fixed with |= instead of = + freezing spheres won't leave corpses + artifacts should add to ending score even if they are inside a bag + being killed by a gas spore should not be treated as burning (most noticeable + problem was that the death message did not include "killed by") + remove a double period from "Caught himself in his own fireball.." + automatic dog names restricted to dogs + chatting with a monster that teleports after the chat (succubus, bribable + demon) would put an 'I' symbol at the monster's destination + stethoscope/probing should reveal identity of invisible monster, not use "it" + wand of probing zapped at 'I' square with no monster should clear the 'I' + cursed potion of invisibility drunk by monster should reveal 'I' + kicked monster that evades kick by moving to unseen square should not leave + 'I' in original position of monster + closing a door on an invisible monster reveals the 'I' + gas spores are recognized as having passive damage for purposes of pet attack + since iron armor can now corrode, don't call all corroded armor "bronze armor" + properly handle attacking a black pudding with a corrodeable weapon + do not print "You still cannot see" when blind and removing lenses + remove possibility of crashes when unseen monster engulfs items + object shattered by wand should use plural verb when object is plural + don't anger monsters when hitting them with invisibility or helpful unholy water + for initial inventory, don't give out spellbooks in restricted spell skills + for tourists' initial inventory, put darts in quiver rather than wield them + artifact discoveries sometimes showed undiscovered object types (for example, + Snickersnee as "katana" when katana was still known as "samurai sword") + "iron bars" singularization exception should not also catch "candy bars" + if a monster kills a monster by throwing acid, don't credit the kill to you + leave two-weapon combat mode if either weapon is stolen or otherwise unwielded + use worse of (two weapon skill, current weapon skill) when figuring skill + bonuses and penaltys while fighting with two weapons + never give back-stabbing or weapon-shattering bonus when using two weapons + engulfing monster will not engulf your pony while you are riding + arch-lich usually starts with an athame or quarterstaff + do not say that "an" Asmodeus reads a scroll + '?' command--short options help sometimes included garbage output + '?' command--longer options help omitted several recent options + eating an amulet of restful sleep now works properly + getting hit by a potion of sleeping now works properly + sleeping is reported by enlightenment + detect unseen / secret door detection refreshes unseen monster (`I') glyphs + monsters won't pick up objects in water (especially kelp) + unseen check for monsters in explosions + fixed "petrified by an " + silver arrows cost a little more than other arrows + javelin back in its own class + dipping weapons in potion of oil now works properly + freed prisoners become peaceful + monk titles shortened so they aren't cut off + elven Priests get their starting musical instrument + you can now correctly ride centaurs + fixed steed getting teleported (e.g. by Quantum mechanic) + fix stethoscope/probing speed reporting, and slowing attack on player + blessed detect monsters increments (not sets) the timeout, and produces a + message if no monsters are on the level + put "Elbereth" under the sokoban prize so that monsters don't eat it + a weak race can still have a high strength if polymorphed into a strong monster + make dingos non barking canines + suppress zap up/down message for stone to flesh on non-stone levels + fix missing spaces on sokoban level that made level impossible without cheating + use case-insensitive comparison for wishing (needed for Master Key of Thievery) + avoid commas in the player name because they confuse the record file + note Sliming when using probing/stethoscope on yourself + fix inconsistency: reflecting medusa's gaze while invisible didn't work, + reflecting floating eye's gaze did + Medusa should not drink potion of invisibility (the code only checked for wands) + restore confirmation prompt for kicking pets and peaceful monsters + ask for confirmation about kicking steed when kicking while mounted + converting secondary weapon into an artifact (naming, dipping) stops #twoweapon + a fully ID'd object converted into an artifact is no longer fully ID'd + polymorphing an object by dipping in potion while inside a shop will only + anger the shopkeeper if the object is shop merchandize + make {wand,spellbook,potion} of polymorph immune to being polymorphed + turning undead should count as calling on a deity for purposes of conduct + fix "monster trail" problem caused by reading a scroll of magic mapping while + engulfed + don't give Slow_digestion-related message when non-digesting engulfer expels you + vary vampire's chat responses according to time of day, tameness, and player + form + added fish_parts to mbodypart/body_part + fixed do-while loop test criteria in create_mplayers() + fix crash if reviving troll has been completely drained by Stormbringer, et al + a stinking cloud should not kill a monster more than once + player stops riding when nymph steals saddle + don't ask for name for eaten ring of slow digestion if already identified + don't let engulfed lifesaved monster beat you up while supposedly being + totally digested + lev_comp: honor class in OBJECT entries (user's '+',"identify" made scroll) + fix uninitialized buffer/unprintable characters error when eggs hatch + accept "aluminium" as variant spelling for "aluminum" + don't die from lava while praying + correctly display gems for the final score even when blinded + throwing a boomerang from {wielded,secondary,quiver} weapon slot will have + it be restored to that slot if caught upon return + don't allow iron balls to pass through iron bars + fix "What weird role is this? (E)" for names taken from 3.2.x score records + make spell of jumping work properly when restricted in escape spells + save traits of petrified monsters; animated statues are like revived corpses + unmoving monsters seen by infrared are removed from/displayed on the screen + when they leave/enter direct line-of-sight + Sting and Orcrist get their anti-orc bonus against orc player characters + buffer overrun caused by many long names in a single message + polymorph can't indirectly transform scrolls of mail into blank scrolls via + paper golem creation + don't let savebones() name a ghost without checking for sufficient space + don't report "killed by ghost of Foo called Foo" on tombstone or in record + when breaking create monster wands, don't place monsters inside solid rock + don't allow tainted cockatrice corpses to prevent stoning if you eat one + oil isn't seen as dimly glowing if you're blind + properly consider hallucination and blindness when printing sliming messages + don't allow the player to jump through iron bars or walls (the latter only + when wearing the Eyes of the Overworld) + don't allow the player to hurtle through iron bars + work around race condition between breaking a wand of teleportation, + teleport control and autopickup + rust traps should affect scrolls + lev_comp returns error if level cannot be fully written out + blank scrolls/spellbooks don't count as reading material + fix seduction attacks to treat characters polymorphed into golems as neuter + chaotic sacrificing on a chaotic altar may crash if demon creation fails + failed demon summoning might cause monsndx panic + avoid possible crash when casting fireball spell while engulfed or near the + edge of the map + prevent observation of dust clouds in rogue level doorways when blind + cans of grease will no longer rust + skip already dead monsters when scanning the full monster list; avoids + monsndx panic and other potential trouble + skip already dead shopkeepers when checking for tended shops + level teleport high in the air while lifesaved should result in an escape + the "stoned" flag wasn't reset when a monster was lifesaved from turning to + stone, so the next monster you killed would always turn to stone + wooden harp is not a magical object + player characters got left at 10 when "normal" speed was increased to 12 + time it takes a monster to change armor doesn't depend on whether you see it + character can't be totally digested on first turn of being swallowed + level 25 engulfer would trigger divide by 0 crash via evaluating rnd(0) + wielded egg that hatched wasn't cleaning up worn objects and might cause crash + mirror shouldn't show location of unseen monsters + cloth headwear was being reported as leather when fire damaged + modify moveloop so that time (moves) is not relative to the player's speed + fix moveloop to account for player not accumulating enough movement points + to move in a turn -- this fixes the reported "time is wrong when + burdened" problem + monsters should not teleport on levels that disallow teleportation + consider existing poison resistance when printing message while eating + don't allow various spells/effects to turn monsters into genocided species + don't crash on abusing guardian angel (accessing edog) + call useupall() rather than useup() for organic items burned by lava + revive any Rider corpse which gets teleported + wishing for gold should affect conduct + gold detection should detect gold golems + grease should affect the secondary weapon in two-weapon mode + falling drawbridge, eating cockatrice eggs, delayed self-genocide all caused + monsters to be fully named instead of using "it". + change the You_hear message if hero is asleep + various inventory changes did not immediately update when perm_invent was set + avoid crash when multiple, cascading explosions occur + pets are no longer permanently weakened by a brush with starvation + doeat() doesn't leave rotten food half-set-up for resumption + don't allow trying to resume eating a revived rider corpse + shopkeepers, priests and peaceful monsters should get angry when you cast + stinking cloud on them + when crowning a neutral wizard who knows finger of death but isn't carrying + its spellbook, don't drop his weapon (crash likely) + similar greased and non-greased objects would merge together into one stack + monster reading scroll of earth may be allowed an extra attack + change message for failed attempt to mount steed while punished + fix multi-shot throwing for darts and shuriken + update monster multi-shot throwing to match player throwing + prevent inappropriate use of "lungs" in creatures that have none + change several instances of 'pline("The ' to 'pline_The("' + monk characters kick as characters rather than as kicking monsters + fix kicking shades by character polymorphed into kicking monster + fix articles in some Sokoban trap messages and eliminate some + superfluous messages + restoring with damaged subroom shops on non-current level could dereference + stale shk pointer + prevent removal of levitation in sokoban pits from causing you to + "float gently to the ground" + peaceful/tame mindflayer now mindblasts hostile monsters and vice versa (the + check was backwards) + fix suppression of stone-to-flesh on unique monster statues + kill player when drain life induces negative HPs + rumors used as engravings should not refer to fortune cookies + magic-resistant players/monsters unhurt by monsters zapping wands of striking + fix time problem where disrobing took too long + saddle that comes with a knight's initial horse should be known to player + iron golems are sensitive to more ways of getting wet with water + prevent odd contents of initial tourist tins and eggs (the contents were + mostly from the quest level, producing many cave spider eggs) + breaking a wielded wand doesn't leave it wielded + if nymph hits monster on first attack and teleports away, suppress second attack + kicking a mimic should reveal its presence + using 'F' command on a pet with safepet should not produce "thin air" message + polymorphing into slime or fire creature removes Slimed; becoming a new man + resets the Slimed timer + throwing cockatrice corpse barehanded should stone the player + avoid "petrified by petrification" on tombstone + avoid "turning into green slime" on tombstone (KILLED_BY didn't work if Slimed) + since unchanging prevents sliming, make it reset any sliming already present + avoid "You turn into a female succubus" redundancy + player hit by potion of acid should take damage like monster + "You are protected" in enlightenment display should include u.uspellprot + chameleons that change into a non-moving, non-attacking form shouldn't get stuck + fix bug where monsters didn't wield bow (etc.) before shooting arrows (etc.) + medium size is too large for giant bats (it allows leaving plate mails when + killed) + player polymorphed to a ghoul resists sickness just like a ghoul monster + player in werecritter beast form shouldn't polymorph into "human" + player wearing scales of genocided dragon was getting duplicate "you feel + dragon-ish" messages when polymorphing + fix luck timeout for full moon and friday 13th + monsters must wield polearms before using them, just like players + when saving bones data, shopkeepers will claim dropped objects inside shops + pets will now wear objects they pick up + pets will now wield pick-axes when necessary + limbless pets are no longer able to carry objects + monsters cannot consider a mattock for digging if they are wearing a shield + avoid a case where monsters keep switching between pick-axe and weapon + override hallucination when reporting pets that ascended or escaped with player + avoid duplicate pickup() calls when landing after falling through a hole + added squeaky board traps to Lord Surtur's lair entrances + cursed lenses no longer considered a major problem by deity + prevent "seeing an image of someone stalking you" when Blind + disallow potion of polymorph / ring of polymorph control starting combo + disallow starting with blank paper + tools shouldn't charge beyond 127 charges + getting money from a fountain should set the looted flag + pole-weapons won't bash and will advance skill when on steed + blessed genocide of polymorphed unchanging player should kill + picking up nothing should take no time + quiver command should take no time + potions should not be autoquivered as worthless glass + players should not get double-billed when using or altering items + silver dragons should have same resistance as other dragons + golems should be un (reverse-)genocidable + player should get blamed for destroying Minetown fountains by Excalibur dipping + player should not get blamed for others destroying Minetown fountains + digesting ghosts and shades as a purple worm should be nonvegan but vegetarian + eating brains as a mind flayer should be nonvegetarian + eating eggs should be nonvegan but vegetarian + eating tripe, meat sticks, chunks of meat should be nonvegetarian + headstones now implemented through engraving + luck penalty for the remaining forms of "creative NetHacking" in sokoban + don't penalize a turn if player cancels #ride direction + Ranger quest is no longer a rip-off of the old Elf quest + several Hello() messages were inappropriate for various monsters + storm giants should talk + monk leader and guardians should use clerical spells + monks shouldn't start with scrolls of enchant weapon + movement rate when saddled was miscalculated + items under lava shouldn't been seen or picked up + clicking in status line during `/' shouldn't cause getpos error + huge chunk of meat should count as dogfood + "Pardon me" when moving directly into peaceful monster + shouldn't glow amulet and save life of digested monsters + " gets angry!" only when you can see the square + "Never hit with a wielded weapon" conduct should only count + weapons and weptools + lynxes should not have cold attacks + Naming a specific object asks "What do you want to name *this* ___" + "Having fun sitting on the floor" shouldn't over fountain + "ball lightning" changed to "ball of lightning" + "poisoned by a poisoned crude arrow" should be "killed by a poisoned + orcish arrow" + shouldn't see invisible monsters oozing under a door + fix apostrophe for invisible seen-invisible crumbling-to-dust liches + amulet of change when polymorphed into single-gender monster could produce + inconsistent role name for Priest(ess) and Cave(wo)man + prevent Fire Brand from "burning" a water elemental + snatching cockatrice corpse gloveless by applying bullwhip will now stone + inventory description of wielded two-handed weapon uses "weapon in hands" + inventory description of secondary weapon explicitly lists it as non-wielded + to reduce confusion about two weapon combat + Bell of Opening removes attached iron ball when performing opening magic + chatting to a monster who responds with "I'm trapped" reveals the trap + Make tmp_at() work when called in the midst of a previous tmp_at() sequence + Make the messages for attempting to wear lenses over a blindfold more clear + Prevent buffer overflow when reading engravings that are BUFSZ in length + paralyzation message on steed should not say your feet are frozen to the floor + avoid buffer overflows and associated security problems from getenv(), + program name, and user name + + + Platform- and/or Interface-Specific Fixes + ----------------------------------------- + Mac: legacy message was being truncated + Mac: black background left mess on backspace + Mac: backgrounds set too early on game startup + Mac: tty window positions not remembered after move + Mac: tty window turned B&W when moved to bottom of screen + Mac: tty quit command fixed + Mac: remnants of previous hunger status now cleared + MFLOPPY: add checkspace option to avoid problems with >2GB free space + MSDOS: fix clearlocks() to look for the right file names, + and not LEVELS.* (MFLOPPY only) + MSDOS: remove djgpp stuff from the Microsoft C Makefile + MSDOS: change NetHack.cnf to defaults.nh in NHAccess.nh comments + MSDOS: add missing files to gcc 'make spotless' + NT: WIN32 specific code in tty_nh_poskey() was missing the + necessary code to clear window flags so after hitting ESC + messages that should have displayed did not + Linux: set MAILPATH properly + Linux: don't use control characters on Rogue level with IBM graphics + DEC UNIX: set MAILPATH properly, type lex functions properly, avoid conflict + with curses over naming + Qt: remove intermediate files on 'make spotless' + Qt: modify makefile to allow use with BSD make and FreeBSD + Qt: have player selection dialog come up when name specified + Qt: use default menu accelerators and allow remapping + X11: fix memory leaks is reading from dialogs + X11, tty: avoid crashing when displaying empty menus, as from 'i' with + perm_invent and no inventory + tty: when given the choice of ANSI color (AF) vs standard color (Sf), choose + ANSI since there is some disagreement as to the correct color order + for Sf, but no such disagreement for AF. + tty: add workaround for termcap misfeature in some Linux distributions which + affects DECgraphics display + Amiga: minimal functionality restored + Amiga: recover created empty (and unused) save.info files + Amiga: ^P works properly + Amiga: windowcreating modified for better adaptivity + Amiga: changed from intuition menus to gadtools menus + Amiga: changed default colors in tilemode to those of gfxfile + Amiga: window backfill works + Amiga: playerselection adopted from tty-port + Amiga: linesplitting in msg/inv/menu windows fixed + Amiga: obey user configured pens in nethack.cnf + Atari: tty port rescued from oblivion, Gem windowing added + + + General New Features + -------------------- + gold/glass golems, glass piercers now resist acid + added sharks, piranha, jellyfish, prisoners, and iron bars to special levels + piranha can appear in swamp rooms + hero falls off steed when fumbling or falling down stairs + artifacts speak when applied + engraving "x" is not literacy + demons and vampires engrave in blood + shopkeepers don't like riding customers + can #chat down to steed + own race in Gnomish Mines replaced with random monsters + differentiate between light/gaze-induced blindness and other causes of blindness + yellow dragon scale mail provides acid resistance + polymorphed player digests engulf victims more slowly if Slow_digestion + Conflict now affects steed's desire to keep its rider + undead turning of bones level player corpse causes ghost to reunite with + the corpse + control-x in regular mode displays name, role, race, gender, and your deities. + wizard mode can wish for pools of lava + pythons now have infravision to emulate real pythons heat sense organ + M-2 added as a shortcut for #twoweapon + general file location mechanism + you can choose to #loot the saddle from something now + message changes for silver dragon scale mail glowing silver and pit vipers + falling into pits + support explicit `race=random', `alignment=random', and `gender=random' + in startup options + manes now grow up into lemures + potions of healing and sickness affect Pestilence in the opposite way to + their effect on other monsters + introduction of a new method of warning where you sense the danger level of + monsters on the level by displaying it at the monster's location + introduction of a new method of warning for specific monsters the way Sting + does for Orcs; you sense their presence anywhere on the current level + artifacts can belong to specific races and won't be given as gift when "hated" + Archeologists get a penalty for breaking "historic" statues + hatching eggs in male player's inventory have chance of "Daddy?" + steeds affected by more types of wands zapped down + opening/knock versus steed drops saddle + unwearing your steed's saddle (e.g. stolen, opening) causes dismount + yet another funny message when whipping a horse corpse + yet another funny message when mounting when hallucinating + Bell, Book, and Candelabrum added to final score like artifacts + new keywords coaligned and noncoaligned for altars (and monsters/priests) + in special level descriptions + quest start levels get coaligned altars if their roles have multiple + alignments, and goal levels get noncoaligned altars + ice vortices and freezing spheres are infravisible + + + Platform- and/or Interface-Specific New Features + ------------------------------------------------ + X11, tty, Amiga: offer for player selection only choices consistent with those + already made by config file/command line (e.g., only offer roles that + are compatible with specified race) + tty: eight_bit_tty option + Amiga: implement menu_* accelerators and counting + mac: the "record" file is created if it does not exist *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/doc/fixes34.0 Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,592 ---- + General Fixes and Modified Features + ----------------------------------- + prevent an extraneous selection prompt when a role with only a single + possible gender, race, or align is specified + be consistent with the use of twice and thrice in end of game reports + use "kill" vs "destroy" more consistently + looting bag of tricks on the floor doesn't then prompt for direction + suppress "the" in "you kill the poor Fido" + iron bars added to the Dark One's prison + shouldn't be able to #loot without hands + level compiler can specify cockatrice nests, leprechaun halls, antholes + fix level compiler to allow specifying golems via '\'' in MONSTER directives + fix bug where excalibur blasted lawful non-Knights + unification of the strings "he"/"him"/"his" + conflict caused vanishing vault guards to be killed with player getting + credit/blame (also dmonsfree warning for double removal from map) + monsters' conflict resistance check was unintentionally being affected by + character's experience level + stone-to-flesh was accessing freed memory, passing bad map coordinates + to newsym that might be harmless but could trigger a crash + prevent spurious "placing steed on map?" impossibles during save/restore + prevent real "placing steed on map?" impossibility [sic] when creating bones + dropping secondary or quivered weapon to lighten load in order to crawl + out of water left the item flagged as still worn + if #adjust combined two or more of main weapon, alternate weapon, and quiver + the resulting stack would be flagged as worn in multiple slots and + eventually trigger "Setworn: mask = ##." impossibility + remove curse operated on secondary weapon even though it wasn't wielded + update conduct immediately when eating corpses (character killed by eating + poisonous corpse as first meal was described as "strict vegan") + fix problem with amulets of change when polymorphed into succubus/incubus + YAFM for pit fiends/pit vipers and pits should require seeing the monster + woodchucks, cockatrices, and vampire bats should eat + specifying a non-numeric value for amount when donating to temple priest or + bribing demon prince produced random result + mastodons can tear through webs + praying on wrong deity's altar cursed holy water but ignored uncursed water + polymorphed player's gaze now works properly as a pyrolisk + fix "You drop the Wizard of Yendor's corpse into Wizard of Yendor's interior." + make sure status line gets updated when turning-into-slime state changes + when eating green slime, don't reset slime countdown if already infected + stop current activity when you noticed you're turning into slime + message given when displacing an unnamed pet into a polymorph trapped referred + to it by its new monster type rather than by what you displaced + player killed by ghoul turns into one in the bones file + slings are not made of wood + for post-amnesia deja vu messages, use "seems" rather than "looks" when blind + avoid encumberance messages during startup attribute adjusting + even a wumpus cannot escape the pits in Sokoban + when a steed dies in a shop, don't charge for the saddle + shopkeeper did not charge for use of an unpaid camera + shopkeeper did not charge for items burned by breaking a wand of fire + shopkeeper should charge when you transmute a potion + shk notices if you use a grappling hook to remove an item from the shop + adjust robbed shopkeeper's feedback when he or she plunders hero's corpse + avoid giving away which monsters are saddled while hallucinating + when polymorphed into a herbivorous monster, you should prefer vegan "corpses" + when polymorphed into a hider, stop hiding after picking up the last object + at a location + throwing a wielded, returning weapon should not disable twoweapon mode + monster should not wield cockatrice corpse without gloves on + sharks have thick skin + better message when killed by drinking a potion of sickness from a sink + telepathically detected monsters will be described by name if they try + to attack praying character + taking cockatrice from or putting it into a container should stone you + if you are unprotected + don't fall into pits (or other traps) twice when dismounting + fix two weapon combat bonus/penalty to avoid "weapon_hit_bonus: bad skill 2" + unicorns were at a disadvantage on a noteleport level + missing a cockatrice when polymorphed into a weapon-using monster but + fighting hand-to-hand would stone the player + eliminate ghoul creation abuse when engraving on a headstone + loss of levitation due to a sink will result in touching a wielded cockatrice + corpse, just like falling down stairs while burdened + falling into a sink when constitution is greater than 20 won't raise hit points + stinking cloud should not affect migrating monsters, causes dmonsfree error + only display message about monster using a weapon against another monster + if you can see the monster + don't count artifact amulets (wizard's quest artifact) twice in final score + prevent pets from picking up Rider corpses + when polymorphed into a centaur, don't keep kicking monsters after they die + when throwing at a monster that you see with infravision, don't say "it" + avoid "the arrow misses the mimic" which left the mimic concealed + #sit while water walking over a submerged object should sit on the water's + surface rather than on that unreachable object + suppress extra "the" when printing the names of certain mplayers + do not try to engulf green slimes (same as for cockatrices) + trying to eat the brains of a green slime is now properly handled for players + monsters touching cockatrices check boots for feet and nothing for tentacles + if being petrified, don't disable messages from further petrify attacks + trap detection would generally not find trapped doors + avoid spurious done eating message after choking and vomiting + attribute distribution for several player types did not add up + monsters shouldn't try to eat green slime as a cure for stoning + lighting of arboreal levels should not be stopped by trees + need to recalculate visible locations immediately when monster blinds player + monsters shouldn't see through walls because player wears Eyes of the Overworld + when pricing glass the same as valuable gems, be sure to use gems of same color + nymph stealing armor from a fainted player should wake the player + ensure status line updates when you stop running when time is shown + repairing a trap in a shop doorway must replace the broken door or wall as well + sleeping steed cannot climb stairs/ladders + can't change levels when mounted on a steed which is carrying the Amulet + more artifacts granted by a deity are rustproof + monster name feedback when using the m movement prefix allowed player to + distinguish between peaceful and hostile monsters while hallucinating + scrolls should not fade when hitting rust monsters, only from rust traps + blank scrolls should not fade even from rust traps + can't eat or #offer food off the floor under circumstances other than + encumbrance where you couldn't have picked it up off the floor first + ensure correct message after passive freeze attack by gelatinous cube + avoid buffer overwrite when several weapons slip from your hands at once + prevent portal placement on Ranger quest from stranding player in left margin + avoid crash when a trouble gets fixed before you finish praying + sensed hidden monsters should fight back when attacked + mindless monsters won't be grateful after unsuccessful #untrap attempts + turning affects your religious conduct, even if your god does not help you + rolling boulder trap's boulder will knock another one that it collides + with into motion in its place + make it harder to abuse detect monster and confusion spells + prevent D[a from producing odd message sequence in (c)ombination mode + avoid messages like "the silver bell" after being drained by mind flayer + after polymorph, actually drop both weapons when a message says this happened + curb unicorn horn creation abuse by limiting the chance of a unicorn + leaving one if it has been revived + accept -p and -r options with nethack -s, as documented + avoid printing "spellbook of" Book of the Dead in list of discoveries + eating non-food items made of leather or other animal parts now violates + vegan/vegetarian conduct + use correct skill when throwing something while in twoweapon mode + secondary weapon can rust when hitting a rustmonster in twoweapon mode + extra healing spell cures monster's blindness + add missing quest message for throwing the quest artifact to the Monk leader + pits, arrow and dart traps, webs, polymorph traps and sleeping gas + traps can affect the steed + allow game restoration while polymorphed and your race is genocided + ensure that crysknives revert to worm teeth, even in containers + do not print gas spore's name if you cannot see a gas spore explosion + cursed two-handed weapons now keep you from changing body armor + trapped pets cannot follow you to another level + no corpse when unchanging hero dies while polymorphed into a G_NOCORPSE monster + A-removing armour under cursed stuff no longer fails silently + grease protects gloves from contact poison on books + items picked up from an abandoned shop sometimes wouldn't merge with other + compatible items in inventory ("no charge" bit wasn't being cleared) + prevent cut-off death message by increasing DTHSZ + check to not control teleports when unconscious should now work properly + if armor the hero is donning is stolen or seduced off, attributes + can be left permanently mis-adjusted + ensure a message is printed in all non-obvious cases where a monster flees + a fleeing monster that is holding you always results in a "get released" message + ensure a monster flees for at least one "turn" + explosion type can now be one of dark, noxious, muddy, wet, magical, + fiery, or frosty + flying (jumping or throwing recoil) over some traps (magic portals, fire traps) + will now trigger the trap + displacement does not work through walls + you can't trip and fall or trip over rocks while riding + reduce the chances of a monkey successfully stealing armor you are wearing + monkeys can't steal cursed items that you're unable to remove or attached + iron ball or items too heavy for them to carry + trapped doors are not always detected after returning to a previous level + trap detection sometimes showed non-trap locations to be traps + eucalyptus was never chosen in random tree fruits due to an off-by-one bug + allow knights to pursue and attack thieving monkeys without alignment penalty + gaining levitation while over on sink causes an immediate fall + quest leader should avoid leaving the quest start level voluntarily + blind Medusa cannot gaze + prevent dipping attached iron ball or embedded dragon scales into a potion + of polymorph from confusing the game about what items are in use + should not be able to cut down trees on Ranger quest start level + arrow traps are not currently intended to shoot poisoned arrows + fall off the horse if you mimic a pile of gold while riding + martial attacks will not remove monsters from traps and will cause + monsters to set off traps they land on while reeling/staggering + prevent topten from using alloc after alloc failure + Nazgul and erinyes are nopoly to ensure their numbers are never exceeded + "player-@" randomly selects a race and "player -@" randomly selects + everything that is not specified + prevent spurious "quest portal already gone" when you use an artifact to + return to the quest after being previously expelled + prevent limbless shopkeepers from "leaping" and "grabbing" your backpack + by changing the messages that you get + prevent panic when riding while punished and falling down the stairs + armor class shouldn't wrap from very negative to very positive + searching should only credit you with finding an undetected monster if + you couldn't sense it or spot it already + monsters should not generally lose invisibility when polymorphing + monster must have eyes or breathe to be affected by potion vapors + stop dungeon file open failure from causing vision-related crash + wishing for {statue,figurine,corpse} of long worm tail yields long worm instead + chatting to an arbitrary shopkeeper (not a petrified one) who was created + via statue animation produced strange results + Yeenoghu's confusion attack is not a touch of death + an eating steed should not be able to go up or down stairs, etc. + you don't feel "great" when recovering with a unicorn horn but Slimed; also, + make the same check for potions that make you feel "great" + avoid panic during player-as-demon demon summoning when no demon is available + change "Ouch! You bump into a door" message when riding + prevent voluntary dismount of steed from passing you through walls in + tight spots + prevent throwing boulders, boxes, and chests and medium-to-large + corpses and statues through iron bars + only living eggs which touch cockatrices get turned to stone + since monsters already refuse to zap empty wands, they shouldn't pick them up + after praying, try to give a spellbook for which the player is not restricted + after #dipping your weapon in hand or quiver into a potion of polymorph, + leave it where it was + message from rust trap states "robe" instead of "cloak" when applicable + gas spore explosions were affecting your human hitpoints even if you were + polyd and consequently you did not rehumanize + prevent "You attack empty water" when attacking a spot on land while + underwater + prevent spurious "But you aren't drowning. You touch bottom." message when + removing an amulet of magical breathing as an amphibious creature + fix message given when a monster tries to disarm your multiple welded daggers + with a bullwhip + camera flash no longer stops at invisible monster + monsters inside a stinking cloud should be blinded, just like the hero is + vault guard shouldn't initiate conversation with you when you're hidden + adult wolves are not small but lynxes are small + turn off vision during a save operation to prevent impossible() from + triggering a crash + rolling boulder trap's boulder susceptible to land mines and teleport traps + polymorphing below level 1 should kill player (needed to fix max-HP abuse) + prevent "obj not free" panic when shopkeeper cannot get to a thrown pick-axe + give feedback if Sokoban prevents polymorphed player from passing through walls + eliminate Wounded_legs enlightenment message when riding since it refers to + the steed's legs, not the hero's + adjust the fumbling pick-axe message to reflect that the steed's + legs got damaged, not the hero's + quaffing a noncursed potion of speed no longer heals the steed's wounded legs + prevent mounting of steed when you have Wounded_legs to prevent abuse; + dismount does an unconditional healing of Wounded_legs during the + Wounded_legs context switch + wounded legs on a steed doesn't count as a prayer trouble + wounded legs on a steed doesn't abuse dexterity + make wounded legs gained by falling off a steed consistent (dexterity loss) + land mines while mounted should hurt the steed + self-genocide while sitting on a throne should not refer to scroll of genocide + eating dogfood or fixing a squeaky board conveys experience but didn't + check for gaining a new level + demon bribes are 4x larger than they should be for co-aligned players + specific monster warning no longer reveals the true monster name when you + use the '/' command while hallucinating + start_corpse_timeout() now takes corpse age into consideration rather than + always assuming a fresh corpse, thus fixing potential icebox abuse + player on an immediate diagonal from a monster reading a scroll of earth + should be affected, just like monsters in similar locations + objects that fall from monster's minvent as a result of monster polymorph + are not polymorphed, consistent with items that remain in minvent + quaffing a potion of gain ability while wearing ring of sustain ability + displayed no message and identified the potion + monsters still with WAITFORU strategy should not follow up/downstairs + messages should reflect the fact that the Eyes of the Overworld mask the + effects of blindness + Amulet of life saving should save you from sickness that will kick in this turn + player should stop waiting when a monster uses a polearm from a distance + avoid stone-to-flesh blood pooling message when zapping ice and not stone + when polymorphed into a silent creature, do not "pronounce" scroll formula + ensure hilite turns off immediately when pet stops being tame + hitting with a polearm counts as hitting with a weapon for conduct + traps detected while blind and levitating were not displayed + when a mind flayer uses its mind attack, it should wake the victim + shapechangers restored from disk would no longer change shape + blind, cancelled or nonseen invisible Medusa cannot gaze at other monsters + fix impossible when spinning web on falling rock, rolling boulder and fire traps + rust monsters can only eat items made of rustable material + wands of fire are no longer flammable no matter what material they are + displacing you pet into a trap which kills it affects killer conduct + pets can now be displaced in untended shops + only show lit walls if, like doors, the position next to them is lit too + charge for an unpaid weapon used for engraving + shopkeeper should charge for unpaid balls and used candles in containers + when swallowed you could drop or throw a cockatrice corpse into a + monster's stomach without stoning it despite the guaranteed hit + steed would often not respond to an attack, even if you didn't move that turn + after stepping in a polymorph trap, a monster may pick up the wrong items + breaking an unpaid wand of teleportation wouldn't result in the proper charge + next_shkp() was used inconsistently, potentially triggering an endless loop + chaotic wizards usually get a spellbook when crowned, just like neutral ones + monk quest: fix the two inaccessible chambers on the locate level + rogue quest: fix the four inaccessible chambers on the home level; + link the two inaccessible chambers on the locate level and provide + a means of escaping from them; on the goal level, link most + chambers together, resulting in just four disconnected regions, + and force stairs to be in a different region from the nemesis + angels can fly + under #twoweapon fix it so that only Stormbringer carries out the + blood-thirsty attacks, not both + booby-trapped doors shouldn't make you stagger if you're riding + encumbrance exertion checks should happen each time player moves + mksobj_at: add way to suppress the chance of a new object being an artifact + steed should be the one caught in a bear trap, even if player is polymorphed + use a more appropriate message than "being held" when using < or > while + swallowed or engulfed on stairs + stinking cloud isn't useless and shouldn't be excluded from initial inventory + shopkeeper will not try to buy food you are eating when inventory is full + don't duplicate any gold inside containers when saving bones data + can't tell between acid and holy/unholy water that burns like acid + tame stuck monsters should release you after regaining their senses + engraving Elbereth exercises wisdom, engraving anything else does not + artifact bows get any special attack bonus added to missile to-hit roll + monsters with gaze attacks should not try to blind the hero with potions + players polymorphed into umber hulks should not try to eat boulders in Sokoban + when a monster uses up a partially eaten food item, cleanup was not performed + temple priests shouldn't be created with two robes + give some quest leaders and nemeses equipment appropriate for their class + mis-engraving "X" or "x" shouldn't violate illiterate conduct + Heart of Ahriman now explicitly does double damage + prevent NO_ATTK artifacts from accidentally doing double damage + player polymorphed into monster that loses hp out of water should lose hp too + make sure that all leashed monsters get released when bones data is saved + eating a ring of levitation doesn't confer permanent intrinsic levitation + silver hating monster using a bullwhip shouldn't snatch silver weapons into + its inventory + fracturing one of several boulders at a location should not unblock vision + don't hide stairs, thrones, &c under spider webs when creating levels + rediscovering forgotten object types behaved differently depending upon + whether they had user assigned names at the time of amnesia + taming while engulfed is limited to the engulfer + restore blindness resistance to Archons + if a shk is polymorphed into monster form which has Wizard-style tactics, + don't let him teleport to the stairs if he's inside his shop + when the player digs a hole through a shop's floor, don't let shopkeeper + wander out of that shop while multi-turn digging is in progress + don't protect alternate weapon and quivered objects against being taken + by shk who grabs your pack when you dig a hole through his shop floor + add missing break to POT_WATER case in potionbreath() + keep monster from forgetting its weapon is cursed every other round + multiple shot throwing stops immediately whenever you hurtle backwards + don't panic if being billed for a burning or other timed object + food that makes a monster peaceful should not re-anger it at the same time + abusing a leashed pet could result in a leashed peaceful monster + couldn't unleash steed while mounted + trying and failing to wield an item could leave current weapon flagged as both + "weapon in hand" and "alternate weapon" when `pushweapon' option is set + handle OBJ_CONTAINED case for corpse revival so that trolls can revive + from inside containers + eating one of several merged partly eaten food items should take nutrition + from only one of them + coyote names should not disable printing of "tame" or "peaceful" + Eyes of the Overworld protect from stun effect of Archon's radiance attack + give feedback when putting on or taking off the Eyes of the Overworld causes + blindness state to be toggled + avoid spurious "you can see again" when temporary blindness being overridden + by the Eyes of the Overworld times out + removing blindfold or lenses via 'A(' gives same results as via 'R' + make blindness with just 1 turn remaining be a candicate for repair by + unicorn horn and healing potions/spells + healing potions/spells shouldn't fix being creamed + make pie throwing and venom spitting by the player be consistent with the + effects of those attacks by monsters + offering & tinning corpses on altars should work even while riding + It was possible to faint after eating a fortune cookie and still read + the fortune's text despite being unconscious + when filling a pit containing a vortex, a surviving vortex gets untrapped + teleporting no longer moves the iron ball to under you if that's not necessary; + prevents odd ball movement when crawling out of water + monsters now prefer to wear speed boots over other boots + prevent crash when loading a special level specifying a mimic using m_object + prevent crashes caused by dropping or shipping quivered or secondary weapons + don't trigger spurious encumbrance messages on last turn of a multi-turn meal + prevent food being restored to untouched status if interrupted while eating + troll revival shouldn't increment the troll creation counter + breaking mirrors and your eggs should be bad luck when kicking chests as well + as throwing + vampires should be G_NOCORPSE so you can't wish for them + glass objects should break when thrown, just like when kicked in chests + rocks/gems shouldn't be hard to throw by hand because they are ammo + avoid all cases where splitting an object would result in two objects being + quivered, wielded or otherwise having its owornflag set + allow 'a' prompt when dropping many objects in shop for credit (Wingnut) + monsters who get polymorphed while wearing dragon armor turn into dragons + shape changers can't be killed by system shock when hit by polymorph + Chromatic Dragon has silver scales too (she reflects) + being killed when wishing for an artifact should retain that item in bones data + the drain life spell should not wipe out engravings (especially not using a + function that requires you to be able to reach the floor) + monsters who can cast undirected spells don't need to be in combat with you + to do so + messages consistent for all monster spells + monsters casting spells at your displaced image now set mspec_used + monsters without ranged spells don't print curse messages for ranged spells + going down to floor using > should set Heart of Ahriman invocation timeout + riding a steed into water kills the steed if it cannot swim, with penalties + gaze attacks now stop occupation + proper death message when killed by "plain" high priest + don't conceal the identity of Moloch's high priest + blessed full healing can't recover levels lost when polymorphing into new man + blessed full healing can recover at most half of other lost levels + golden glow when praying will recover lost level if blessed full healing could + gaining a level while polymorphed increases current monst hit points as well + as latent human (or whatever) hit points + pets should not try to go after food that they can't reach + monsters shouldn't use wands of digging in Sokoban + objects dropped in or travelling across lava pools can take damage + monsters that enter lava can take damage + eating an unpaid tin should calculate cost before not after eating + spells shouldn't do negative damage + when reading spellbooks, don't "continue studying" wrong book if original one + gets destroyed after previous reading attempt has been interrupted + correctly handle polymorphed quest leader + swallowing zombies/mummies whole makes you sick, like when eating them normally + impose additional teleport restrictions on the no-teleport Plane of Air + landmines set off by pushed boulders have same effects as stepping on them + secret corridor detected out of vision range is still displayed (prevents bug + where wand of secret door detection found nothing but still identified) + getobj can now see user-specified count when using inventory to make selection + scalpel is stainless steel (i.e. METAL) not regular steel (IRON) + eggs, potions & other breakables may break when they fall down stairs + hurtling via grappling hook does not apply effects of destination location + consider vortexes to be nonliving + dragons have scales, not fur + if player teleports a monster while swallowed on a noteleport level, the + player should not teleport along with the monster + prefixes that can appear in any order when wishing should include +/- and empty + don't allow untrapping of adjacent traps in locations you can't move to + summoning should summon any alignment if summoner's base alignment is A_NONE + when dipping unicorn horn in potion, the potion might change bless status, so + set bknown to FALSE + grammar fixes such as "Eyes of the Overworld resists" and others + score bonus was missing from scrolls of identify and fire + make wands of speed or slow monster known if their effect + on monsters is observed; likewise for speed boots + gold detection "materially poor" message inappropriate if you have hidden_gold() + cannot reflect back an invisible umber hulk or medusa's attack + monsters with M3_WANTSBOOK often couldn't move in the Wizard-level + Vlad should want the Candelabrum + if you float_down on a trap in which you're already trapped, don't retrap + applying whip toward hidden mimic displays mimic name before "Wait!" message + stealing a container didn't multiply cost of stolen contained objects by quan + halve air elemental damage to compensate for side effect of speed system + strengthen Death; weaken Famine, Pestilence, and Demogorgon + pet purple worms get nutrition from engulfing attack + throwing an artifact upwards will trigger artifact hit effects when it falls + being hit by Fire Brand stops the turning-into-slime process + monsters hitting other monsters can split puddings with weapons + be consistent with checking for iron weapons when splitting puddings + prevent corpses of undead creatures just killed by undead turning from being + instantly revived by the same undead turning attack + allow fake player monsters to handle artifacts that don't match alignment/role + chaotic monsters can use Stormbringer; lawful monsters can use Excalibur + No "corridor disappears" message if Vault guard dies off-level + slip while mounting and levitating at will should not cause damage + if you see a monster jump into a trap in a secret corridor, it's not secret + fixed a few places where unblock_point wasn't called but should have been + cloned monsters should have the same name and tameness as the original + you should stop eating (etc.) if a monster attacks you and misses + half physical damage should apply to gas spores + iron bars should affect wall corner wallification + potion of polymorph shouldn't be identified if object being dipped into + it ends up as the same type of object after polymorphing + don't slap against the floor while riding and eating bad food + got rid of "nori" (since it doesn't really translate "kelp frond" accurately) + engraving in fog-covered location on in the Wizard quest said you + engraved in air, not dust + dipping non-weapons into burning potions of oil had no effect + dipping arrows into burning potions resulted in rust damage + + + Platform- and/or Interface-Specific Fixes + ----------------------------------------- + amiga: random crashes when opening menu window in fontmode eliminated + amiga: proper action taken (cancel) when closing the menu window + with closegadget or escape + amiga: allow #/altmeta combination on foreign keymaps + amiga: prevent plname[] overflow from askname() + amiga: prevent writing outside basewindow (bottom) + amiga: tilemode tombstone corrected on cybergfx screen + amiga: don't clutter levels/ with foo.0 when quitting at playerselection + micro: prevent a guaranteed impossible() if we ever have more than (COLNO - 1) + levels in the game + micro: fix out of bounds memory modification for file opens via PATH + msdos: placeholder tiles accepted by the thin tile builder + tiles: use pixel-accurate grid bug tile for grid bugs + tty: correctly dismiss 1-line menus + tty: clear screen before version incompatibility message so it doesn't just + print the message overwriting previous screen text + tty: pet was not always hilited + tty: don't crash if the news file is present but empty + unix/tty: give user a chance to see any error produced by (de)compression + win32/tty: menus can take advantage of consoles larger than 80x25 + win32/tty: add support for inverse attribute + Gnome: workaround for GTK+ attempts to disallow setgid executables + Qt: honor user preferences in startup dialog + X11: map not displayed in color when using X11 windowtype w/o tiles + X11: viewport scrolling could scroll the the wrong place with resized window + X11: allow extra space added to map widget to be removed if widget shrinks + X11: general solution to the problem that the meaning of font height varies + among different implementations of X11 + X11: make "slow" mode the default since it seems to be very prevalent + + + General New Features + -------------------- + added travel command via '_' or mouse click + config file processing detects multiple use of the same OPTION and + prints a warning when it does + make the player selection prompt more explicit in the information + that it is going to request + remove curse now operates on cursed leashes that are in active use + give feedback when shooting/throwing more than one missile at a time + monsters can now deliberately eat dead lizards to cure confusion + general warning now allows you to attack unseen monsters, as long as you can + see the warning glyph on the screen + wand of fire & fireballs now burn webs + wand of locking / wizard lock zapped down will close and remove trap doors + exploding monsters wake nearby monsters + various mindless, sphere monsters no longer need to breath + sleeping gas no longer affects nonbreathing monsters + vault guard doesn't notice you if you're mimicking gold + good chance of untrapping monsters and pets caught in webs if you are + polymorphed into a spider, and extremely small chance even if not + stamina affects ability to throw heavy things + objects merge in containers + wishing for "nothing" yields no object and preserves wishless conduct + genociding "none" destroys no monsters and preserves genocideless conduct + coyote id naming shows only the true latin name if coyote is cancelled + xorns can "speak" and can smell valuable metal + if you find a trap but there is too much clutter to see it, have the + game display it temporarily until a keypress + rename the Wizard of Balance to Neferet the Green + double the number of messages that apprentices/guards utter, with 5 for + before the quest, and 5 after + wizard mode ^G command can create monster by class, not just by name + wizard mode ^G command takes a count + kicking a sleeping/paralyzed steed now causes special effects + allow overriding of the default boulder symbol via BOULDER option + blessed scroll of detect food provides you with a one time ability to + recognize food that may be harmful to you + wizard mode WIZKIT config file option added to ease adding items to + starting inventory for a debug session + helping a sleeping/frozen monster from a trap might wake/unfreeze monster + if the hero comes upon an obviously trapped monster the trap is considered seen + thrown weapons that hit are now subject to passive damage + locomotion-specific use of words, rather than just using "stagger" + if you come upon a physically trapped, visible monster, you see the trap + too, without searching for it + allow looking and pickup inside monster's stomach or interior when swallowed + add body_part(STOMACH) + pets like tame nymphs, et al, now only steal non-cursed items + monks usually get a spellbook rather than a weapon when crowned + blessed gold detection now detects anything made of gold, not just + coins, including candelabrum and gold rings + new T-shirt messages from Scott Bigham + option to get rid of resistance 'sparkle' (shieldeffect) (Scott Bigham) + option for autodig (Malcolm Ryan) + glowing Sunsword (inspired by Slashem) + msg_window option for ^P in TTY mode (Jay Tilton) + ninjas should get multishot bonus with yumi and ya (Dylan O'Donnell) + put prisoners in the Dark One's dungeon (Dylan O'Donnell) + touchstones; Archeologists start with one + add leather cloak so soldiers don't have elven cloaks + add Tom Friedetzky's BUC-patch with some alterations to the original + add wizard #poly and #levelchange (originally levelgain; Dylan O'Donnell), + add Jason Short's additional lenses use patch + add new Gnomish Mines levels from Kelly Bailey's patch + add Ken Arnold's patch to show unpaid item prices in inventory + jousting by players wielding a lance while riding + Knights start with lance rather than spear + can start game without a pet via pettype:none (Dylan O'Donnell) + allow disclose options to be more finally tuned, including being able + to specify the default response for being prompted + debug mode SPLEVTYPE environment variable to choose specific levels from + when there are random selections + artifacts have individual prices + new window-port preference options added, and some existing options + moved into the window-port preferences section + made each of the end disclosure options customizable to "prompt;default no", + "prompt;default yes", "show it without prompt", and + "don't show it and don't prompt" + add female role level names "Medica ossium", "Magistra", "Chevaliere", "Dame" + more feedback about skill advancement from #enhance command + USER_SOUNDS compilation option to enable use of SOUND and SOUNDDIR variables + in the config file for user-specified sound clips for + user-specified, regex-based message patterns + resistance does not protect inventory from artifacts (cold vs Frost Brand,&c) + phrase the prompts for P and R commands using "put on" and "remove" as the + actions rather than repeating W and T commands' "wear" and "take off" + dipping candles, et al, into burning potions lights them + + + Platform- and/or Interface-Specific New Features + ------------------------------------------------ + amiga: screenmode requester + amiga: 16 color font mode + mac: command-key shortcuts in the player selection dialog + vms: default compiler configuration in sys/vms/Makefile.* switched to DEC C + win32: new graphical port contribution by Alex Kompel + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/include/qttableview.h Thu Mar 21 07:37:36 2002 *************** *** 0 **** --- 1,251 ---- + /********************************************************************** + ** $Id: qttableview.h,v 1.2 2002/03/09 03:13:13 jwalz Exp $ + ** + ** Definition of QtTableView class + ** + ** Created : 941115 + ** + ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. + ** + ** This file contains a class moved out of the Qt GUI Toolkit API. It + ** may be used, distributed and modified without limitation. + ** + **********************************************************************/ + + #ifndef QTTABLEVIEW_H + #define QTTABLEVIEW_H + + #ifndef QT_H + #include + #endif // QT_H + + #ifndef QT_NO_QTTABLEVIEW + + class QScrollBar; + class QCornerSquare; + + + class QtTableView : public QFrame + { + Q_OBJECT + public: + virtual void setBackgroundColor( const QColor & ); + virtual void setPalette( const QPalette & ); + void show(); + + void repaint( bool erase=TRUE ); + void repaint( int x, int y, int w, int h, bool erase=TRUE ); + void repaint( const QRect &, bool erase=TRUE ); + + protected: + QtTableView( QWidget *parent=0, const char *name=0, WFlags f=0 ); + ~QtTableView(); + + int numRows() const; + virtual void setNumRows( int ); + int numCols() const; + virtual void setNumCols( int ); + + int topCell() const; + virtual void setTopCell( int row ); + int leftCell() const; + virtual void setLeftCell( int col ); + virtual void setTopLeftCell( int row, int col ); + + int xOffset() const; + virtual void setXOffset( int ); + int yOffset() const; + virtual void setYOffset( int ); + virtual void setOffset( int x, int y, bool updateScrBars = TRUE ); + + virtual int cellWidth( int col ); + virtual int cellHeight( int row ); + int cellWidth() const; + int cellHeight() const; + virtual void setCellWidth( int ); + virtual void setCellHeight( int ); + + virtual int totalWidth(); + virtual int totalHeight(); + + uint tableFlags() const; + bool testTableFlags( uint f ) const; + virtual void setTableFlags( uint f ); + void clearTableFlags( uint f = ~0 ); + + bool autoUpdate() const; + virtual void setAutoUpdate( bool ); + + void updateCell( int row, int column, bool erase=TRUE ); + + QRect cellUpdateRect() const; + QRect viewRect() const; + + int lastRowVisible() const; + int lastColVisible() const; + + bool rowIsVisible( int row ) const; + bool colIsVisible( int col ) const; + + QScrollBar *verticalScrollBar() const; + QScrollBar *horizontalScrollBar() const; + + private slots: + void horSbValue( int ); + void horSbSliding( int ); + void horSbSlidingDone(); + void verSbValue( int ); + void verSbSliding( int ); + void verSbSlidingDone(); + + protected: + virtual void paintCell( QPainter *, int row, int col ) = 0; + virtual void setupPainter( QPainter * ); + + void paintEvent( QPaintEvent * ); + void resizeEvent( QResizeEvent * ); + + int findRow( int yPos ) const; + int findCol( int xPos ) const; + + bool rowYPos( int row, int *yPos ) const; + bool colXPos( int col, int *xPos ) const; + + int maxXOffset(); + int maxYOffset(); + int maxColOffset(); + int maxRowOffset(); + + int minViewX() const; + int minViewY() const; + int maxViewX() const; + int maxViewY() const; + int viewWidth() const; + int viewHeight() const; + + void scroll( int xPixels, int yPixels ); + void updateScrollBars(); + void updateTableSize(); + + private: + void coverCornerSquare( bool ); + void snapToGrid( bool horizontal, bool vertical ); + virtual void setHorScrollBar( bool on, bool update = TRUE ); + virtual void setVerScrollBar( bool on, bool update = TRUE ); + void updateView(); + int findRawRow( int yPos, int *cellMaxY, int *cellMinY = 0, + bool goOutsideView = FALSE ) const; + int findRawCol( int xPos, int *cellMaxX, int *cellMinX = 0, + bool goOutsideView = FALSE ) const; + int maxColsVisible() const; + + void updateScrollBars( uint ); + void updateFrameSize(); + + void doAutoScrollBars(); + void showOrHideScrollBars(); + + int nRows; + int nCols; + int xOffs, yOffs; + int xCellOffs, yCellOffs; + short xCellDelta, yCellDelta; + short cellH, cellW; + + uint eraseInPaint : 1; + uint verSliding : 1; + uint verSnappingOff : 1; + uint horSliding : 1; + uint horSnappingOff : 1; + uint coveringCornerSquare : 1; + uint sbDirty : 8; + uint inSbUpdate : 1; + + uint tFlags; + QRect cellUpdateR; + + QScrollBar *vScrollBar; + QScrollBar *hScrollBar; + QCornerSquare *cornerSquare; + + private: // Disabled copy constructor and operator= + #if defined(Q_DISABLE_COPY) + QtTableView( const QtTableView & ); + QtTableView &operator=( const QtTableView & ); + #endif + }; + + + const uint Tbl_vScrollBar = 0x00000001; + const uint Tbl_hScrollBar = 0x00000002; + const uint Tbl_autoVScrollBar = 0x00000004; + const uint Tbl_autoHScrollBar = 0x00000008; + const uint Tbl_autoScrollBars = 0x0000000C; + + const uint Tbl_clipCellPainting = 0x00000100; + const uint Tbl_cutCellsV = 0x00000200; + const uint Tbl_cutCellsH = 0x00000400; + const uint Tbl_cutCells = 0x00000600; + + const uint Tbl_scrollLastHCell = 0x00000800; + const uint Tbl_scrollLastVCell = 0x00001000; + const uint Tbl_scrollLastCell = 0x00001800; + + const uint Tbl_smoothHScrolling = 0x00002000; + const uint Tbl_smoothVScrolling = 0x00004000; + const uint Tbl_smoothScrolling = 0x00006000; + + const uint Tbl_snapToHGrid = 0x00008000; + const uint Tbl_snapToVGrid = 0x00010000; + const uint Tbl_snapToGrid = 0x00018000; + + + inline int QtTableView::numRows() const + { return nRows; } + + inline int QtTableView::numCols() const + { return nCols; } + + inline int QtTableView::topCell() const + { return yCellOffs; } + + inline int QtTableView::leftCell() const + { return xCellOffs; } + + inline int QtTableView::xOffset() const + { return xOffs; } + + inline int QtTableView::yOffset() const + { return yOffs; } + + inline int QtTableView::cellHeight() const + { return cellH; } + + inline int QtTableView::cellWidth() const + { return cellW; } + + inline uint QtTableView::tableFlags() const + { return tFlags; } + + inline bool QtTableView::testTableFlags( uint f ) const + { return (tFlags & f) != 0; } + + inline QRect QtTableView::cellUpdateRect() const + { return cellUpdateR; } + + inline bool QtTableView::autoUpdate() const + { return isUpdatesEnabled(); } + + inline void QtTableView::repaint( bool erase ) + { repaint( 0, 0, width(), height(), erase ); } + + inline void QtTableView::repaint( const QRect &r, bool erase ) + { repaint( r.x(), r.y(), r.width(), r.height(), erase ); } + + inline void QtTableView::updateScrollBars() + { updateScrollBars( 0 ); } + + + #endif // QT_NO_QTTABLEVIEW + + #endif // QTTABLEVIEW_H *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/src/mapglyph.c Thu Mar 21 07:37:37 2002 *************** *** 0 **** --- 1,232 ---- + /* SCCS Id: @(#)mapglyph.c 3.4 2000/08/18 */ + /* Copyright (c) David Cohrs, 1991 */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "hack.h" + #if defined(TTY_GRAPHICS) + #include "wintty.h" /* for prototype of has_color() only */ + #endif + #include "color.h" + + int explcolors[] = { + CLR_BLACK, /* dark */ + CLR_GREEN, /* noxious */ + CLR_BROWN, /* muddy */ + CLR_BLUE, /* wet */ + CLR_MAGENTA, /* magical */ + CLR_ORANGE, /* fiery */ + CLR_WHITE, /* frosty */ + }; + + #if !defined(TTY_GRAPHICS) + #define has_color(n) TRUE + #endif + + #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 invis_color(n) color = 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 + #define explode_color(n) color = iflags.use_color ? explcolors[n] : NO_COLOR + # if defined(REINCARNATION) && defined(ASCIIGRAPH) + # define ROGUE_COLOR + # endif + + #else /* no text color */ + + #define zap_color(n) + #define cmap_color(n) + #define obj_color(n) + #define mon_color(n) + #define invis_color(n) + #define pet_color(c) + #define warn_color(n) + #define explode_color(n) + #endif + + #ifdef ROGUE_COLOR + # if defined(USE_TILES) && defined(MSDOS) + #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && !iflags.grmode && \ + Is_rogue_level(&u.uz)) + # else + #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && Is_rogue_level(&u.uz)) + # endif + #endif + + /*ARGSUSED*/ + void + mapglyph(glyph, ochar, ocolor, ospecial, x, y) + int glyph, *ocolor, x, y; + int *ochar; + unsigned *ospecial; + { + register int offset; + int color = NO_COLOR; + uchar ch; + unsigned special = 0; + + /* + * Map the glyph back to a character and color. + * + * Warning: For speed, this makes an assumption on the order of + * offsets. The order is set in display.h. + */ + if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ + ch = warnsyms[offset]; + # ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; + else + # endif + warn_color(offset); + } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ + /* see swallow_to_glyph() in display.c */ + ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) + color = NO_COLOR; + else + #endif + mon_color(offset >> 3); + } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ + /* see zapdir_to_glyph() in display.c */ + ch = showsyms[S_vbeam + (offset & 0x3)]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) + color = NO_COLOR; + else + #endif + zap_color((offset >> 2)); + } else if ((offset = (glyph - GLYPH_EXPLODE_OFF)) >= 0) { /* explosion */ + ch = showsyms[(offset % MAXEXPCHARS) + S_explode1]; + explode_color(offset / MAXEXPCHARS); + } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ + ch = showsyms[offset]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { + if (offset >= S_vwall && offset <= S_hcdoor) + color = CLR_BROWN; + else if (offset >= S_arrow_trap && offset <= S_polymorph_trap) + color = CLR_MAGENTA; + else if (offset == S_corr || offset == S_litcorr) + color = CLR_GRAY; + else if (offset >= S_room && offset <= S_water) + color = CLR_GREEN; + else + color = NO_COLOR; + } else + #endif + cmap_color(offset); + } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ + if (offset == BOULDER && iflags.bouldersym) ch = iflags.bouldersym; + else ch = oc_syms[(int)objects[offset].oc_class]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { + switch(objects[offset].oc_class) { + case GOLD_CLASS: color = CLR_YELLOW; break; + case FOOD_CLASS: color = CLR_RED; break; + default: color = CLR_BRIGHT_BLUE; break; + } + } else + #endif + obj_color(offset); + } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */ + ch = monsyms[(int)mons[offset].mlet]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + /* This currently implies that the hero is here -- monsters */ + /* don't ride (yet...). Should we set it to yellow like in */ + /* the monster case below? There is no equivalent in rogue. */ + color = NO_COLOR; /* no need to check iflags.use_color */ + else + #endif + mon_color(offset); + special |= MG_RIDDEN; + } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ + ch = oc_syms[(int)objects[CORPSE].oc_class]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) + color = CLR_RED; + else + #endif + mon_color(offset); + special |= MG_CORPSE; + } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */ + ch = monsyms[(int)mons[offset].mlet]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; /* no need to check iflags.use_color */ + else + #endif + mon_color(offset); + /* Disabled for now; anyone want to get reverse video to work? */ + /* is_reverse = TRUE; */ + special |= MG_DETECT; + } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ + ch = DEF_INVISIBLE; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; /* no need to check iflags.use_color */ + else + #endif + invis_color(offset); + special |= MG_INVIS; + } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ + ch = monsyms[(int)mons[offset].mlet]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS) + color = NO_COLOR; /* no need to check iflags.use_color */ + else + #endif + pet_color(offset); + special |= MG_PET; + } else { /* a monster */ + ch = monsyms[(int)mons[glyph].mlet]; + #ifdef ROGUE_COLOR + if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { + if (x == u.ux && y == u.uy) + /* actually player should be yellow-on-gray if in a corridor */ + color = CLR_YELLOW; + else + color = NO_COLOR; + } else + #endif + mon_color(glyph); + } + + #ifdef TEXTCOLOR + /* Turn off color if no color defined, or rogue level w/o PC graphics. */ + # ifdef REINCARNATION + # ifdef ASCIIGRAPH + if (!has_color(color) || (Is_rogue_level(&u.uz) && !HAS_ROGUE_IBM_GRAPHICS)) + # else + if (!has_color(color) || Is_rogue_level(&u.uz)) + # endif + # else + if (!has_color(color)) + # endif + color = NO_COLOR; + #endif + if (ochar) + *ochar = (int)ch; + else + impossible("glyphmap(): Invalid output character buffer."); + + if (ospecial) + *ospecial = special; + else + impossible("glyphmap(): Invalid special feature return buffer."); + + #ifdef TEXTCOLOR + if (ocolor) + *ocolor = color; + else + impossible("glyphmap(): Invalid color buffer."); + #endif + return; + } + + /*mapglyph.c*/ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/amiga/Makefile.agc Thu Mar 21 07:37:40 2002 *************** *** 0 **** --- 1,1337 ---- + # NetHack Makefile. + # SCCS Id: @(#)Makefile.agc 3.2 2000/01/12 + # 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)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) $(I)edog.h + $(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) $(I)edog.h + + $(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) $(I)edog.h + + $(O)dogmove.o: $(NHS)dogmove.c $(HDEP) $(I)mfndpos.h $(I)edog.h + + $(O)dokick.o: $(NHS)dokick.c $(HDEP) $(I)eshk.h + + $(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)eshk.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) $(I)epri.h $(I)emin.h $(I)edog.h + + $(O)mapglyph.o: $(NHS)mapglyph.c $(HDEP) + + $(O)mcastu.o: $(NHS)mcastu.c $(HDEP) + + $(O)mhitm.o: $(NHS)mhitm.c $(HDEP) $(I)artifact.h $(I)edog.h + + $(O)mhitu.o: $(NHS)mhitu.c $(HDEP) $(I)artifact.h $(I)edog.h + $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)mhitu.c + + $(O)minion.o: $(NHS)minion.c $(HDEP) $(I)emin.h $(I)epri.h + + $(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 $(I)edog.h + + $(O)mondata.o: $(NHS)mondata.c $(HDEP) $(I)eshk.h $(I)epri.h + + $(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)eshk.h $(I)vault.h $(I)epri.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) $(I)epri.h + + $(O)polyself.o: $(NHS)polyself.c $(HDEP) + + $(O)potion.o: $(NHS)potion.c $(HDEP) + + $(O)pray.o: $(NHS)pray.c $(HDEP) $(I)epri.h + + $(O)priest.o: $(NHS)priest.c $(HDEP) $(I)mfndpos.h $(I)eshk.h $(I)epri.h \ + $(I)emin.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) $(I)eshk.h + $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)shk.c + + $(O)shknam.o: $(NHS)shknam.c $(HDEP) $(I)eshk.h + + $(O)sit.o: $(NHS)sit.c $(HDEP) $(I)artifact.h + + $(O)sounds.o: $(NHS)sounds.c $(HDEP) $(I)edog.h + + $(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)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) $(I)vault.h + + $(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)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)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 + -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)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)emin.h: $(I)dungeon.h + -setdate $(I)emin.h + -c:wait 2 + + $(I)epri.h: $(I)dungeon.h $(I)align.h + -setdate $(I)epri.h + -c:wait 2 + + $(I)eshk.h: $(I)dungeon.h + -setdate $(I)eshk.h + -c:wait 2 + + $(I)engrave.h: $(I)trampoli.h $(I)rect.h + -setdate $(I)engrave.h + -c:wait 2 + + $(I)mondata.h: $(I)align.h + -setdate $(I)mondata.h + -c:wait 2 + + $(I)monst.h: $(I)align.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 + + $(I)vault.h: $(I)dungeon.h + -setdate $(I)vault.h + -c:wait 2 + + #notes + # install keeps doing re-install because it keeps rebuilding lev_comp??? + # fixed(?) - deleted setdate *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/share/uudecode.c Thu Mar 21 07:37:43 2002 *************** *** 0 **** --- 1,250 ---- + /* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * 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. + */ + + /* + * 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 + * 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" + * 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, + * but other programs such as zoo or arc may or may not require the file + * to be "BILFed" (or "unBILFed" or whatever). Also, unlike the other + * flavors, VMS files don't get overwritten (a higher version is created). + * + * Modified 13 April 1991 by Gary Mussar to be forgiving of systems that + * appear to be stripping trailing blanks. + * + * Modified 28 February 2002 for use on WIN32 systems with Microsoft C. + */ + + #ifndef lint + static char sccsid[] = "@(#)uudecode.c 5.5 (Berkeley) 7/6/88"; + #endif /* not lint */ + + #ifdef __MSDOS__ /* For Turbo C */ + #define MSDOS 1 + #endif + + #ifdef _WIN32 + #undef MSDOS + #undef __MSDOS__ + #ifndef WIN32 + #define WIN32 + #endif + #endif + + /* + * uudecode [input] + * + * create the specified file, decoding as you go. + * used with uuencode. + */ + #include + + #ifdef VMS + # include + # include + #else + # if !defined(MSDOS) && !defined(WIN32) + # include + # endif + # include /* MSDOS, WIN32, or UNIX */ + # include + # include + # include + #endif + + static void decode(FILE *, FILE *); + static void outdec(char *, FILE *, int); + + /* single-character decode */ + #define DEC(c) (((c) - ' ') & 077) + + int main(argc, argv) + int argc; + char **argv; + { + FILE *in, *out; + int mode; + char dest[128]; + char buf[80]; + + /* optional input arg */ + if (argc > 1) { + if ((in = fopen(argv[1], "r")) == NULL) { + perror(argv[1]); + exit(1); + } + argv++; argc--; + } else + in = stdin; + + if (argc != 1) { + printf("Usage: uudecode [infile]\n"); + exit(2); + } + + /* search for header line */ + for (;;) { + if (fgets(buf, sizeof buf, in) == NULL) { + fprintf(stderr, "No begin line\n"); + exit(3); + } + if (strncmp(buf, "begin ", 6) == 0) + break; + } + (void)sscanf(buf, "begin %o %s", &mode, dest); + + #if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) + /* handle ~user/file format */ + if (dest[0] == '~') { + char *sl; + struct passwd *getpwnam(); + struct passwd *user; + char dnbuf[100], *index(), *strcat(), *strcpy(); + + sl = index(dest, '/'); + if (sl == NULL) { + fprintf(stderr, "Illegal ~user\n"); + exit(3); + } + *sl++ = 0; + user = getpwnam(dest+1); + if (user == NULL) { + fprintf(stderr, "No such user as %s\n", dest); + exit(4); + } + strcpy(dnbuf, user->pw_dir); + strcat(dnbuf, "/"); + strcat(dnbuf, sl); + strcpy(dest, dnbuf); + } + #endif /* !defined(MSDOS) && !defined(VMS) */ + + /* create output file */ + #if defined(MSDOS) || defined(WIN32) + out = fopen(dest, "wb"); /* Binary file */ + #else + out = fopen(dest, "w"); + #endif + if (out == NULL) { + perror(dest); + exit(4); + } + #if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) /* i.e., UNIX */ + chmod(dest, mode); + #endif + + decode(in, out); + + if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) { + fprintf(stderr, "No end line\n"); + exit(5); + } + exit(0); + } + + /* + * copy from in to out, decoding as you go along. + */ + void + decode(in, out) + FILE *in; + FILE *out; + { + char buf[80]; + char *bp; + int n, i, expected; + + for (;;) { + /* for each input line */ + if (fgets(buf, sizeof buf, in) == NULL) { + printf("Short file\n"); + exit(10); + } + n = DEC(buf[0]); + if ((n <= 0) || (buf[0] == '\n')) + break; + + /* Calculate expected # of chars and pad if necessary */ + expected = ((n+2)/3)<<2; + for (i = strlen(buf)-1; i <= expected; i++) buf[i] = ' '; + + bp = &buf[1]; + while (n > 0) { + outdec(bp, out, n); + bp += 4; + n -= 3; + } + } + } + + /* + * output a group of 3 bytes (4 input characters). + * the input chars are pointed to by p, they are to + * be output to file f. n is used to tell us not to + * output all of them at the end of the file. + */ + void + outdec(p, f, n) + char *p; + FILE *f; + int n; + { + int c1, c2, c3; + + c1 = DEC(*p) << 2 | DEC(p[1]) >> 4; + c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2; + c3 = DEC(p[2]) << 6 | DEC(p[3]); + if (n >= 1) + putc(c1, f); + if (n >= 2) + putc(c2, f); + if (n >= 3) + putc(c3, f); + } + + #if !defined(MSDOS) && !defined(VMS) && !defined(WIN32) + /* + * Return the ptr in sp at which the character c appears; + * NULL if not found + */ + + #ifndef NULL + #define NULL 0 + #endif + + char * + index(sp, c) + register char *sp, c; + { + do { + if (*sp == c) + return(sp); + } while (*sp++); + return(NULL); + } + #endif + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/unix/README.linux Thu Mar 21 07:37:43 2002 *************** *** 0 **** --- 1,89 ---- + NetHack 3.4.0 Linux Elf + + This README provides the instructions for using the official Linux binary, + system platform requirements, as well as steps used to create that binary. + The same steps can be used from the source distribution to create a similar + binary. + + The official Linux binary has support for tty and X11 windowing systems, but + not Qt. This means you will need to have X11 libraries installed on your + system to run this binary, even in its tty flavor. + + + The Linux binary package assumes that you have a user and a group named + "games" on your system. If you do not, you can simplify installation by + creating them first. + + gunzip and untar the package, preserving permissions, from / to put the + NetHack files in /usr/games/nethack and /usr/games/lib/nethackdir. + + (If you have old record and logfile entries from a previous NetHack + version, you might want to save copies before they get overwritten by the + new empty files; old saved games and bones files won't work with 3.4.0). + + In addition to data files for running the game, you will find other useful + things in /usr/games/lib/nethackdir (such as a copy of this README :-). + + The general documentation Guidebook.txt and the processed man pages + nethack.txt and recover.txt should provide an introduction to the game. + + The sample config file called dot.nethackrc can be used by copying + it to your home directory as .nethackrc and modifying it to your liking. + + If you are running X11 copy the nh10.pcf and ibm.pcf font files from + /usr/games/lib/nethackdir to a X11 fonts directory (such as + /usr/X11/lib/X11/fonts/misc) and run "mkfontdir", then restart X + windows to load them. Also consider putting NetHack.ad in + /usr/X11/lib/X11/app-defaults or its contents in your .Xdefaults or + .Xresources. + + + The official Linux binary is set up to run setgid games, which allows + multiple users on your system to play the game and prevents cheating by + unprivileged users. The usual default for NetHack is setuid games, but + this causes problems with accessing .nethackrc on distributions with + restrictive default security on home directories and users who don't know + the tradeoffs of various permission settings. + + + If you have problems, send us some email. + + nethack-bugs@nethack.org + + + + Steps used to build this binary release + + System: egcs-1.1.2, XFree86-3.3.6, ncurses-5.0, glibc-2.1.3 + + 0. Makefile.top: GAMEGRP = games + GAMEPERM = 02775 + FILEPERM = 0664 + EXEPERM = 0775 + DIRPERM = 0775 + VARDATND = x11tiles pet_mark.xbm rip.xpm + + 1. Makefile.src: define LINUX and linux options throughout + WINSRC = $(WINTTYSRC) $(WINX11SRC) + WINOBJ = $(WINTTYOBJ) $(WINX11OBJ) + WINTTYLIB = /usr/lib/libncurses.a + Include Xpm libs in WINX11LIB + WINLIB = $(WINTTYLIB) $(WINX11LIB) + + 2. Makefile.utl: define LINUX and linux options throughout + Use bison/flex instead of yacc/lex + + 3. config.h: define X11 window support, XPM support. + define COMPRESS as /bin/gzip as that is where it + seems to reside on newer Linux's. + define COMPRESS_EXTENSION as ".gz" + define DLB + + 4. unixconf.h: define LINUX + define TIMED_DELAY + + 5. make all; (cd util; make recover); su; make install; + cp util/recover /usr/games/lib/nethackdir/recover + + 6. Convert nh10.bdf and ibm.bdf to proper font files and place in + font path. *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/unix/unixres.c Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,213 ---- + /* SCCS Id: @(#)unixres.c 3.4 2001/07/08 */ + /* Copyright (c) Slash'EM development team, 2001. */ + /* NetHack may be freely redistributed. See license for details. */ + + /* [ALI] This module defines nh_xxx functions to replace getuid etc which + * will hide privileges from the caller if so desired. + * + * Currently supported UNIX variants: + * 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 + * hide them. + */ + + #include "config.h" + + #ifdef GETRES_SUPPORT + + # if defined(LINUX) + + static _syscall3(int, getresuid, unsigned short *, ruid, \ + unsigned short *, euid, unsigned short *, suid) + static _syscall3(int, getresgid, unsigned short *, rgid, \ + unsigned short *, egid, unsigned short *, sgid) + + static int + real_getresuid(ruid, euid, suid) + uid_t *ruid, *euid, *suid; + { + int retval; + unsigned short r, e, s; + retval = getresuid(&r, &e, &s); + if (!retval) { + *ruid = r; + *euid = e; + *suid = s; + } + return retval; + } + + static int + real_getresgid(rgid, egid, sgid) + gid_t *rgid, *egid, *sgid; + { + int retval; + unsigned short r, e, s; + retval = getresgid(&r, &e, &s); + if (!retval) { + *rgid = r; + *egid = e; + *sgid = s; + } + return retval; + } + + # else + # if defined(BSD) || defined(SVR4) + + # ifdef SYS_getresuid + + static int + real_getresuid(ruid, euid, suid) + uid_t *ruid, *euid, *suid; + { + return syscall(SYS_getresuid, ruid, euid, suid); + } + + # else /* SYS_getresuid */ + + static int + real_getresuid(ruid, euid, suid) + uid_t *ruid, *euid, *suid; + { + int retval; + int pfd[2]; + struct stat st; + if (pipe(pfd)) + return -1; + retval = fstat(pfd[0], &st); + close(pfd[0]); + close(pfd[1]); + if (!retval) { + *euid = st.st_uid; + *ruid = syscall(SYS_getuid); + *suid = *ruid; /* Not supported under SVR4 */ + } + return retval; + } + + # endif /* SYS_getresuid */ + + # ifdef SYS_getresgid + + static int + real_getresgid(rgid, egid, sgid) + gid_t *rgid, *egid, *sgid; + { + return syscall(SYS_getresgid, rgid, egid, sgid); + } + + # else /* SYS_getresgid */ + + static int + real_getresgid(rgid, egid, sgid) + gid_t *rgid, *egid, *sgid; + { + int retval; + int pfd[2]; + struct stat st; + if (pipe(pfd)) + return -1; + retval = fstat(pfd[0], &st); + close(pfd[0]); + close(pfd[1]); + if (!retval) { + *egid = st.st_gid; + *rgid = syscall(SYS_getgid); + *sgid = *rgid; /* Not supported under SVR4 */ + } + return retval; + } + + # endif /* SYS_getresgid */ + # endif /* BSD || SVR4 */ + # endif /* LINUX */ + + static unsigned int hiding_privileges = 0; + + /* + * Note: returns the value _after_ action. + */ + + int + hide_privileges(flag) + boolean flag; + { + if (flag) + hiding_privileges++; + else if (hiding_privileges) + hiding_privileges--; + return hiding_privileges; + } + + int + nh_getresuid(ruid, euid, suid) + uid_t *ruid, *euid, *suid; + { + int retval = real_getresuid(ruid, euid, suid); + if (!retval && hiding_privileges) + *euid = *suid = *ruid; + return retval; + } + + uid_t + nh_getuid() + { + uid_t ruid, euid, suid; + (void) real_getresuid(&ruid, &euid, &suid); + return ruid; + } + + uid_t + nh_geteuid() + { + uid_t ruid, euid, suid; + (void) real_getresuid(&ruid, &euid, &suid); + if (hiding_privileges) + euid = ruid; + return euid; + } + + int + nh_getresgid(rgid, egid, sgid) + gid_t *rgid, *egid, *sgid; + { + int retval = real_getresgid(rgid, egid, sgid); + if (!retval && hiding_privileges) + *egid = *sgid = *rgid; + return retval; + } + + gid_t + nh_getgid() + { + gid_t rgid, egid, sgid; + (void) real_getresgid(&rgid, &egid, &sgid); + return rgid; + } + + gid_t + nh_getegid() + { + gid_t rgid, egid, sgid; + (void) real_getresgid(&rgid, &egid, &sgid); + if (hiding_privileges) + egid = rgid; + return egid; + } + + #else /* GETRES_SUPPORT */ + + # ifdef GNOME_GRAPHICS + int + hide_privileges(flag) + boolean flag; + { + return 0; + } + # endif + + #endif /* GETRES_SUPPORT */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/winnt/console.rc Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,11 ---- + /* SCCS Id: @(#)console.rc 3.4 2002/02/14 */ + /* Copyright (c) Yitzhak Sapir, 2002. */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "windows.h" + + 1 ICON DISCARDABLE "NetHack.ICO" + + + /*console.rc*/ + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/winnt/defaults.nh Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,145 ---- + # 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:5 + + # Message window settings + OPTIONS=font_message:Arial,font_size_message:9,align_message:top + + # Menu settings + OPTIONS=font_menu:Arial,font_size_menu:9 + + # Text settings + OPTIONS=font_text:Courier New,font_size_text:9 + + # Status window settings + OPTIONS=font_status:Courier New,font_size_status:10 + + # Other + OPTIONS=hilite_pet,!toptenwin + #OPTIONS=!splash_screen,player_selection:prompts + + # 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 + + # + #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 + + # *** CHARACTER GRAPHICS *** + # + # See the on-line help or the Guidebook for which symbols are in which + # positions. + # + # If you merely set the IBMgraphics option as above, NetHack will use IBM + # extended ASCII for dungeon characters. If you don't like the selections, + # you can make up your own via these graphics options, but you should still + # set IBMgraphics if you are using IBM graphics characters to get the correct + # processing. + # + # ================================================ + # An example using the IBM graphics character set: + #DUNGEON= 032 179 196 218 191 192 217 197 193 194 \ + # 180 195 249 239 239 254 254 240 241 249 \ + # 177 177 060 062 060 062 220 124 190 035 \ + # 244 247 249 247 042 042 186 205 046 035 \ + # 247 + # + #TRAPS= 094 094 094 094 094 094 094 094 094 094 \ + # 094 094 094 094 232 232 232 157 094 094 \ + # 094 094 + # + #EFFECTS= 179 196 092 047 042 033 041 040 \ + # 048 035 064 042 \ + # 047 045 092 058 058 092 045 047 \ + # 047 045 092 058 032 058 092 045 047 + # + # ================================================ + # Some alternatives: + #DUNGEON= 032 186 205 201 187 200 188 206 202 203 \ + # 185 204 249 239 239 254 254 240 241 249 \ + # 177 177 060 062 060 062 095 124 092 035 \ + # 244 247 249 247 042 042 179 196 046 035 \ + # 247 + # + #TRAPS= 094 094 094 094 094 094 094 094 094 094 \ + # 094 094 094 094 094 034 094 094 094 094 \ + # 094 094 + + # ================================================ + # Here is a recommendation sent in by Michael Feir + # for use by blind NetHack players. + # + #DUNGEON= 032 124 045 124 124 124 124 045 045 045 \ + # 124 124 046 045 124 043 043 046 035 035 \ + # 060 062 060 062 095 092 035 126 126 126 \ + # 126 042 042 035 035 032 035 126 + # + #TRAPS= 094 094 094 094 094 094 094 094 094 094 \ + # 094 094 094 094 094 094 094 094 094 094 \ + # 094 094 + # + #EFFECTS= 124 095 092 047 042 033 041 040 \ + # 048 035 064 042 \ + # 047 045 092 058 058 092 045 047 \ + # 047 045 092 058 032 058 092 045 047 + + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/winnt/Makefile.bcc Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,1311 ---- + # SCCS Id: @(#)Makefile.bcc 3.4 2002/03/03 + # Copyright (c) NetHack PC Development Team 1993-2002 + # + # NetHack 3.4.x Makefile for Borland C++ V5.5.1 and above and Borland's MAKE + # + # Win32 Compilers Tested: + # - Borland C++ 5.5.1 for Win32 + # + # If you don't have this compiler, you can get it at: + # http://www.borland.com/bcppbuilder/freecompiler/ + # + # This makefile is set up to assume the directories are extracted at the + # root, but this can be changed by modifying the bccroot and related + # variables. + # + # This is used for building a TTY or graphical version of NetHack using + # WIN32 Console I/O and API routines only. + # + # 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. + # + # -- + # Yitzhak Sapir + #============================================================================== + # Do not delete the following 3 lines. + # + TARGETOS=BOTH + APPVER=4.0 + + bccbin = $(MAKEDIR) + bccroot = $(MAKEDIR)\.. + bccinc = $(bccroot)\include + bcclib = $(bccroot)\lib + + !IFNDEF APPVER + APPVER = 4.0 + !ENDIF + + # Graphical interface + # Set to Y for a graphical version + # Set to anything else (or undefine) for a tty version + + #GRAPHICAL = Y + + # Debug + # Set to Y for Debug support (to produce full map files, listing files, and debug information) + # Set to anything else (or undefine) for a "release" version + + DEBUG = Y + + !IF "$(APPVER)" == "4.0" + MAKE_WINVER = 0x0400 + !ELSEIF "$(APPVER)" == "5.0" + MAKE_WINVER = 0x0500 + !ENDIF + + cc = $(bccbin)\bcc32 + rc = $(bccbin)\brc32 + link = $(bccbin)\ilink32 + implib = $(bccbin)\tlib + + cflags = -c -D_X86_=1 -DWINVER=$(MAKE_WINVER) -q -I$(bccinc) -w-pia -w-rch -w-par -w-aus + cdebug = -y -v -O2 + cvarsmt = -DWIN32 -D_WIN32 -D_MT + lflags = + !IF "$(DEBUG)" == "Y" + linkdebug = /v /m /s + cdebug = -v -y -Q + !ELSE + linkdebug = /C /Gn + cdebug = + !ENDIF + startobj = $(bcclib)\c0x32.obj + !IF "$(GRAPHICAL)" == "Y" + verlflags = /Gn /Gz /q -L$(bcclib) /c /Tpe /V$(APPVER) + startobjg = $(bcclib)\c0w32.obj + !ELSE + verlflags = /Gn /Gz /q -L$(bcclib) /c /ap /Tpe /V$(APPVER) + startobjg = $(startobj) + !ENDIF + libsmt = $(bcclib)\cw32mt.lib $(bcclib)\import32.lib + + # + # Set the gamedir according to your preference. + # It must be present prior to compilation. + + GAME = NetHack # Game Name + GAMEDIR = ..\binary # Game directory + + # + # 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 (Win32) + WSHR = ..\win\share # Tile support files + + # + # Object directory. + # + + OBJ = o + + + # + #========================================== + # Exe File 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 + + #LEX = lex + LEX = flex + + # + # - Specify your flex skeleton file (if needed). + # + + FLEXSKEL = + #FLEXSKEL = -S../tools/flex.ske + + YTABC = y.tab.c + YTABH = y.tab.h + 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 = + + # + # - For debugging ability, comment out the upper two + # macros and uncomment the lower two. + # + + # + # Leave the next two lines uncommented _ONLY_ if you do NOT want any + # debug capability in the object files, or in the NetHack executable. + # Comment them if you want debug capability. + + #cdebug = + #linkdebug = + + # + # Compiler and Linker flags + # + + PRECOMPHEAD = N # set to Y if you want to use precomp. headers + + #=============================================== + #======= End of Modification Section =========== + #=============================================== + ################################################ + # # + # Nothing below here should have to be changed.# + # # + ################################################ + + !IF "$(GRAPHICAL)" == "Y" + WINPORT = $(O)tile.o $(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)winhack.o + WINPFLAG = -DTILES -DMSWIN_GRAPHICS + NHRES = $(O)winhack.res + WINPINC = -I$(WIN32) + WINPHDR = $(WIN32)\mhaskyn.h $(WIN32)\mhdlg.h $(WIN32)\mhfont.h \ + $(WIN32)\mhinput.h $(WIN32)\mhmain.h $(WIN32)\mhmap.h $(WIN32)\mhmenu.h \ + $(WIN32)\mhmsg.h $(WIN32)\mhmsgwnd.h $(WIN32)\mhrip.h $(WIN32)\mhstatus.h \ + $(WIN32)\mhtext.h $(WIN32)\resource.h $(WIN32)\winMS.h + !ELSE + WINPORT = $(O)nttty.o + WINPFLAG = -DWIN32CON + WINPHDR = + NHRES = $(O)console.res + WINPINC = + !ENDIF + + TILEUTIL16 = $(UTIL)\tile2bmp.exe + TILEBMP16 = $(SRC)\tiles.bmp + + TILEUTIL32 = $(UTIL)\til2bm32.exe + TILEBMP32 = $(SRC)\tiles32.bmp + + # These should be left commented in 3.4.x + # + + #SOUND = $(OBJ)\ntsound.o + #SOUND = + + # 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 + + # You can actually build a set of tiles + # with this makefile even though they + # are not used. Use 'nmake o\nhtiles.bmp' + # + + #========================================== + # Setting up the compiler and linker + # macros. All builds include the base ones. + #========================================== + + CFLAGSBASE = -c $(cflags) $(cvarsmt) -I$(INCL) $(WINPINC) -q $(cdebug) -v + LFLAGSBASE = $(linkdebug) $(verlflags) -L$(bcclib) -v + + #========================================== + # Util builds + #========================================== + + CFLAGSU = $(CFLAGSBASE) $(WINPFLAG) + LFLAGSU = $(LFLAGSBASE) + + #========================================== + # - Game build + #========================================== + + LFLAGSBASE = $(linkdebug) $(conflags) + CFLAGS = $(CFLAGSBASE) $(WINPFLAG) $(DLBFLG) + NHLFLAGS1 = /Gn /v /m /s /Gz /q /c + lflags = $(LFLAGSBASE) $(NHLFLAGS1) + + GAMEFILE = $(FDIR)\$(GAME).exe # whole thing + + ! IF ("$(USE_DLB)"=="Y") + DLB = nhdat + ! ELSE + DLB = + ! ENDIF + + #========================================== + #================ RULES ================== + #========================================== + + .SUFFIXES: .exe .o .til .uu .c .y .l + + #========================================== + # Rules for files in src + #========================================== + + .c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + {$(SRC)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + #========================================== + # Rules for files in sys\share + #========================================== + + {$(SSYS)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + #========================================== + # Rules for files in sys\winnt + #========================================== + + {$(NTSYS)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + {$(NTSYS)}.h{$(INCL)}.h: + @copy $< $@ + + #========================================== + # Rules for files in util + #========================================== + + {$(UTIL)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGSU) -o$@ $< + + #========================================== + # Rules for files in win\share + #========================================== + + {$(WSHR)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + {$(WSHR)}.h{$(INCL)}.h: + @copy $< $@ + + #{$(WSHR)}.txt{$(DAT)}.txt: + # @copy $< $@ + + #========================================== + # Rules for files in win\tty + #========================================== + + {$(TTY)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + #========================================== + # Rules for files in win\win32 + #========================================== + + {$(WIN32)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -o$@ $< + + #========================================== + #================ MACROS ================== + #========================================== + # This section creates shorthand macros for many objects + # referenced later on in the Makefile. + # + + DEFFILE = $(NTSYS)\$(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 + + 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 + + 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.0 + # + TEXT_IO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ + $(O)decl.o $(O)monst.o $(O)objects.o + + GIFREADERS = $(O)gifread.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)monstr.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)teleport.o $(O)timeout.o $(O)topten.o $(O)track.o + VOBJ24 = $(O)trap.o $(O)u_init.o $(O)uhitm.o $(O)vault.o + VOBJ25 = $(O)vis_tab.o $(O)vision.o $(O)weapon.o $(O)were.o + VOBJ26 = $(O)wield.o $(O)windows.o $(O)wizard.o $(O)worm.o + VOBJ27 = $(O)worn.o $(O)write.o $(O)zap.o + + DLBOBJ = $(O)dlb.o + + TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o + + SOBJ = $(O)winnt.o $(O)pcsys.o $(O)pcunix.o \ + $(SOUND) $(O)pcmain.o $(O)mapimail.o $(O)nhlan.o + + 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) + + TILOBJ = $(WINPORT) + + VVOBJ = $(O)version.o + + ALLOBJ = $(TILOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) + + + !IF "$(GRAPHICAL)" == "Y" + OPTIONS_FILE = $(DAT)\guioptions + !ELSE + OPTIONS_FILE = $(DAT)\ttyoptions + !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 $(INCL)\nhlan.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)\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 + + # + # The name of the game. + # + + GAMEFILE = $(GAMEDIR)\$(GAME).exe + + #========================================== + #=============== TARGETS ================== + #========================================== + + # + # The default make target (so just typing 'nmake' is useful). + # + default : $(GAMEFILE) + + # + # The main target. + # + + $(GAME): $(O)obj.tag $(O)utility.tag graphicschk $(GAMEFILE) + @echo $(GAME) is up to date. + + # + # Everything + # + + all : install + + install: graphicschk $(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 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 $(DOC)\guidebook.txt copy $(DOC)\guidebook.txt $(GAMEDIR)\Guidebook.txt + if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt + if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR)\recover.txt + @if exist $(SRC)\$(GAME).PDB copy $(SRC)\$(GAME).pdb $(GAMEDIR)\$(GAME).pdb + @if exist $(GAMEDIR)\$(GAME).PDB echo NOTE: You may want to remove $(GAMEDIR)\$(GAME).pdb to conserve space + -copy $(NTSYS)\defaults.nh $(GAMEDIR)\defaults.nh + copy $(U)recover.exe $(GAMEDIR) + echo install done > $@ + + # copy $(NTSYS)\winnt.hlp $(GAMEDIR) + + $(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)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 > $(O)sp_lev.tag + + $(O)utility.tag: $(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)recover.exe $(TILEUTIL16) + @echo utilities made >$@ + @echo utilities made. + + tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe + @echo Optional tile development utilities are up to date. + + !IF "$(GRAPHICAL)"=="Y" + $(NHRES): $(TILEBMP16) $(WIN32)\winhack.rc $(WIN32)\mnsel.bmp \ + $(WIN32)\mnselcnt.bmp $(WIN32)\mnunsel.bmp \ + $(WIN32)\petmark.bmp $(WIN32)\NetHack.ico $(WIN32)\rip.bmp \ + $(WIN32)\splash.bmp + @$(rc) -r -fo$@ -i$(WIN32) -i$(bccinc) -dNDEBUG $(WIN32)\winhack.rc + !ELSE + $(NHRES): $(NTSYS)\console.rc $(NTSYS)\NetHack.ico + @$(rc) -r -fo$@ -i$(NTSYS) -i$(bccinc) -dNDEBUG $(NTSYS)\console.rc + !ENDIF + + #========================================== + # The main target. + #========================================== + + $(SRC)\uuid.lib: $(bcclib)\uuid.lib + @copy $(bcclib)\uuid.lib $@ + + $(GAMEFILE) : $(ALLOBJ) $(NHRES) $(SRC)\uuid.lib + @echo Linking.... + @$(link) $(lflags) $(startobjg) $(ALLOBJ), $@, $(GAME).map,$(libsmt),,$(NHRES) + @if exist $(O)install.tag del $(O)install.tag + @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak + + $(GAME)_.ico : $(NTSYS)\$(GAME).ico + @copy $(NTSYS)\$(GAME).ico $@ + + #========================================== + # Create directory for holding object files + #========================================== + + $(O)obj.tag: + @if not exist $(O)*.* mkdir $(OBJ) + @echo directory $(OBJ) created >$@ + + #========================================== + # Notify of any CL environment variables + # in effect since they change the compiler + # options. + #========================================== + + graphicschk: + ! IF "$(GRAPHICAL)"=="Y" + @echo ---- + @echo NOTE: This build will include tile support. + @echo ---- + ! ENDIF + @echo graphicschk > graphicschk + + # + # Secondary Targets. + # + + #========================================== + # Makedefs Stuff + #========================================== + + $(U)makedefs.exe: $(O)obj.tag $(MAKEOBJS) $(SRC)\uuid.lib + @$(link) $(LFLAGSU) $(startobj) $(MAKEOBJS), $@,,$(libsmt) + + $(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 + $(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) $(startobj) $(O)\uudecode.o, $@,,$(libsmt) + + $(O)uudecode.o: $(SSYS)\uudecode.c + + $(NTSYS)\NetHack.ico : $(U)uudecode.exe $(NTSYS)\nhico.uu + chdir $(NTSYS) + ..\..\util\uudecode.exe nhico.uu + chdir ..\..\src + + $(WIN32)\NetHack.ico : $(U)uudecode.exe $(NTSYS)\nhico.uu + chdir $(WIN32) + ..\..\util\uudecode.exe ../../sys/winnt/nhico.uu + chdir ..\..\src + + $(WIN32)\mnsel.bmp: $(U)uudecode.exe $(WIN32)\mnsel.uu + chdir $(WIN32) + ..\..\util\uudecode.exe mnsel.uu + chdir ..\..\src + + $(WIN32)\mnselcnt.bmp: $(U)uudecode.exe $(WIN32)\mnselcnt.uu + chdir $(WIN32) + ..\..\util\uudecode.exe mnselcnt.uu + chdir ..\..\src + + $(WIN32)\mnunsel.bmp: $(U)uudecode.exe $(WIN32)\mnunsel.uu + chdir $(WIN32) + ..\..\util\uudecode.exe mnunsel.uu + chdir ..\..\src + + $(WIN32)\petmark.bmp: $(U)uudecode.exe $(WIN32)\petmark.uu + chdir $(WIN32) + ..\..\util\uudecode.exe petmark.uu + chdir ..\..\src + + $(WIN32)\rip.bmp: $(U)uudecode.exe $(WIN32)\rip.uu + chdir $(WIN32) + ..\..\util\uudecode.exe rip.uu + chdir ..\..\src + + $(WIN32)\splash.bmp: $(U)uudecode.exe $(WIN32)\splash.uu + chdir $(WIN32) + ..\..\util\uudecode.exe splash.uu + chdir ..\..\src + + #========================================== + # Level Compiler Stuff + #========================================== + + LEVCFLAGS=$(cflags) -DWIN32 -D_WIN32 -D_MT -I..\include $(cdebug) -DDLB + + $(U)lev_comp.exe: $(SPLEVOBJS) $(SRC)\uuid.lib + @echo Linking $@... + @$(link) $(LFLAGSU) $(startobj) $(SPLEVOBJS), $@,,$(libsmt) + + $(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) -D__IO_H -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)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y + ! IF "$(DO_YACC)"=="YACC_ACT" + chdir $(UTIL) + $(YACC) -d lev_comp.y + copy $(YTABC) lev_yacc.c + copy $(YTABH) $(INCL)\lev_comp.h + @del $(YTABC) + @del $(YTABH) + chdir $(SRC) + ! ELSE + @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 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 + ! ENDIF + + $(U)lev_$(LEX).c: $(U)lev_comp.l + ! IF "$(DO_LEX)"=="LEX_ACT" + chdir $(UTIL) + $(LEX) $(FLEXSKEL) lev_comp.l + copy $(LEXYYC) $@ + @del $(LEXYYC) + chdir $(SRC) + ! ELSE + @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). + @echo --- + @echo For now, we will copy the prebuilt lev_lex.c + @echo from $(SSYS) into $(UTIL) and use it. + @copy $(SSYS)\lev_lex.c $@ >nul + @echo /**/ >>$@ + ! ENDIF + + #========================================== + # Dungeon Compiler Stuff + #========================================== + + $(U)dgn_comp.exe: $(DGNCOMPOBJS) $(SRC)\uuid.lib + @echo Linking $@... + @$(link) $(LFLAGSU) $(startobj) $(DGNCOMPOBJS), $@,,$(libsmt) + + + $(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) -D__IO_H -o$@ $(U)dgn_$(LEX).c + + $(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c + @$(cc) $(LEVCFLAGS) -o$@ $(U)dgn_main.c + + $(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y + ! IF "$(DO_YACC)"=="YACC_ACT" + chdir $(UTIL) + $(YACC) -d dgn_comp.y + copy $(YTABC) dgn_yacc.c + copy $(YTABH) $(INCL)\dgn_comp.h + @del $(YTABC) + @del $(YTABH) + chdir $(SRC) + ! ELSE + @echo $(U)dgn_comp.y has changed. To update dgn_yacc.c and + @echo $(INCL)\dgn_comp.h run $(YACC). + @echo --- + @echo For now, 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 + ! ENDIF + + $(U)dgn_$(LEX).c: $(U)dgn_comp.l + ! IF "$(DO_LEX)"=="LEX_ACT" + chdir $(UTIL) + $(LEX) $(FLEXSKEL) dgn_comp.l + copy $(LEXYYC) $@ + @del $(LEXYYC) + chdir $(SRC) + ! ELSE + @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). + @echo --- + @echo For now, we will copy the prebuilt dgn_lex.c + @echo from $(SSYS) into $(UTIL) and use it. + @copy $(SSYS)\dgn_lex.c $@ >nul + @echo /**/ >>$@ + ! ENDIF + + + #========================================== + #=========== 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 $(SRC)\uuid.lib + @$(link) $(LFLAGSU) $(startobj) $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o, $@,,$(libsmt) + + + $(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: $(NTSYS)\porthelp + @copy $(NTSYS)\porthelp $@ >nul + + 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)\porthelp \ + $(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 $(SRC)\nhdat + cd $(SRC) + + #========================================== + # Recover Utility + #========================================== + + $(U)recover.exe: $(RECOVOBJS) $(SRC)\uuid.lib + @$(link) $(LFLAGSU) $(startobj) $(RECOVOBJS), $@,,$(libsmt) + + + $(O)recover.o: $(CONFIG_H) $(U)recover.c $(INCL)\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 $(SRC)\uuid.lib + @$(link) $(LFLAGSU) $(startobj) $(O)tilemap.o, $@,,$(libsmt) + + + $(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) + @$(cc) $(CFLAGSU) -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)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 + + #========================================== + # Optional Tile Utilities + #========================================== + + $(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) $(SRC)\uuid.lib + @echo Linking $@... + @$(link) $(LFLAGSU) $(startobj) $(GIFREADERS) $(TEXT_IO), $@,,$(libsmt) + + + $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) $(SRC)\uuid.lib + @echo Linking $@... + @$(link) $(LFLAGSU) $(startobj) $(PPMWRITERS) $(TEXT_IO), $@,,$(libsmt) + + + !IF "$(GRAPHICAL)"=="Y" + $(TILEBMP16): $(TILEUTIL16) $(TILEFILES) + @echo Creating 16x16 binary tile files (this may take some time) + @$(U)tile2bmp $(TILEBMP16) + !ENDIF + + $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) $(SRC)\uuid.lib + @echo Linking $@... + @$(link) $(LFLAGSU) $(startobj) $(O)tile2bmp.o $(TEXT_IO), $@,,$(libsmt) + + + $(O)tile2bmp.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(INCL)\win32api.h + @$(cc) $(CFLAGS) -I$(WSHR) /DPACKED_FILE -o$@ $(WSHR)\tile2bmp.c + + #========================================== + # Housekeeping + #========================================== + + spotless: clean + ! IF ("$(OBJ)"!="") + -rmdir $(OBJ) /s /Q + ! 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)\???-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)\bigroom.lev del $(DAT)\bigroom.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 $(O)sp_lev.tag del $(O)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 $(U)recover.exe del $(U)recover.exe + if exist nhdat. del nhdat. + + 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)lev_comp.exe del $(U)lev_comp.exe + if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe + if exist $(SRC)\*.lnk del $(SRC)\*.lnk + if exist $(SRC)\*.map del $(SRC)\*.map + if exist $(TILEBMP16) del $(TILEBMP16) + + #=================================================================== + # 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)\dungeon: $(O)utility.tag $(DAT)\dungeon.def + $(U)makedefs -e + cd $(DAT) + $(U)dgn_comp dungeon.pdf + cd $(SRC) + + # + # NT dependencies + # + + $(O)nttty.o: $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(NTSYS)\nttty.c + @$(cc) $(CFLAGS) -I$(WSHR) -o$@ $(NTSYS)\nttty.c + $(O)winnt.o: $(HACK_H) $(INCL)\win32api.h $(NTSYS)\winnt.c + @$(cc) $(CFLAGS) -o$@ $(NTSYS)\winnt.c + $(O)ntsound.o: $(HACK_H) $(NTSYS)\ntsound.c + @$(cc) $(CFLAGS) -o$@ $(NTSYS)\ntsound.c + $(O)mapimail.o: $(HACK_H) $(INCL)\nhlan.h $(NTSYS)\mapimail.c + @$(cc) $(CFLAGS) -DMAPI_VERBOSE -o$@ $(NTSYS)\mapimail.c + + # + # util dependencies + # + + $(O)panic.o: $(U)panic.c $(CONFIG_H) + @$(cc) $(CFLAGS) -o$@ $(U)panic.c + + # + # The rest are stolen from sys/unix/Makefile.src, + # with slashes changed to back-slashes + # and -c (which is included in CFLAGS) substituted + # 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) $(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)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)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)\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) -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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnbind.c + $(O)gnglyph.o: ..\win\gnome\gnglyph.c ..\win\gnome\gnglyph.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnmenu.c + $(O)gnmesg.o: ..\win\gnome\gnmesg.c ..\win\gnome\gnmesg.h ..\win\gnome\gnsignal.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnopts.c + $(O)gnplayer.o: ..\win\gnome\gnplayer.c ..\win\gnome\gnplayer.h \ + ..\win\gnome\gnmain.h $(HACK_H) + $(cc) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnplayer.c + $(O)gnsignal.o: ..\win\gnome\gnsignal.c ..\win\gnome\gnsignal.h \ + ..\win\gnome\gnmain.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gntext.c + $(O)gnyesno.o: ..\win\gnome\gnyesno.c ..\win\gnome\gnbind.h ..\win\gnome\gnyesno.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) -o$@ ..\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) $(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)tile.o: 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: allmain.c $(HACK_H) + $(O)alloc.o: alloc.c $(CONFIG_H) + $(O)apply.o: apply.c $(HACK_H) $(INCL)\edog.h + $(O)artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h + $(O)attrib.o: attrib.c $(HACK_H) $(INCL)\artifact.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) $(INCL)\edog.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) $(INCL)\edog.h + $(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h + $(O)dokick.o: dokick.c $(HACK_H) $(INCL)\eshk.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)\eshk.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) $(INCL)\artifact.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) $(INCL)\epri.h $(INCL)\emin.h \ + $(INCL)\edog.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 $(INCL)\edog.h + $(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h + $(O)minion.o: minion.c $(HACK_H) $(INCL)\emin.h $(INCL)\epri.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) $(INCL)\artifact.h + $(O)mkroom.o: mkroom.c $(HACK_H) + $(O)mon.o: mon.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h + $(O)mondata.o: mondata.c $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.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)\dungeon.h $(INCL)\eshk.h $(INCL)\vault.h \ + $(INCL)\epri.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) $(INCL)\edog.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) $(INCL)\epri.h $(INCL)\edog.h + $(O)polyself.o: polyself.c $(HACK_H) + $(O)potion.o: potion.c $(HACK_H) + $(O)pray.o: pray.c $(HACK_H) $(INCL)\epri.h + $(O)priest.o: priest.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h \ + $(INCL)\epri.h $(INCL)\emin.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) $(INCL)\eshk.h + $(O)shknam.o: shknam.c $(HACK_H) $(INCL)\eshk.h + $(O)sit.o: sit.c $(HACK_H) $(INCL)\artifact.h + $(O)sounds.o: sounds.c $(HACK_H) $(INCL)\edog.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)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) $(INCL)\vault.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)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 + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/winnt/Makefile.gcc Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,1309 ---- + # SCCS Id: @(#)Makefile.gcc 3.4 2002/02/04 + # Copyright (c) NetHack PC Development Team 1993-2002 + # + # NetHack 3.4.x Makefile for MinGW + # + # Win32 Compilers Tested: + # - gcc version 2.95.3-6 + # + # If you don't have this compiler, you can get it at: + # http://www.mingw.org/ + # + # This is used for building a TTY version of NetHack using + # WIN32 Console I/O only. + # + # 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. + # + # -- + # Dion Nicolaas + #============================================================================== + # Graphical interface + # Don't uncomment this line for 3.4.0 + # Set to Y for a graphical version + # Set to anything else (or undefine) for a tty version + + GRAPHICAL = N + + # Debug + # Set to Y for Debug support (to produce debug information) + # Set to anything else (or undefine) for a "release" version + # You can set your debug options below. + + DEBUG = Y + + cc = gcc + rc = windres + link = gcc + + cflags = + lflags = + ifeq "$(DEBUG)" "Y" + cdebug = -g + linkdebug = -g + else + cdebug = + linkdebug = + endif + + # + # Set the gamedir according to your preference. + # If not present prior to compilation it gets created. + + # Game Name + GAME = NetHack + # Game directory + GAMEDIR = ../binary + + # + # Source directories. Makedefs hardcodes these, don't change them. + # + + # NetHack include files + INCL = ../include + # NetHack data files + DAT = ../dat + # NetHack documentation files + DOC = ../doc + # Utility source + UTIL = ../util + # Main source + SRC = ../src + # Shared system files + SSYS = ../sys/share + # NT Win32 specific files + NTSYS = ../sys/winnt + # window port files (tty) + TTY = ../win/tty + # window port files (Win32) + WIN32 = ../win/win32 + # Tile support files + WSHR = ../win/share + + # + # Object directory. + # + + OBJ = o + + + # + #========================================== + # Exe File 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 + + #LEX = lex + LEX = flex + + # + # - Specify your flex skeleton file (if needed). + # + + FLEXSKEL = + #FLEXSKEL = -S../tools/flex.ske + + YTABC = y_tab.c + YTABH = y_tab.h + LEXYYC = lexyy.c + + # + # Optional high-quality BSD random number generation routines + # (see pcconf.h). Set to nothing if not used. + # + + RANDOM = $(OBJ)/random.o + #RANDOM = + + #=============================================== + #======= End of Modification Section =========== + #=============================================== + ################################################ + # # + # Nothing below here should have to be changed.# + # # + ################################################ + + ifeq "$(GRAPHICAL)" "Y" + WINPORT = $(O)tile.o $(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)winhack.o + # WIN32_IE=0x400 is currently unsupported by MinGW + WINPFLAG = -DTILES -DMSWIN_GRAPHICS -D_WIN32_IE=0x0400 + NHRES = $(O)winhack.o + WINPINC = -I$(WIN32) + WINPHDR = $(WIN32)/mhaskyn.h $(WIN32)/mhdlg.h $(WIN32)/mhfont.h \ + $(WIN32)/mhinput.h $(WIN32)/mhmain.h $(WIN32)/mhmap.h \ + $(WIN32)/mhmenu.h $(WIN32)/mhmsg.h $(WIN32)/mhmsgwnd.h \ + $(WIN32)/mhrip.h $(WIN32)/mhstatus.h \ + $(WIN32)/mhtext.h $(WIN32)/resource.h $(WIN32)/winMS.h + else + WINPORT = $(O)nttty.o + WINPFLAG= -DWIN32CON + WINPHDR = + NHRES = $(O)console.o + WINPINC = + endif + + TILEUTIL16 = $(UTIL)/tile2bmp.exe + TILEBMP16 = $(SRC)/tiles.bmp + + TILEUTIL32 = $(UTIL)/til2bm32.exe + TILEBMP32 = $(SRC)/tiles32.bmp + + # These should be left commented in 3.4.x + # + + #SOUND = $(OBJ)/ntsound.o + #SOUND = + + # 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 + + #========================================== + # Setting up the compiler and linker + # macros. All builds include the base ones. + #========================================== + + CFLAGSBASE = -c $(cflags) -I$(INCL) $(WINPINC) $(cdebug) + LFLAGSBASEC = $(linkdebug) + LFLAGSBASEG = $(linkdebug) -mwindows + + #========================================== + # Util builds + #========================================== + + CFLAGSU = $(CFLAGSBASE) $(WINPFLAG) + LFLAGSU = $(LFLAGSBASEC) + + #========================================== + # - Game build + #========================================== + + CFLAGS = $(CFLAGSBASE) $(WINPFLAG) $(DLBFLG) + lflags = $(LFLAGSBASE) + ifeq "$(GRAPHICAL)" "Y" + lflags = $(LFLAGSBASEG) + else + lflags = $(LFLAGSBASEC) + endif + + GAMEFILE = $(GAMEDIR)/$(GAME).exe # whole thing + + ifeq "$(USE_DLB)" "Y" + DLB = nhdat + else + DLB = + endif + + #========================================== + #================ RULES ================== + #========================================== + + .SUFFIXES: .exe .o .til .uu .c .y .l + + #========================================== + # 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$@ $< + + #========================================== + # Rules for files in sys/winnt + #========================================== + + $(OBJ)/%.o : $(NTSYS)/%.c + @$(cc) $(CFLAGS) -o$@ $< + + $(INCL)/%.h : $(NTSYS)/%.h + @copy $< $@ + + #========================================== + # 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 : $(WIN32)/%.c + @$(cc) $(CFLAGS) -o$@ $< + + #========================================== + #================ MACROS ================== + #========================================== + # This section creates shorthand macros for many objects + # referenced later on in the Makefile. + # + + DEFFILE = $(NTSYS)/$(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 + + 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 + + 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.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 + + # + # 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)monstr.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)teleport.o $(O)timeout.o $(O)topten.o $(O)track.o + VOBJ24 = $(O)trap.o $(O)u_init.o $(O)uhitm.o $(O)vault.o + VOBJ25 = $(O)vis_tab.o $(O)vision.o $(O)weapon.o $(O)were.o + VOBJ26 = $(O)wield.o $(O)windows.o $(O)wizard.o $(O)worm.o + VOBJ27 = $(O)worn.o $(O)write.o $(O)zap.o + + DLBOBJ = $(O)dlb.o + + TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o + + SOBJ = $(O)winnt.o $(O)pcsys.o $(O)pcunix.o \ + $(SOUND) $(O)pcmain.o $(O)mapimail.o $(O)nhlan.o + + 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) + + WINPOBJ = $(WINPORT) + + VVOBJ = $(O)version.o + + ALLOBJ = $(WINPOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) + + ifeq "$(GRAPHICAL)" "Y" + OPTIONS_FILE = $(DAT)/guioptions + else + OPTIONS_FILE = $(DAT)/ttyoptions + 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 $(INCL)/nhlan.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)/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 + + # + # The name of the game. + # + + GAMEFILE = $(GAMEDIR)/$(GAME).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 : $(GAMEFILE) + + # + # The main target. + # + + $(GAME) : $(O)obj.tag $(O)utility.tag graphicschk $(GAMEFILE) + @echo $(GAME) is up to date. + + # + # Everything + # + + all : install + + install: graphicschk $(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) + ifeq "$(USE_DLB)" "Y" + $(subst /,\,copy nhdat $(GAMEDIR)) + $(subst /,\,copy $(DAT)/license $(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 $(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 $(DOC)/recover.txt copy $(DOC)/recover.txt $(GAMEDIR)/recover.txt) + $(subst /,\,@if exist $(SRC)/$(GAME).PDB copy $(SRC)/$(GAME).pdb $(GAMEDIR)/$(GAME).pdb) + $(subst /,\,@if exist $(GAMEDIR)/$(GAME).PDB echo NOTE: You may want to remove $(GAMEDIR)/$(GAME).pdb to conserve space) + $(subst /,\,-copy $(NTSYS)/defaults.nh $(GAMEDIR)/defaults.nh) + $(subst /,\,copy $(U)recover.exe $(GAMEDIR)) + $(subst /,\,echo install done > $@) + + # copy $(NTSYS)/winnt.hlp $(GAMEDIR) + + $(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 /,\,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)) + $(subst /,\,echo sp_levs done > $(O)sp_lev.tag) + + $(O)utility.tag: $(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)recover.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. + + ifeq "$(GRAPHICAL)" "Y" + $(NHRES): $(TILEBMP16) $(WIN32)\winhack.rc $(WIN32)\mnsel.bmp \ + $(WIN32)\mnselcnt.bmp $(WIN32)\mnunsel.bmp \ + $(WIN32)\petmark.bmp $(WIN32)\NetHack.ico $(WIN32)\rip.bmp \ + $(WIN32)\splash.bmp + @$(rc) -o$@ --include-dir $(WIN32) -i $(WIN32)/winhack.rc + else + $(NHRES): $(NTSYS)/console.rc $(NTSYS)/NetHack.ico + @$(rc) -o$@ --include-dir $(NTSYS) -i $(NTSYS)/console.rc + endif + + #========================================== + # The main target. + #========================================== + + $(GAMEFILE) : $(ALLOBJ) $(NHRES) + @echo Linking.... + @$(link) $(lflags) -o$@ $(ALLOBJ) $(NHRES) + $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) + + $(GAME)_.ico : $(NTSYS)/$(GAME).ico + $(subst /,\,@copy $(NTSYS)/$(GAME).ico $@) + + #========================================== + # Create directory for holding object files + #========================================== + + graphicschk: + ifeq "$(GRAPHICAL)" "Y" + @echo ---- + @echo NOTE: This build will include tile support. + @echo ---- + endif + $(subst /,\,@echo graphicschk > graphicschk) + + # + # 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 + $(subst /,\,@if not exist $(O)*.* mkdir $(OBJ)) + @$(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) + + #$(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)/trap.h : $(U)makedefs.exe + # $(U)makedefs -t + + $(SRC)/monstr.c: $(U)makedefs.exe + $(subst /,\,$(U)makedefs -m) + + $(INCL)/vis_tab.h: $(U)makedefs.exe + $(subst /,\,$(U)makedefs -z) + + $(SRC)/vis_tab.c: $(U)makedefs.exe + $(subst /,\,$(U)makedefs -z) + + #========================================== + # uudecode utility and uuencoded targets + #========================================== + + $(U)uudecode.exe: $(O)uudecode.o + @$(link) $(LFLAGSU) -o$@ $(O)uudecode.o + + $(O)uudecode.o: $(SSYS)/uudecode.c + + $(NTSYS)/NetHack.ico : $(U)uudecode.exe $(NTSYS)/nhico.uu + $(subst /,\,chdir $(NTSYS)) & \ + $(subst /,\,uudecode.exe nhico.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/NetHack.ico : $(U)uudecode.exe $(NTSYS)/nhico.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe ../../sys/winnt/nhico.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/mnsel.bmp: $(U)uudecode.exe $(WIN32)/mnsel.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe mnsel.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/mnselcnt.bmp: $(U)uudecode.exe $(WIN32)/mnselcnt.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe mnselcnt.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/mnunsel.bmp: $(U)uudecode.exe $(WIN32)/mnunsel.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe mnunsel.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/petmark.bmp: $(U)uudecode.exe $(WIN32)/petmark.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe petmark.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/rip.bmp: $(U)uudecode.exe $(WIN32)/rip.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe rip.uu) & \ + $(subst /,\,chdir ..\..\src) + + $(WIN32)/splash.bmp: $(U)uudecode.exe $(WIN32)/splash.uu + $(subst /,\,chdir $(WIN32)) & \ + $(subst /,\,..\..\util\uudecode.exe splash.uu) & \ + $(subst /,\,chdir ..\..\src) + + + #========================================== + # Level Compiler Stuff + #========================================== + + LEVCFLAGS=$(cflags) -c -DWIN32 -D_WIN32 -I../include $(cdebug) -DDLB + + $(U)lev_comp.exe: $(SPLEVOBJS) + @echo Linking $@... + @$(link) $(LFLAGSU) -o$@ $(SPLEVOBJS) + + $(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)lev_yacc.c $(INCL)/lev_comp.h : $(U)lev_comp.y + ifeq "$(DO_YACC)" "YACC_ACT" + $(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 + @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 and + @echo lev_comp.h from $(SSYS) into $(UTIL) and use them. + $(subst /,\,@copy $(SSYS)/lev_yacc.c $(U)lev_yacc.c >nul) + $(subst /,\,@copy $(SSYS)/lev_comp.h $(INCL)/lev_comp.h >nul) + @echo /**/ $(subst /,\,>>$(U)lev_yacc.c) + @echo /**/ $(subst /,\,>>$(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 /,\,copy $(LEXYYC) $@) & \ + $(subst /,\,@del $(LEXYYC)) & \ + $(subst /,\,chdir $(SRC)) + else + @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). + @echo --- + @echo For now, we will copy the prebuilt lev_lex.c + @echo from $(SSYS) into $(UTIL) and use it. + $(subst /,\,@copy $(SSYS)/lev_lex.c $@ >nul) + @echo /**/ $(subst /,\,>>$@) + endif + + #========================================== + # Dungeon Compiler Stuff + #========================================== + + $(U)dgn_comp.exe: $(DGNCOMPOBJS) + @echo Linking $@... + @$(link) $(LFLAGSU) -o$@ $(DGNCOMPOBJS) + + + $(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)dgn_yacc.c $(INCL)/dgn_comp.h : $(U)dgn_comp.y + ifeq "$(DO_YACC)" "YACC_ACT" + $(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 + @echo $(U)dgn_comp.y has changed. To update dgn_yacc.c and + @echo $(INCL)/dgn_comp.h run $(YACC). + @echo --- + @echo For now, we will copy the prebuilt $(U)dgn_yacc.c and + @echo dgn_comp.h from $(SSYS) into $(UTIL) and use them. + $(subst /,\,@copy $(SSYS)/dgn_yacc.c $(U)dgn_yacc.c >nul) + $(subst /,\,@copy $(SSYS)/dgn_comp.h $(INCL)/dgn_comp.h >nul) + @echo /**/ $(subst /,\,>>$(U)dgn_yacc.c) + @echo /**/ $(subst /,\,>>$(INCL)/dgn_comp.h) + endif + + $(U)dgn_$(LEX).c: $(U)dgn_comp.l + ifeq "$(DO_LEX)" "LEX_ACT" + $(subst /,\,chdir $(UTIL)) & \ + $(subst /,\,$(LEX) $(FLEXSKEL) dgn_comp.l) & \ + $(subst /,\,copy $(LEXYYC) $@) & \ + $(subst /,\,@del $(LEXYYC)) & \ + chdir $(SRC) + else + @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). + @echo --- + @echo For now, we will copy the prebuilt dgn_lex.c + @echo from $(SSYS) into $(UTIL) and use it. + $(subst /,\,@copy $(SSYS)/dgn_lex.c $@ >nul) + @echo /**/ $(subst /,\,>>$@) + endif + + #========================================== + # Create directory for holding object files + #========================================== + + $(O)obj.tag: + $(subst /,\,@if not exist $(OBJ)/*.* echo creating directory $(OBJ)) + $(subst /,\,@if not exist $(OBJ)/*.* mkdir $(OBJ)) + $(subst /,\,@echo directory created > $@) + + + #========================================== + #=========== SECONDARY TARGETS ============ + #========================================== + + #=========================================== + # Header files NOT distributed in ../include + #=========================================== + + $(INCL)/win32api.h: $(NTSYS)/win32api.h + $(subst /,\,copy $(NTSYS)/win32api.h $@) + + + #========================================== + # 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: $(NTSYS)/porthelp + $(subst /,\,@copy $(NTSYS)/porthelp $@ >nul) + + 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)/porthelp \ + $(DAT)/license $(O)sp_lev.tag + $(subst /,\,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) & \ + $(subst /,\,$(U)dlb_main cIf dlb.lst $(SRC)/nhdat) & \ + $(subst /,\,cd $(SRC)) + + #========================================== + # Recover Utility + #========================================== + + $(U)recover.exe: $(RECOVOBJS) + @$(link) $(LFLAGSU) -o$@ $(RECOVOBJS) + + + $(O)recover.o: $(CONFIG_H) $(U)recover.c $(INCL)/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) + + + ifeq "$(GRAPHICAL)" "Y" + $(TILEBMP16): $(TILEUTIL16) $(TILEFILES) + @echo Creating 16x16 binary tile files (this may take some time) + $(subst /,\,@$(U)tile2bmp $(TILEBMP16)) + #$(TILEBMP32): $(TILEUTIL32) $(TILEFILES32) + # @echo Creating 32x32 binary tile files (this may take some time) + # $(subst /,\,@$(U)til2bm32 $(TILEBMP32)) + else + $(TILEBMP16): + $(TILEBMP32): + endif + + $(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) $(INCL)/win32api.h + @$(cc) $(CFLAGS) -I$(WSHR) -o$@ $(WSHR)/tile2bmp.c + + $(O)til2bm32.o: $(WSHR)/til2bm32.c $(HACK_H) $(TILE_H) $(INCL)/win32api.h + @$(cc) $(CFLAGS) -I$(WSHR) -DTILE_X=32 -DTILE_Y=32 -o$@ $(WSHR)/til2bm32.c + + #========================================== + # Housekeeping + #========================================== + + spotless: clean + ifneq "$(OBJ)" "" + -rmdir $(OBJ) /s /Q + endif + $(subst /,\,if exist graphicschk del graphicschk) + $(subst /,\,if exist $(INCL)/date.h del $(INCL)/date.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)/vis_tab.h del $(INCL)/vis_tab.h) + $(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 $(U)*.lnk del $(U)*.lnk) + $(subst /,\,if exist $(U)*.map del $(U)*.map) + $(subst /,\,if exist $(DAT)/data del $(DAT)/data) + $(subst /,\,if exist $(DAT)/rumors del $(DAT)/rumors) + $(subst /,\,if exist $(DAT)/???-fil?.lev del $(DAT)/???-fil?.lev) + $(subst /,\,if exist $(DAT)/???-goal.lev del $(DAT)/???-goal.lev) + $(subst /,\,if exist $(DAT)/???-loca.lev del $(DAT)/???-loca.lev) + $(subst /,\,if exist $(DAT)/???-strt.lev del $(DAT)/???-strt.lev) + $(subst /,\,if exist $(DAT)/air.lev del $(DAT)/air.lev) + $(subst /,\,if exist $(DAT)/asmodeus.lev del $(DAT)/asmodeus.lev) + $(subst /,\,if exist $(DAT)/astral.lev del $(DAT)/astral.lev) + $(subst /,\,if exist $(DAT)/baalz.lev del $(DAT)/baalz.lev) + $(subst /,\,if exist $(DAT)/bigrm-*.lev del $(DAT)/bigrm-*.lev) + $(subst /,\,if exist $(DAT)/castle.lev del $(DAT)/castle.lev) + $(subst /,\,if exist $(DAT)/data del $(DAT)/data) + $(subst /,\,if exist $(DAT)/dungeon del $(DAT)/dungeon) + $(subst /,\,if exist $(DAT)/dungeon.pdf del $(DAT)/dungeon.pdf) + $(subst /,\,if exist $(DAT)/earth.lev del $(DAT)/earth.lev) + $(subst /,\,if exist $(DAT)/fakewiz?.lev del $(DAT)/fakewiz?.lev) + $(subst /,\,if exist $(DAT)/fire.lev del $(DAT)/fire.lev) + $(subst /,\,if exist $(DAT)/juiblex.lev del $(DAT)/juiblex.lev) + $(subst /,\,if exist $(DAT)/knox.lev del $(DAT)/knox.lev) + $(subst /,\,if exist $(DAT)/medusa-?.lev del $(DAT)/medusa-?.lev) + $(subst /,\,if exist $(DAT)/mine*.lev del $(DAT)/mine*.lev) + $(subst /,\,if exist $(DAT)/options del $(DAT)/options) + $(subst /,\,if exist $(DAT)/ttyoptions del $(DAT)/ttyoptions) + $(subst /,\,if exist $(DAT)/guioptions del $(DAT)/guioptions) + $(subst /,\,if exist $(DAT)/oracle.lev del $(DAT)/oracle.lev) + $(subst /,\,if exist $(DAT)/oracles del $(DAT)/oracles) + $(subst /,\,if exist $(DAT)/orcus.lev del $(DAT)/orcus.lev) + $(subst /,\,if exist $(DAT)/rumors del $(DAT)/rumors) + $(subst /,\,if exist $(DAT)/quest.dat del $(DAT)/quest.dat) + $(subst /,\,if exist $(DAT)/sanctum.lev del $(DAT)/sanctum.lev) + $(subst /,\,if exist $(DAT)/soko?-?.lev del $(DAT)/soko?-?.lev) + $(subst /,\,if exist $(DAT)/tower?.lev del $(DAT)/tower?.lev) + $(subst /,\,if exist $(DAT)/valley.lev del $(DAT)/valley.lev) + $(subst /,\,if exist $(DAT)/water.lev del $(DAT)/water.lev) + $(subst /,\,if exist $(DAT)/wizard?.lev del $(DAT)/wizard?.lev) + $(subst /,\,if exist $(O)sp_lev.tag del $(O)sp_lev.tag) + $(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 $(U)recover.exe del $(U)recover.exe) + $(subst /,\,if exist $(DAT)/dlb.lst del $(DAT)/dlb.lst) + $(subst /,\,if exist nhdat. del nhdat.) + + clean: + $(subst /,\,if exist $(O)*.o del $(O)*.o) + $(subst /,\,if exist $(O)utility.tag del $(O)utility.tag) + $(subst /,\,if exist $(U)makedefs.exe del $(U)makedefs.exe) + $(subst /,\,if exist $(U)lev_comp.exe del $(U)lev_comp.exe) + $(subst /,\,if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe) + $(subst /,\,if exist $(SRC)/*.lnk del $(SRC)/*.lnk) + $(subst /,\,if exist $(SRC)/*.map del $(SRC)/*.map) + $(subst /,\,if exist $(TILEBMP16) del $(TILEBMP16)) + $(subst /,\,if exist $(TILEBMP32) del $(TILEBMP32)) + + #=================================================================== + # OTHER DEPENDENCIES + #=================================================================== + + # + # dat dependencies + # + + $(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)/dungeon: $(O)utility.tag $(DAT)/dungeon.def + $(subst /,\,$(U)makedefs -e) + $(subst /,\,cd $(DAT)) & \ + $(subst /,\,$(U)dgn_comp dungeon.pdf) & \ + $(subst /,\,cd $(SRC)) + + # + # NT dependencies + # + + $(O)nttty.o: $(HACK_H) $(TILE_H) $(INCL)/win32api.h $(NTSYS)/nttty.c + @$(cc) $(CFLAGS) -I$(WSHR) -o$@ $(NTSYS)/nttty.c + $(O)winnt.o: $(HACK_H) $(INCL)/win32api.h $(NTSYS)/winnt.c + @$(cc) $(CFLAGS) -o$@ $(NTSYS)/winnt.c + $(O)ntsound.o: $(HACK_H) $(NTSYS)/ntsound.c + @$(cc) $(CFLAGS) -o$@ $(NTSYS)/ntsound.c + $(O)mapimail.o: $(HACK_H) $(INCL)/nhlan.h $(NTSYS)/mapimail.c + @$(cc) $(CFLAGS) -DMAPI_VERBOSE -o$@ $(NTSYS)/mapimail.c + + # + # util dependencies + # + + $(O)panic.o: $(U)panic.c $(CONFIG_H) + @$(cc) $(CFLAGS) -o$@ $(U)panic.c + + # + # The rest are stolen from sys/unix/Makefile.src, + # and -c (which is included in CFLAGS) substituted + # 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) $(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)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)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)/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) -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) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnbind.c + $(O)gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnmenu.c + $(O)gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnopts.c + $(O)gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ + ../win/gnome/gnmain.h $(HACK_H) + $(cc) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnplayer.c + $(O)gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ + ../win/gnome/gnmain.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gntext.c + $(O)gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h + $(cc) $(CFLAGS) $(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) $(CFLAGS) -o$@ ../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) $(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)tile.o: 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: allmain.c $(HACK_H) + $(O)alloc.o: alloc.c $(CONFIG_H) + $(O)apply.o: apply.c $(HACK_H) $(INCL)/edog.h + $(O)artifact.o: artifact.c $(HACK_H) $(INCL)/artifact.h $(INCL)/artilist.h + $(O)attrib.o: attrib.c $(HACK_H) $(INCL)/artifact.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) $(INCL)/edog.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) $(INCL)/edog.h + $(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/edog.h + $(O)dokick.o: dokick.c $(HACK_H) $(INCL)/eshk.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)/eshk.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) $(INCL)/artifact.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) $(INCL)/epri.h $(INCL)/emin.h \ + $(INCL)/edog.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 $(INCL)/edog.h + $(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)/artifact.h $(INCL)/edog.h + $(O)minion.o: minion.c $(HACK_H) $(INCL)/emin.h $(INCL)/epri.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) $(INCL)/artifact.h + $(O)mkroom.o: mkroom.c $(HACK_H) + $(O)mon.o: mon.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/edog.h + $(O)mondata.o: mondata.c $(HACK_H) $(INCL)/eshk.h $(INCL)/epri.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)/dungeon.h $(INCL)/eshk.h $(INCL)/vault.h \ + $(INCL)/epri.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) $(INCL)/edog.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) $(INCL)/epri.h $(INCL)/edog.h + $(O)polyself.o: polyself.c $(HACK_H) + $(O)potion.o: potion.c $(HACK_H) + $(O)pray.o: pray.c $(HACK_H) $(INCL)/epri.h + $(O)priest.o: priest.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/eshk.h \ + $(INCL)/epri.h $(INCL)/emin.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) $(INCL)/eshk.h + $(O)shknam.o: shknam.c $(HACK_H) $(INCL)/eshk.h + $(O)sit.o: sit.c $(HACK_H) $(INCL)/artifact.h + $(O)sounds.o: sounds.c $(HACK_H) $(INCL)/edog.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)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) $(INCL)/vault.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)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 + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/winnt/Makefile.msc Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,1345 ---- + # SCCS Id: @(#)Makefile.nt 3.4 2002/02/28 + # Copyright (c) NetHack PC Development Team 1993-2001 + # + # NetHack 3.4.x Makefile for MS Visual C++ V6.x and above and MS NMAKE + # + # Win32 Compilers Tested: + # - Microsoft 32 bit Visual C++ V4.x + # - Microsoft 32 bit Visual C++ V6.0 SP3, SP4 + # + # This is used for building a TTY version of NetHack using WIN32 Console + # I/O routines only. + # + # 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. + # -- + # Michael Allison + #============================================================================== + # Do not delete the following 3 lines. + # + TARGETOS=BOTH + APPVER=4.0 + !include + + # Graphical interface + # Set to Y for a graphical version + + #GRAPHICAL = Y + + # + # Set the gamedir according to your preference. + # If not present prior to compilation it gets created. + + GAME = NetHack # Game Name + GAMEDIR = ..\binary # Game directory + + # + # 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 (Win32) + WSHR = ..\win\share # Tile support files + + # + # Object directory. + # + + OBJ = o + + + # + #========================================== + # Exe File 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 + + #LEX = lex + LEX = flex + + # + # - Specify your flex skeleton file (if needed). + # + + FLEXSKEL = + #FLEXSKEL = -S../tools/flex.ske + + YTABC = y_tab.c + YTABH = y_tab.h + LEXYYC = lexyy.c + + # + # Optional high-quality BSD random number generation routines + # (see pcconf.h). Set to nothing if not used. + # + + RANDOM = $(OBJ)\random.o + #RANDOM = + + # + # - For debugging ability, comment out the upper two + # macros and uncomment the lower two. + # + + # + # Leave the next two lines uncommented _ONLY_ if you do NOT want any + # debug capability in the object files, or in the NetHack executable. + # Comment them if you want debug capability. + + #cdebug = + #linkdebug = + + # + # Compiler and Linker flags + # + + PRECOMPHEAD = N # set to Y if you want to use precomp. headers + + #=============================================== + #======= End of Modification Section =========== + #=============================================== + ################################################ + # # + # Nothing below here should have to be changed.# + # # + ################################################ + + !IF "$(GRAPHICAL)" == "Y" + WINPORT = $(O)tile.o $(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)winhack.o + WINPFLAG = -DTILES -DMSWIN_GRAPHICS + NHRES = $(O)winhack.res + WINPINC = -I$(WIN32) + WINPHDR = $(WIN32)\mhaskyn.h $(WIN32)\mhdlg.h $(WIN32)\mhfont.h \ + $(WIN32)\mhinput.h $(WIN32)\mhmain.h $(WIN32)\mhmap.h $(WIN32)\mhmenu.h \ + $(WIN32)\mhmsg.h $(WIN32)\mhmsgwnd.h $(WIN32)\mhrip.h $(WIN32)\mhstatus.h \ + $(WIN32)\mhtext.h $(WIN32)\resource.h $(WIN32)\winMS.h + !ELSE + WINPORT = $(O)nttty.o + WINPFLAG = -DWIN32CON + WINPHDR = + NHRES = $(O)console.res + WINPINC = + !ENDIF + + TILEUTIL16 = $(UTIL)\tile2bmp.exe + TILEBMP16 = $(SRC)\tiles.bmp + + TILEUTIL32 = $(UTIL)\til2bm32.exe + TILEBMP32 = $(SRC)\tiles32.bmp + + #SOUND = $(OBJ)\ntsound.o + + #SOUND = + + # 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 + + #========================================== + # Setting up the compiler and linker + # macros. All builds include the base ones. + #========================================== + + CFLAGSBASE = -c $(cflags) $(cvarsmt) -I$(INCL) -nologo $(cdebug) $(WINPINC) + 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) + + #========================================== + # - Game build + #========================================== + LFLAGSBASE = $(linkdebug) /NODEFAULTLIB /INCREMENTAL:NO /RELEASE /NOLOGO -subsystem:console,4.0 $(conlibsmt) + CFLAGS = $(CFLAGSBASE) $(WINPFLAG) $(DLBFLG) + NHLFLAGS1 = /NODEFAULTLIB /INCREMENTAL:NO /PDB:"$(GAME).PDB" /RELEASE /NOLOGO + NHLFLAGS2 = /MAP:"$(GAME).MAP" /MACHINE:$(CPU) -IGNORE:505 + !IF ("$(GRAPHICAL)"=="Y") + LFLAGS = $(LFLAGSBASEG) $(NHLFLAGS1) $(NHLFLAGS2) + !ELSE + LFLAGS = $(LFLAGSBASEC) $(NHLFLAGS1) $(NHLFLAGS2) + !ENDIF + + GAMEFILE = $(GAMEDIR)\$(GAME).exe # whole thing + + ! IF ("$(USE_DLB)"=="Y") + DLB = nhdat + ! ELSE + DLB = + ! ENDIF + + #========================================== + #================ RULES ================== + #========================================== + + .SUFFIXES: .exe .o .til .uu .c .y .l + + #========================================== + # Rules for files in src + #========================================== + + .c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -Fo$@ $< + + {$(SRC)}.c{$(OBJ)}.o: + @$(CC) $(CFLAGS) -Fo$@ $< + + #========================================== + # Rules for files in sys\share + #========================================== + + {$(SSYS)}.c{$(OBJ)}.o: + @$(CC) $(CFLAGS) -Fo$@ $< + + #========================================== + # Rules for files in sys\winnt + #========================================== + + {$(NTSYS)}.c{$(OBJ)}.o: + @$(CC) $(CFLAGS) -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) $(CFLAGS) -Fo$@ $< + + {$(WSHR)}.h{$(INCL)}.h: + @copy $< $@ + + #{$(WSHR)}.txt{$(DAT)}.txt: + # @copy $< $@ + + #========================================== + # Rules for files in win\tty + #========================================== + + {$(TTY)}.c{$(OBJ)}.o: + @$(CC) $(CFLAGS) -Fo$@ $< + + + #========================================== + # Rules for files in win\win32 + #========================================== + + {$(WIN32)}.c{$(OBJ)}.o: + @$(cc) $(CFLAGS) -Fo$@ $< + + #========================================== + #================ MACROS ================== + #========================================== + # This section creates shorthand macros for many objects + # referenced later on in the Makefile. + # + + DEFFILE = $(NTSYS)\$(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 + + 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 + + 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.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 + + # + # 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)pcmain.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)monstr.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)teleport.o $(O)timeout.o $(O)topten.o $(O)track.o + VOBJ24 = $(O)trap.o $(O)u_init.o $(O)uhitm.o $(O)vault.o + VOBJ25 = $(O)vis_tab.o $(O)vision.o $(O)weapon.o $(O)were.o + VOBJ26 = $(O)wield.o $(O)windows.o $(O)wizard.o $(O)worm.o + VOBJ27 = $(O)worn.o $(O)write.o $(O)zap.o + + DLBOBJ = $(O)dlb.o + + TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o + + SOBJ = $(O)winnt.o $(O)pcsys.o $(O)pcunix.o \ + $(SOUND) $(O)mapimail.o $(O)nhlan.o + + 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) + + WINPOBJ = $(WINPORT) + + VVOBJ = $(O)version.o + + ALLOBJ = $(WINPOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) + + !IF "$(GRAPHICAL)" == "Y" + OPTIONS_FILE = $(DAT)\guioptions + !ELSE + OPTIONS_FILE = $(DAT)\ttyoptions + !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 $(INCL)\nhlan.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)\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 + + # + # The name of the game. + # + + GAMEFILE = $(GAMEDIR)\$(GAME).exe + + #========================================== + #=============== TARGETS ================== + #========================================== + + # + # The default make target (so just typing 'nmake' is useful). + # + default : $(GAMEFILE) + + # + # The main target. + # + + $(GAME): $(O)obj.tag $(O)utility.tag envchk $(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 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 $(DOC)\guidebook.txt copy $(DOC)\guidebook.txt $(GAMEDIR)\Guidebook.txt + if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt + if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR)\recover.txt + @if exist $(SRC)\$(GAME).PDB copy $(SRC)\$(GAME).pdb $(GAMEDIR)\$(GAME).pdb + @if exist $(GAMEDIR)\$(GAME).PDB echo NOTE: You may want to remove $(GAMEDIR)\$(GAME).pdb to conserve space + -copy $(NTSYS)\defaults.nh $(GAMEDIR)\defaults.nh + copy $(U)recover.exe $(GAMEDIR) + echo install done > $@ + + # copy $(NTSYS)\winnt.hlp $(GAMEDIR) + + $(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)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 > $(O)sp_lev.tag + + $(O)utility.tag: $(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)recover.exe + @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. + + !IF "$(GRAPHICAL)"=="Y" + $(NHRES): $(TILEBMP16) $(WIN32)\winhack.rc $(WIN32)\mnsel.bmp \ + $(WIN32)\mnselcnt.bmp $(WIN32)\mnunsel.bmp \ + $(WIN32)\petmark.bmp $(WIN32)\NetHack.ico $(WIN32)\rip.bmp \ + $(WIN32)\splash.bmp + @$(rc) -r -fo$@ -i$(WIN32) -dNDEBUG $(WIN32)\winhack.rc + !ELSE + $(NHRES): $(NTSYS)\console.rc $(NTSYS)\NetHack.ico + @$(rc) -r -fo$@ -i$(NTSYS) -dNDEBUG $(NTSYS)\console.rc + !ENDIF + + #========================================== + # The main target. + #========================================== + + # 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 + # <+>. + # + # DO NOT INDENT THE << below! + # + + $(GAMEFILE) : $(ALLOBJ) $(NHRES) + @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) + @echo Linking.... + $(link) $(LFLAGS) -out:$@ @<<$(GAME).lnk + $(ALLOBJ:^ =^ + ) $(NHRES) + << + @if exist $(O)install.tag del $(O)install.tag + @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak + + # + # Secondary 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 + + $(NTSYS)\NetHack.ico : $(U)uudecode.exe $(NTSYS)\nhico.uu + chdir $(NTSYS) + ..\..\util\uudecode.exe nhico.uu + chdir ..\..\src + + $(WIN32)\NetHack.ico : $(U)uudecode.exe $(NTSYS)\nhico.uu + chdir $(WIN32) + ..\..\util\uudecode.exe ../../sys/winnt/nhico.uu + chdir ..\..\src + + $(WIN32)\mnsel.bmp: $(U)uudecode.exe $(WIN32)\mnsel.uu + chdir $(WIN32) + ..\..\util\uudecode.exe mnsel.uu + chdir ..\..\src + + $(WIN32)\mnselcnt.bmp: $(U)uudecode.exe $(WIN32)\mnselcnt.uu + chdir $(WIN32) + ..\..\util\uudecode.exe mnselcnt.uu + chdir ..\..\src + + $(WIN32)\mnunsel.bmp: $(U)uudecode.exe $(WIN32)\mnunsel.uu + chdir $(WIN32) + ..\..\util\uudecode.exe mnunsel.uu + chdir ..\..\src + + $(WIN32)\petmark.bmp: $(U)uudecode.exe $(WIN32)\petmark.uu + chdir $(WIN32) + ..\..\util\uudecode.exe petmark.uu + chdir ..\..\src + + $(WIN32)\rip.bmp: $(U)uudecode.exe $(WIN32)\rip.uu + chdir $(WIN32) + ..\..\util\uudecode.exe rip.uu + chdir ..\..\src + + $(WIN32)\splash.bmp: $(U)uudecode.exe $(WIN32)\splash.uu + chdir $(WIN32) + ..\..\util\uudecode.exe splash.uu + chdir ..\..\src + + #========================================== + # Level Compiler Stuff + #========================================== + + LEVCFLAGS=-c -nologo -DWINVER=0x0400 -DWIN32 -D_WIN32 \ + -D_MT -MT -I..\include -nologo -Z7 -Od -DDLB + + $(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 + ! IF "$(DO_YACC)"=="YACC_ACT" + chdir $(UTIL) + $(YACC) -d lev_comp.y + copy $(YTABC) lev_yacc.c + copy $(YTABH) $(INCL)\lev_comp.h + @del $(YTABC) + @del $(YTABH) + chdir $(SRC) + ! ELSE + @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 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 + ! ENDIF + + $(U)lev_$(LEX).c: $(U)lev_comp.l + ! IF "$(DO_LEX)"=="LEX_ACT" + chdir $(UTIL) + $(LEX) $(FLEXSKEL) lev_comp.l + copy $(LEXYYC) $@ + @del $(LEXYYC) + chdir $(SRC) + ! ELSE + @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). + @echo --- + @echo For now, we will copy the prebuilt lev_lex.c + @echo from $(SSYS) into $(UTIL) and use it. + @copy $(SSYS)\lev_lex.c $@ >nul + @echo /**/ >>$@ + ! ENDIF + + #========================================== + # 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 + ! IF "$(DO_YACC)"=="YACC_ACT" + chdir $(UTIL) + $(YACC) -d dgn_comp.y + copy $(YTABC) dgn_yacc.c + copy $(YTABH) $(INCL)\dgn_comp.h + @del $(YTABC) + @del $(YTABH) + chdir $(SRC) + ! ELSE + @echo $(U)dgn_comp.y has changed. To update dgn_yacc.c and + @echo $(INCL)\dgn_comp.h run $(YACC). + @echo --- + @echo For now, 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 + ! ENDIF + + $(U)dgn_$(LEX).c: $(U)dgn_comp.l + ! IF "$(DO_LEX)"=="LEX_ACT" + chdir $(UTIL) + $(LEX) $(FLEXSKEL) dgn_comp.l + copy $(LEXYYC) $@ + @del $(LEXYYC) + chdir $(SRC) + ! ELSE + @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). + @echo --- + @echo For now, we will copy the prebuilt dgn_lex.c + @echo from $(SSYS) into $(UTIL) and use it. + @copy $(SSYS)\dgn_lex.c $@ >nul + @echo /**/ >>$@ + ! ENDIF + + #========================================== + # 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 + ! IF "$(GRAPHICAL)"=="Y" + @echo ---- + @echo NOTE: This build will include tile support. + @echo ---- + ! ENDIF + + #========================================== + #=========== 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) $(CFLAGS) /Fo$@ $(SRC)\dlb.c + + $(O)dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(INCL)\dlb.h + @$(CC) $(CFLAGS) /Fo$@ $(UTIL)\dlb_main.c + + $(DAT)\porthelp: $(NTSYS)\porthelp + @copy $(NTSYS)\porthelp $@ >nul + + 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)\porthelp \ + $(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 $(SRC)\nhdat + cd $(SRC) + + #========================================== + # Recover Utility + #========================================== + + $(U)recover.exe: $(RECOVOBJS) + @$(link) $(LFLAGSU) -out:$@ $(RECOVOBJS) + + $(O)recover.o: $(CONFIG_H) $(U)recover.c $(INCL)\win32api.h + @$(CC) $(CFLAGSU) -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 + @$(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) $(CFLAGS) /DTILETEXT /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tilemap.c + + $(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) + @$(CC) $(CFLAGS) /DTILETEXT -Fo$@ $(WSHR)\tilemap.c + + $(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) + @$(CC) $(CFLAGS) -I$(WSHR) -Fo$@ $(WSHR)\gifread.c + + $(O)gifrd32.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) + @$(CC) $(CFLAGS) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\gifread.c + + $(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(TILE_H) + @$(CC) $(CFLAGS) -I$(WSHR) -Fo$@ $(WSHR)\ppmwrite.c + + $(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) + @$(CC) $(CFLAGS) -I$(WSHR) -Fo$@ $(WSHR)\tiletext.c + + $(O)tilete32.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) + @$(CC) $(CFLAGS) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tiletext.c + + #========================================== + # Optional Tile Utilities + #========================================== + + $(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) + @echo Linking $@... + @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk + $(GIFREADERS:^ =^ + ) + $(TEXT_IO:^ =^ + ) + << + + $(U)gif2tx32.exe: $(GIFREADERS32) $(TEXT_IO32) + @echo Linking $@... + @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk + $(GIFREADERS32:^ =^ + ) + $(TEXT_IO32:^ =^ + ) + << + + $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) + @echo Linking $@... + @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk + $(PPMWRITERS:^ =^ + ) + $(TEXT_IO:^ =^ + ) + << + + !IF "$(GRAPHICAL)"=="Y" + $(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) + + !ELSE + $(TILEBMP16): + $(TILEBMP32): + !ENDIF + + $(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) $(CFLAGS) -I$(WSHR) /DPACKED_FILE /Fo$@ $(WSHR)\tile2bmp.c + + $(O)til2bm32.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(INCL)\win32api.h + @$(CC) $(CFLAGS) -I$(WSHR) /DPACKED_FILE /DTILE_X=32 /DTILE_Y=32 /Fo$@ $(WSHR)\tile2bmp.c + + #========================================== + # Housekeeping + #========================================== + + spotless: clean + ! IF ("$(OBJ)"!="") + -rmdir $(OBJ) /s /Q + ! 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)\???-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)\bigroom.lev del $(DAT)\bigroom.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 $(O)sp_lev.tag del $(O)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 $(U)recover.exe del $(U)recover.exe + if exist nhdat. del nhdat. + + 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)lev_comp.exe del $(U)lev_comp.exe + if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe + if exist $(SRC)\*.lnk del $(SRC)\*.lnk + if exist $(SRC)\*.map del $(SRC)\*.map + ! IF ("$(WINPFLAG)"!="") + if exist $(TILEBMP16) del $(TILEBMP16) + if exist $(TILEBMP32) del $(TILEBMP32) + ! ENDIF + + #=================================================================== + # 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)\dungeon: $(O)utility.tag $(DAT)\dungeon.def + $(U)makedefs -e + cd $(DAT) + $(U)dgn_comp dungeon.pdf + cd $(SRC) + + # + # NT dependencies + # + + $(O)nttty.o: $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(NTSYS)\nttty.c + @$(CC) $(CFLAGS) -I$(WSHR) -Fo$@ $(NTSYS)\nttty.c + $(O)winnt.o: $(HACK_H) $(INCL)\win32api.h $(NTSYS)\winnt.c + @$(CC) $(CFLAGS) -Fo$@ $(NTSYS)\winnt.c + $(O)ntsound.o: $(HACK_H) $(NTSYS)\ntsound.c + @$(CC) $(CFLAGS) -Fo$@ $(NTSYS)\ntsound.c + $(O)mapimail.o: $(HACK_H) $(INCL)\nhlan.h $(NTSYS)\mapimail.c + @$(CC) $(CFLAGS) -DMAPI_VERBOSE -Fo$@ $(NTSYS)\mapimail.c + + # + # util dependencies + # + + $(O)panic.o: $(U)panic.c $(CONFIG_H) + @$(CC) $(CFLAGS) -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 CFLAGS) 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) $(CFLAGS) -Fo$@ ..\sys\atari\tos.c + $(O)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)\dlb.h \ + $(INCL)\win32api.h + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\pcmain.c + $(O)pcsys.o: ..\sys\share\pcsys.c $(HACK_H) + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\pcsys.c + $(O)pctty.o: ..\sys\share\pctty.c $(HACK_H) + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\pctty.c + $(O)pcunix.o: ..\sys\share\pcunix.c $(HACK_H) + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\pcunix.c + $(O)random.o: ..\sys\share\random.c $(HACK_H) + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\random.c + $(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\ioctl.c + $(O)unixtty.o: ..\sys\share\unixtty.c $(HACK_H) + $(CC) $(CFLAGS) -Fo$@ ..\sys\share\unixtty.c + $(O)unixmain.o: ..\sys\unix\unixmain.c $(HACK_H) $(INCL)\dlb.h + $(CC) $(CFLAGS) -Fo$@ ..\sys\unix\unixmain.c + $(O)unixunix.o: ..\sys\unix\unixunix.c $(HACK_H) + $(CC) $(CFLAGS) -Fo$@ ..\sys\unix\unixunix.c + $(O)bemain.o: ..\sys\be\bemain.c $(HACK_H) $(INCL)\dlb.h + $(CC) $(CFLAGS) -Fo$@ ..\sys\be\bemain.c + $(O)getline.o: ..\win\tty\getline.c $(HACK_H) $(INCL)\func_tab.h + $(CC) $(CFLAGS) -Fo$@ ..\win\tty\getline.c + $(O)termcap.o: ..\win\tty\termcap.c $(HACK_H) $(INCL)\tcap.h + $(CC) $(CFLAGS) -Fo$@ ..\win\tty\termcap.c + $(O)topl.o: ..\win\tty\topl.c $(HACK_H) $(INCL)\tcap.h + $(CC) $(CFLAGS) -Fo$@ ..\win\tty\topl.c + $(O)wintty.o: ..\win\tty\wintty.c $(HACK_H) $(INCL)\dlb.h \ + $(INCL)\patchlevel.h $(INCL)\tcap.h + $(CC) $(CFLAGS) -Fo$@ ..\win\tty\wintty.c + $(O)Window.o: ..\win\X11\Window.c $(INCL)\xwindowp.h $(INCL)\xwindow.h \ + $(CONFIG_H) + $(CC) $(CFLAGS) -Fo$@ ..\win\X11\Window.c + $(O)dialogs.o: ..\win\X11\dialogs.c $(CONFIG_H) + $(CC) $(CFLAGS) -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) $(CFLAGS) -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) $(CFLAGS) -Fo$@ ..\win\X11\winmap.c + $(O)winmenu.o: ..\win\X11\winmenu.c $(HACK_H) $(INCL)\winX.h + $(CC) $(CFLAGS) -Fo$@ ..\win\X11\winmenu.c + $(O)winmesg.o: ..\win\X11\winmesg.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\winX.h + $(CC) $(CFLAGS) -Fo$@ ..\win\X11\winmesg.c + $(O)winmisc.o: ..\win\X11\winmisc.c $(HACK_H) $(INCL)\func_tab.h \ + $(INCL)\winX.h + $(CC) $(CFLAGS) -Fo$@ ..\win\X11\winmisc.c + $(O)winstat.o: ..\win\X11\winstat.c $(HACK_H) $(INCL)\winX.h + $(CC) $(CFLAGS) -Fo$@ ..\win\X11\winstat.c + $(O)wintext.o: ..\win\X11\wintext.c $(HACK_H) $(INCL)\winX.h $(INCL)\xwindow.h + $(CC) $(CFLAGS) -Fo$@ ..\win\X11\wintext.c + $(O)winval.o: ..\win\X11\winval.c $(HACK_H) $(INCL)\winX.h + $(CC) $(CFLAGS) -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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnbind.c + $(O)gnglyph.o: ..\win\gnome\gnglyph.c ..\win\gnome\gnglyph.h + $(CC) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnmenu.c + $(O)gnmesg.o: ..\win\gnome\gnmesg.c ..\win\gnome\gnmesg.h ..\win\gnome\gnsignal.h + $(CC) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnopts.c + $(O)gnplayer.o: ..\win\gnome\gnplayer.c ..\win\gnome\gnplayer.h \ + ..\win\gnome\gnmain.h $(HACK_H) + $(CC) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gnplayer.c + $(O)gnsignal.o: ..\win\gnome\gnsignal.c ..\win\gnome\gnsignal.h \ + ..\win\gnome\gnmain.h + $(CC) $(CFLAGS) $(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) $(CFLAGS) $(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) $(CFLAGS) $(GNOMEINC) -c ..\win\gnome\gntext.c + $(O)gnyesno.o: ..\win\gnome\gnyesno.c ..\win\gnome\gnbind.h ..\win\gnome\gnyesno.h + $(CC) $(CFLAGS) $(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) $(CFLAGS) -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) $(CFLAGS) -Fo$@ ..\win\gem\wingem1.c + $(O)load_img.o: ..\win\gem\load_img.c $(INCL)\load_img.h + $(CC) $(CFLAGS) -Fo$@ ..\win\gem\load_img.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 $(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: allmain.c $(HACK_H) + $(O)alloc.o: alloc.c $(CONFIG_H) + $(O)apply.o: apply.c $(HACK_H) $(INCL)\edog.h + $(O)artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h + $(O)attrib.o: attrib.c $(HACK_H) $(INCL)\artifact.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) $(INCL)\edog.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) $(INCL)\edog.h + $(O)dogmove.o: dogmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h + $(O)dokick.o: dokick.c $(HACK_H) $(INCL)\eshk.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)\eshk.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) $(INCL)\artifact.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) $(INCL)\epri.h $(INCL)\emin.h \ + $(INCL)\edog.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 $(INCL)\edog.h + $(O)mhitu.o: mhitu.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h + $(O)minion.o: minion.c $(HACK_H) $(INCL)\emin.h $(INCL)\epri.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) $(INCL)\artifact.h + $(O)mkroom.o: mkroom.c $(HACK_H) + $(O)mon.o: mon.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h + $(O)mondata.o: mondata.c $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.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)\dungeon.h $(INCL)\eshk.h $(INCL)\vault.h \ + $(INCL)\epri.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) $(INCL)\edog.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) $(INCL)\epri.h $(INCL)\edog.h + $(O)polyself.o: polyself.c $(HACK_H) + $(O)potion.o: potion.c $(HACK_H) + $(O)pray.o: pray.c $(HACK_H) $(INCL)\epri.h + $(O)priest.o: priest.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h \ + $(INCL)\epri.h $(INCL)\emin.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) $(INCL)\eshk.h + $(O)shknam.o: shknam.c $(HACK_H) $(INCL)\eshk.h + $(O)sit.o: sit.c $(HACK_H) $(INCL)\artifact.h + $(O)sounds.o: sounds.c $(HACK_H) $(INCL)\edog.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)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) $(INCL)\vault.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)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 + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/sys/winnt/porthelp Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,300 ---- + Microsoft Windows specific help file for NetHack 3.4.0 + Copyright (c) NetHack PC Development Team 1993-2002. + NetHack may be freely distributed. See license for details. + (Last Revision: March 16, 2002) + + 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. + + 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 + 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. + + 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) + + + 1. ALT Key Combinations + ---------------------------------------------- + The non-graphical (tty) interface always operates in "NetHack mode", + 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 + combination with another key to execute an extended command + as an alternative method to pressing a # key sequence. + The available commands are: + + Alt-2 #twoweapon - toggle two-weapon combat (unavailable + if number_pad mode is set) + Alt-a #adjust - adjust inventory letters. + Alt-c #chat - talk to someone or something. + Alt-d #dip - dip an object into something. + Alt-e #enhance - enhance your skill with a weapon. + Alt-f #force - force a lock. + 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-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. + Alt-q #quit - quit the game. (Same as #quit) + Alt-r #rub - rub a lamp. + Alt-s #sit - sit down. + Alt-t #turn - turn undead. + Alt-u #untrap - untrap something. + Alt-v #version - list compile time options for this version of + NetHack. + 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) + ---------------------------------------------------------------- + + "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 + 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 + 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 + to align the window to "top" or "bottom". + Default: [TOP] + + 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] + + 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), + ascii4x6, ascii6x8, ascii8x8, ascii16x8, ascii7x12, + ascii8x12, ascii16x12, ascii12x16, ascii10x18 + (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] + + 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 in pixels. This option may only be specified + in the defaults.nh config file. + Default: [16] + + 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. + Default: [16] + + Other Window options: + + windowcolors Specifies the colors for various windows + This option may only be specified in the + defaults.nh config file and has the following + format: + window-type foreground/background + Notes: + - Both foreground and background colors are + required, and a slash must separate them. + - "window-type" is either "message" or "status" + (Short forms are: "msg" or "sts"). + - "foreground" and "background" may be specified as + a color name (such as "blue"), or by a six + digit hexadecimal RGB color value (such as + "#8F8F8F") + - The following color names are available: + 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. 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: + OPTIONS=windowcolors:sts #00FF80/blue msg menutext/menu + + font_menu Specifies the name of the menu font. + font_message Specifies the name of the message font. + font_status Specifies the name of the status font. + font_text Specifies the name of the text font. + + font_size_menu Specifies the size of the menu font. + + font_size_message + Specifies the size of the message font. + + font_size_status + Specifies the size of the status font. + + font_size_text Specifies the size of the text font. + + Miscellaneous options: + + vary_msgcount Number of lines to display in message window. + + + 4. 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 + ----------------------- + + 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. + + Window Settings - Changes your logged-on user's settings for NetHack. + In 3.4.0, 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. + + Help - Provides help about various portions of NetHack. + + + 6. Numeric Keypad (for "OPTION=number_pad" mode) + ------------------------------------------------ + + The numeric keypad and surrounding characters act as macros for different + commands in NetHack. The Num Lock should be toggled to "on" to make the + most of these keys: + + Key Normal Shift-Key + ---------- ---------- ------------- + 1, 2, 3, 4 Move In Run In + 6, 7, 8, 9 Direction Direction + + 0 (Ins) Inventory Categorized + Inventory + + . (Del) Wait Turn : - Look Here + + + Spell List P - Put on an + accessory + + - m - Move Previous + Only Message + + NetHack for Windows - tty Interface Specific Behavior: + ------------------------------------------------------ + + In the non-graphical (tty) interface, when you use the Ctrl key with a + directional key (1, 2, 3, 4, 6, 7, 8, 9) it means "go in specified + direction until you hit a wall or run into something interesting." + + NetHack for Windows - Graphical Interface Specific Behavior: + ------------------------------------------------------------ + + It is possible to scroll or pan the map in a specific direction: + + Ctrl-Shift-Left (4) Scroll (Pan) map left + Ctrl-Shift-Right (6) Scroll (Pan) map right + Ctrl-Shift-Up (8) Scroll (Pan) map up + Ctrl-Shift-Down (2) Scroll (Pan) map down + Ctrl-Shift-Home (7) Scroll (Pan) map left to leftmost corner + Ctrl-Shift-End (1) Scroll (Pan) map left to rightmost corner + Ctrl-Shift-PgUp (9) Scroll (Pan) map left to uppermost corner + Ctrl-Shift-PgDn (3) Scroll (Pan) map left to lowermost corner + + + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/gem/gr_rect.c Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,181 ---- + /* SCCS Id: @(#)gr_rect.c 3.4 2001/12/10 */ + /* Copyright (c) Christian Bressler, 2001 */ + /* NetHack may be freely redistributed. See license for details. */ + /* This is an almost exact copy of qt_clust.cpp */ + /* gr_rect.c */ + #include + #include + #include + #include "gr_rect.h" + dirty_rect *new_dirty_rect(int size){ + dirty_rect *new=NULL; + if(size>0){ + new=(dirty_rect *)calloc(1L,sizeof(dirty_rect)); + if(new){ + new->rects=(GRECT *)calloc((long)size,sizeof(GRECT)); + if(new->rects==NULL){ + free(new); + return(NULL); + } + new->max=size; + } + } + return(new); + } + void delete_dirty_rect(dirty_rect *this){ + if(this==NULL) + return; + if(this->rects) + free(this->rects); + /* In case the Pointer is reused wrongly */ + this->rects=NULL; + this->max=0; + this->used=0; + free(this); + } + static int gc_inside(GRECT *frame,GRECT *test); + static int gc_touch(GRECT *frame,GRECT *test); + static void gc_combine(GRECT *frame,GRECT *test); + static long gc_area(GRECT *area); + int add_dirty_rect(dirty_rect *dr,GRECT *area){ + int cursor; + long lowestcost=9999999L; + int cheapest=-1; + int cheapestmerge1=-1; + int cheapestmerge2=-1; + int merge1; + int merge2; + for (cursor=0; cursorused; cursor++) { + if (gc_inside(&dr->rects[cursor],area)) { + /* Wholly contained already. */ + return(TRUE); + } + } + for (cursor=0; cursorused; cursor++) { + if (gc_touch(&dr->rects[cursor],area)) { + GRECT larger=dr->rects[cursor]; + long cost; + gc_combine(&larger,area); + cost=gc_area(&larger)-gc_area(&dr->rects[cursor]); + if (cost < lowestcost) { + int bad=FALSE,c; + for (c=0; cused && !bad; c++) { + bad=gc_touch(&dr->rects[c],&larger) && c!=cursor; + } + if (!bad) { + cheapest=cursor; + lowestcost=cost; + } + } + } + } + if (cheapest>=0) { + gc_combine(&dr->rects[cheapest],area); + return(TRUE); + } + if (dr->used < dr->max) { + dr->rects[dr->used++]=*area; + return(TRUE); + } + // Do cheapest of: + // add to closest cluster + // do cheapest cluster merge, add to new cluster + lowestcost=9999999L; + cheapest=-1; + for (cursor=0; cursorused; cursor++) { + GRECT larger=dr->rects[cursor]; + long cost; + gc_combine(&larger,area); + cost=gc_area(&larger)-gc_area(&dr->rects[cursor]); + if (cost < lowestcost) { + int bad=FALSE, c; + for (c=0; cused && !bad; c++) { + bad=gc_touch(&dr->rects[c],&larger) && c!=cursor; + } + if (!bad) { + cheapest=cursor; + lowestcost=cost; + } + } + } + // XXX could make an heuristic guess as to whether we + // XXX need to bother looking for a cheap merge. + for (merge1=0; merge1used; merge1++) { + for (merge2=0; merge2used; merge2++) { + if (merge1!=merge2) { + GRECT larger=dr->rects[merge1]; + long cost; + gc_combine(&larger,&dr->rects[merge2]); + cost=gc_area(&larger)-gc_area(&dr->rects[merge1])-gc_area(&dr->rects[merge2]); + if (cost < lowestcost) { + int bad=FALSE, c; + for (c=0; cused && !bad; c++) { + bad=gc_touch(&dr->rects[c],&larger) && c!=cursor; + } + if (!bad) { + cheapestmerge1=merge1; + cheapestmerge2=merge2; + lowestcost=cost; + } + } + } + } + } + if (cheapestmerge1>=0) { + gc_combine(&dr->rects[cheapestmerge1],&dr->rects[cheapestmerge2]); + dr->rects[cheapestmerge2]=dr->rects[dr->used-1]; + dr->rects[dr->used-1]=*area; + } else { + gc_combine(&dr->rects[cheapest],area); + } + // NB: clusters do not intersect (or intersection will + // overwrite). This is a result of the above algorithm, + // given the assumption that (x,y) are ordered topleft + // to bottomright. + return(TRUE); + } + int get_dirty_rect(dirty_rect* dr,GRECT *area){ + if(dr==NULL || area==NULL || dr->rects==NULL || dr->used<=0 || dr->max<=0) + return(FALSE); + *area=dr->rects[--dr->used]; + return(TRUE); + } + int clear_dirty_rect(dirty_rect *dr){ + if(dr) + dr->used=0; + return(TRUE); + } + int resize_dirty_rect(dirty_rect *dr,int new_size){ + return(FALSE); + } + static int gc_inside(GRECT *frame,GRECT *test){ + if(frame && test && frame->g_x<=test->g_x && frame->g_y<=test->g_y && + frame->g_x+frame->g_w>=test->g_x+test->g_w && + frame->g_y+frame->g_h>=test->g_y+test->g_h + ) + return(TRUE); + return(FALSE); + } + static int gc_touch(GRECT *frame,GRECT *test){ + GRECT tmp={test->g_x-1,test->g_y-1,test->g_w+2,test->g_h+2}; + return(rc_intersect(frame,&tmp)); + } + static void gc_combine(GRECT *frame,GRECT *test){ + if(!frame || !test) + return; + if(frame->g_x>test->g_x){ + frame->g_w+=frame->g_x-test->g_x; + frame->g_x=test->g_x; + } + if(frame->g_y>test->g_y){ + frame->g_h+=frame->g_y-test->g_y; + frame->g_y=test->g_y; + } + if(frame->g_x+frame->g_wg_x+test->g_w) + frame->g_w=test->g_x+test->g_w-frame->g_x; + if(frame->g_y+frame->g_hg_y+test->g_h) + frame->g_h=test->g_y+test->g_h-frame->g_y; + } + static long gc_area(GRECT *area){ + return((long)area->g_h*(long)area->g_w); + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/gem/gr_rect.h Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,14 ---- + /* gr_rect.h */ + #include + /********** structs **********/ + typedef struct { + GRECT *rects; + int max,used; + } dirty_rect; + /********* functions ************/ + dirty_rect *new_dirty_rect(int size); + void delete_dirty_rect(dirty_rect *this); + int add_dirty_rect(dirty_rect *dr,GRECT *area); + int get_dirty_rect(dirty_rect* dr,GRECT *area); + int clear_dirty_rect(dirty_rect *dr); + int resize_dirty_rect(dirty_rect *dr,int new_size); *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/gem/xpm2img.c Thu Mar 21 07:37:44 2002 *************** *** 0 **** --- 1,164 ---- + /* SCCS Id: @(#)xpm2img.c 3.4 2002/03/17 */ + /* Copyright (c) Christian Bressler 2002 */ + /* NetHack may be freely redistributed. See license for details. */ + /* This is mainly a reworked tile2bmp.c + xpm2iff.c -- Marvin */ + #include + #include + #include + #include "bitmfile.h" + #define TRUE 1 + #define FALSE 0 + void get_color(unsigned int colind, struct RGB *rgb); + void get_pixel(int x, int y, unsigned int *colind); + char *xpmgetline(); + unsigned int **Bild_daten; + /* translation table from xpm characters to RGB and colormap slots */ + struct Ttable { + char flag; + struct RGB col; + int slot; /* output colortable index */ + }ttable[256]; + struct RGB *ColorMap; + int num_colors = 0; + int width=0, height=0; + int initflag; + FILE *fp; + int + main(argc, argv) + int argc; + char *argv[]; + { + int i; + int row, col, planeno; + int farben, planes; + if (argc != 3) { + fprintf(stderr, "usage: tile2img infile.xpm outfile.img\n"); + exit(EXIT_FAILURE); + } + initflag = 0; + fp = fopen(argv[2],"wb"); + if (!fp) { + printf("Error creating IMG-file %s, aborting.\n",argv[2]); + exit(EXIT_FAILURE); + } + fclose(fp); + if(fopen_xpm_file(argv[1],"r")!=TRUE){ + printf("Error reading xpm-file %s, aborting.\n",argv[1]); + exit(EXIT_FAILURE); + } + Bild_daten=(unsigned int **)malloc((long)height*sizeof(unsigned int *)); + for(i=0;i256){ + fprintf(stderr,"ERROR: zuviele Farben\n"); + exit(EXIT_FAILURE); + }else if(num_colors>16){ + farben=256; + planes=8; + }else if(num_colors>2){ + farben=16; + planes=4; + }else{ + farben=2; + planes=1; + } + bitmap_to_file(XIMG, width, height, 372, 372, planes, farben, argv[2], get_color, get_pixel ); + exit(EXIT_SUCCESS); + /*NOTREACHED*/ + return 0; + } + void get_color(unsigned int colind, struct RGB *rgb){ + rgb->r=(1000L*(long)ColorMap[colind].r)/0xFF; + rgb->g=(1000L*(long)ColorMap[colind].g)/0xFF; + rgb->b=(1000L*(long)ColorMap[colind].b)/0xFF; + } + void get_pixel(int x, int y, unsigned int *colind){ + *colind=Bild_daten[y][x]; + } + 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", + &width, &height,&num_colors, &temp)) + return FALSE; /* bad header */ + /* replace the original buffer with one big enough for + * the real data + */ + /* XXX */ + xpmbuf = malloc(width * 2); + if(!xpmbuf){ + fprintf(stderr,"ERROR: Can't allocate line buffer\n"); + exit(1); + } + if(temp != 1)return FALSE; /* limitation of this code */ + { + /* read the colormap and translation table */ + int ccount = -1; + ColorMap = (struct RGB *)malloc((long)num_colors*sizeof(struct RGB)); + while(ccount++ < (num_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].col.r = r; + ttable[index].col.g = g; + ttable[index].col.b = b; + ttable[index].slot = ccount; + ColorMap[ccount].r=r; + ColorMap[ccount].g=g; + ColorMap[ccount].b=b; + } + } + return TRUE; + } + /* This deserves better. Don't read it too closely - you'll get ill. */ + #define bufsz 2048 + char buf[bufsz]; + char * + 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]; + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/Qt/nhsplash.xpm Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,374 ---- + /* XPM */ + static char *noname[] = { + /* width height ncolors chars_per_pixel */ + "196 111 256 2", + /* colors */ + " ` c None", + " c #A094A7", + " . c #761C1B", + " X c #751A1A", + " o c #361414", + " O c #18181E", + " + c #CF0909", + " @ c #F4F2E2", + " # c #AD110F", + " $ c #AB0D0D", + " % c #C9BEC5", + " & c #CF977F", + " * c #627EB9", + " = c #512A21", + " - c #5F201B", + " ; c #A45841", + " : c #D3281D", + " > c #661B18", + " , c #78443A", + " < c #721110", + " 1 c #61332A", + " 2 c #7C231D", + " 3 c #533226", + " 4 c #978A8D", + " 5 c #AF0A0A", + " 6 c #841111", + " 7 c #783226", + " 8 c #B80D0C", + " 9 c #981514", + " 0 c #DDDACE", + " q c #881918", + " w c #B0A5B9", + " e c #74352F", + " r c #CCA799", + " t c #ADA8AC", + " y c #9B9897", + " u c #651413", + " i c #712C22", + " p c #710C0B", + " a c #8E1817", + " s c #861B19", + " d c #E4100C", + " f c #9B1010", + " g c #B49795", + " h c #EB0909", + " j c #3E302B", + " k c #8F5D53", + " l c #9E0909", + " z c #701717", + " x c #D1CBCF", + " c c #846E69", + " v c #9987A2", + " b c #291413", + " n c #281212", + " m c #691110", + " M c #BA0A0A", + " N c #DED4D5", + " B c #71291B", + " V c #918E90", + " C c #721F1C", + " Z c #664231", + " A c #7D1313", + " S c #C2B5C0", + " D c #6B332C", + " F c #D40909", + " G c #66625F", + " H c #460A0B", + " J c #446CCF", + " K c #CB0A0A", + " L c #BB100E", + " P c #867A85", + " I c #C64529", + " U c #273FA2", + " Y c #B70A0A", + " T c #A19AA6", + " R c #811B1A", + " E c #441916", + " W c #A50C0C", + " Q c #521110", + " ! c #C2BDC3", + " ~ c #580C0C", + " ^ c #0E0E0F", + " / c #481210", + " ( c #751818", + " ) c #E0DCDD", + " _ c #C90C0B", + " ' c #B5B2C0", + " ] c #A898B0", + " [ c #722522", + " { c #8F1B17", + " } c #78201E", + " | c #8D1515", + ". c #7C1918", + ".. c #831615", + ".X c #E20909", + ".o c #950909", + ".O c #7D100F", + ".+ c #9D7E7A", + ".@ c #792C22", + ".# c #878382", + ".$ c #BC897E", + ".% c #2C2622", + ".& c #D7D4D7", + ".* c #F30909", + ".= c #693D33", + ".- c #CDCBD7", + ".; c #510C0B", + ".: c #0E0B0B", + ".> c #ABA3AF", + "., c #AE1914", + ".< c #6B1414", + ".1 c #CB0909", + ".2 c #5B513C", + ".3 c #65463C", + ".4 c #1E2856", + ".5 c #6A0909", + ".6 c #8A3425", + ".7 c #381913", + ".8 c #930D0D", + ".9 c #D5D099", + ".0 c #774E3D", + ".q c #403F35", + ".w c #3F231D", + ".e c #7B0909", + ".r c #211110", + ".t c #655A56", + ".y c #171010", + ".u c #BC6F59", + ".i c #AB0A0A", + ".p c #51423F", + ".a c #931110", + ".s c #D2C4AD", + ".d c #7E6F7F", + ".f c #7B1616", + ".g c #BC1914", + ".h c #602519", + ".j c #DAD5C2", + ".k c #B7AAA3", + ".l c #9C231C", + ".z c #67382D", + ".x c #D90909", + ".c c #BAB4BD", + ".v c #A48997", + ".b c #D2C4C4", + ".n c #AF2B1E", + ".m c #EBEAE3", + ".M c #A30F0F", + ".N c #7D1C1B", + ".B c #841918", + ".V c #931313", + ".C c #8B1615", + ".Z c #1A0D0C", + ".A c #640909", + ".S c #635A43", + ".D c #C07D63", + ".F c #8B0B0B", + ".G c #651817", + ".H c #C20909", + ".J c #591715", + ".K c #A21111", + ".L c #9C3122", + ".P c #6A241F", + ".I c #9E0D0D", + ".U c #775B53", + ".Y c #A11513", + ".T c #C7C3C9", + ".R c #280D0C", + ".E c #720909", + ".W c #8D4941", + ".Q c #5B5655", + ".! c #8B1111", + ".~ c #A54427", + ".^ c #E1E0DF", + "./ c #8D4037", + ".( c #A11B16", + ".) c #727072", + "._ c #7C0C0C", + ".` c #310E0E", + ".' c #621110", + ".] c #5A1212", + ".[ c #B30A0A", + ".{ c #532318", + ".} c #521F17", + ".| c #792623", + "X c #A7A29F", + "X. c #B6ABBB", + "XX c #7D1F1D", + "Xo c #908099", + "XO c #7B1B1B", + "X+ c #90878F", + "X@ c #C5B698", + "X# c #E90A0A", + "X$ c #100F0E", + "X% c #A50909", + "X& c #580909", + "X* c #2A1717", + "X= c #65503D", + "X- c #3D0C0C", + "X; c #B00E0D", + "X: c #807B7F", + "X> c #7A1D1D", + "X, c #781D1B", + "X< c #5A0F0E", + "X1 c #EF0909", + "X2 c #696765", + "X3 c #605B45", + "X4 c #CD130F", + "X5 c #D20A0A", + "X6 c #4C0A0A", + "X7 c #533E2B", + "X8 c #850A0A", + "X9 c #3C59B3", + "X0 c #C00C0C", + "Xq c #C70909", + "Xw c #971915", + "Xe c #7E1A1A", + "Xr c #7E7580", + "Xt c #5E0C0B", + "Xy c #5D0A0A", + "Xu c #520909", + "Xi c #8B2520", + "Xp c #C85C48", + "Xa c #CEC5CB", + "Xs c #6C2A1F", + "Xd c #642B21", + "Xf c #9B1212", + "Xg c #706A68", + "Xh c #841919", + "Xj c #A7999E", + "Xk c #69201C", + "Xl c #E7E0E0", + "Xz c #9C6F65", + "Xx c #C3B9C0", + "Xc c #826D48", + "Xv c #AFADA9", + "Xb c #8A2B22", + "Xn c #741413", + "Xm c #9A929B", + "XM c #CBB5B4", + "XN c #8F5341", + "XB c #783C31", + "XV c #73211F", + "XC c #911515", + "XZ c #630D0C", + "XA c #881616", + "XS c #E5E4E1", + "XD c #6E1B1A", + "XF c #DC0A09", + "XG c #741616", + "XH c #8E7F85", + "XJ c #591B19", + "XK c #8A201B", + "XL c #BE0909", + "XP c #4E1A18", + "XI c #FEFDF6", + "XU c #6A0C0C", + /* pixels */ + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XIXI.m ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XIXIXIXI.j ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XIXIXIXI.$Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.b.s N.D.$ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ).S.~.~.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.c kXp N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g I.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xx.~ & ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^ ;.uXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.+Xp.j ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X ; r ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.T ; & ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^XzXp N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g.~.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XlXMXMXM r &XMXM N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xx.~ & ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xl rXp : :X#.X h hX#.X :.X.X.X.x.x :Xp.u &.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^XN.uXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.b & :X#X1.*.* : dX5.x F _ K.,.nX0 _X5 _ FXFX4X4.x.xXp.D r N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.+Xp.j ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.s :X# hX1 h.XX5 8 L.LXw 9 9Xh q.|XB 2 qXCXC |.VXi.6X; # _ _.x.X :.D r ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X Xp r ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` NXpX#.*.* :X4 _X;.KXhXh.=.| X X.< i 1 1 1.P i.G u.<.=.zX>XhXh.V | #X;.n KX4Xp rXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.T ; & `Xl r.$XpXpXpXp.$.$XM N ` ` ` ` ` ` ` `XIXI 0 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XlXpX#.*X1.*X5.,.6 2XhXO z D.=.3.3 GX2.).d.dXrXrXrXo P PXrXg.3 , DXk zXO [ , {.KX0 _ KXp rXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^ ;XpX0 8 # | a. RXhXe qXf.L.u rXl ` ` `XIXIXI @.k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0 & :.*.*X#X0.K R.=XDXd.=.t GX2X2.).d P P P P PXoXoXoXo ] ] v ] vX+.# V.d.U.3.P.NXhXC.VX0X0 _.DXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XlXpXF.!.~ { XXD.< > D u.'.XOXCXK.L _ : &Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0.uXFX0XCXD.~.L.U P P PX+ P P.d.U.3Xd -XJ.f ; @ 0 0.+ g ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.SXcXcXN.6.|X,.'XJ.Q G G G P PXo PXrXo vXo v v v ] vX+Xo vXo v ] ] ] ] wXmXm T.>XmXm c.U 1.z q.KX0 +Xp.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X@ IX# 8.! [XrXB kXj v v vXoXoXo v vXoX+.U D , @.j @ c.m.m ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` eX7XcXcXzXb.V f.8 pXd.t.d.d.d.) P.d P P ]Xo PXo vXo vX+ v vXo v v ] wXmXm TXm T.> w w ' w.d.W C RXC #X0 I rXS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.+X0 h.* 8 f { k.3Xz.b v vXo v v v v v vXoXo.k g @.s c.s r ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.WXz.mXS.j i.N aXC.V 6.O.6.d.d.)Xr P P.dXr PXo P PXoXoX+ PX+ vXm ]XmXmXmXm T T w.>.> w.>.> wX..> c ,XGXh.K 8.n &Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X@.NX0.*.*Xq $ $Xp.sXzXzXoXoXo v vXoXo vXoXo P.s @X@.q o (./XM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.WXz.mXS.D .X>.NXh qXb 2.o.8 ,.).dXo P P P v PXoXoX+ PXo vX+ vXm VXmXm Xm ] ] ].> w T.>.> w.> w.> tX..c wXz e i , #.g &Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.jXMXi 8.*.*X5 $.,.p.yXs.uXo v vXoXo v vXo ].kX3 O.yX2.U 3 A ;XM ` ` ` ` ` ` `.-XS ` ` ` ` `.WXz.mXSXbX> <.fX, }.= 7 |.M.oXC.0Xr.)Xr P P PXo PX: PXHXoX+ v V V XmXm ] ] ] w w w w wX. TX. w wX. S.cX..cXj c C |.K.g &Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ).^ 0.b.| W.*.* + 5.F.yX$ 3.~ k v v v v v T .%.j 0.4 J.4.4X9 U.d.-.-XS.- * J J J J.- ` ` `.W ;.m.j.P X iXdXZ > i [.NXhXf.! { A.U P PXo P P PXoX+Xo vXoX+X+XmXm VXmXmXm ]Xm ] T wX. w.>X. w wX. tX.X.X..c SXx t c [XhX; 8.u N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XS 0 ` `.bXiX0X1.*.x 8X0X-.% k.~.n.WXo v v ] ] ].) 4XI.- J J J J U U U U U U UX9 U U J J JX9 * w ,.W @X@Xd.< [.|.< Q.=.P zX>.N s ,XC.8.l kXoXr P vXoXo v X+X+ VXmXm ]XmXmXmXm ] T T T w.>.>.>.>X. t tX. ' S S.c.c.c.c !.+ iXh 9 8.DXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xx.m ` ` `.bXbX;X1.*XF.I.[.Z.% j.~ & @ 0Xm ] N !.d &X9X9.- `Xl.Q O.4.4.4.4 O O O O.Q.4 U U U * J.= i @.u ( mXnX>X>.'.p G.t.z C D.=.| a.V.oXb cXoXo PX+X+X+ vXmXmXmXmXm ] wXm T T.> w.>.>.>X..> tX..c t.c.c !.c S !.T.T.T.TXj k. ./.n &Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 0 ` ` ` ` `.bXi L.*.*.X.I lXtX* j B.D.s gXIXIXI J.Q 0XIXIXIXIXIX+.4.4 U U.p.4.Q.% O.q.)X2X9 J J /.G 0.uX, - 1XnX, iXP.QX2X2X2.3 D X.NXeXA s.C.6 cX+X+X+ w v ]Xm V ] wXm T T w wX. w wX.X. tX.X.X..cX..c.T !.T.TXa.-.T.-Xa ! c [.K.g r ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.bXi M.X.*X#X;.!.i l =.w.~.$.m @ ` J.-XIXIXI @ 0 0 gXoXo ] .) j.4Xo.- ` `.>X9.]XnX@Xb.N - G.=.P DXkXJX2X2X2XgXg G.= CX>.= 7.V W.6.dX+X+XmX+XmXmX+ Xm T T TX. w w.>X..>X..> tX..c SXv S ! !Xx !Xa.T.T.-.T.TXa.c kXO.M :XM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.bXi 8 h.* h.[XD <.i./.3Xp.uXl ' J *XIXIXI.sX3X@.sXo v ] T T .U./.b ` ` `.^.J }.U i.P - G GXd z.N.<.pX2X2XgXg.).).) G.3 [.N a f |./ P vXmXm V VXm ] T T ] T T T w.>.> wX.X.X.X.X..c.c !XaX.Xx ! ! !XaXaXaXaXaXa.&.& S.WXA.KXpXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.bXi.,.X.*.*X0 eXVX;.,.UXp & J J J `XI @.s.q.+ @.s ] ] ] T wX. 4 e.$ ` ` ` zXD D DXVXJ G G GXdXGXV 3.QX2XgXg.).).).).).) ,.PXe.@ 7.I.WX+Xm ] Xm TXm TXm.>.>.>.> T.>X.X. tX. tX..c.c S.T ! !.T !.T.TXa.TXa.-Xa x.&.& xXj.W a #.u ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.m ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` xXi M h.*.* _.W.UXOX%./ ;.W J J J @ @X@.%Xg @.jXj ] ] ] ].>X. w ! ) g.W N.bX6Xn.f . (Xk G GX2X2 1.z DXJXgXg.).).).).).).)XrXr.U.S D R f.Y.WX+XmXm ]Xm T T T T T.>.>.> t w.c t tX..c S.c.c ! % ! !.T.T x x !Xa.& x.&.&.&.&.&.k.WXi ; & ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XS.9.q y ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.bXiX;XFX1 h K.6Xo ,.OX U.6 J JXl 0.t j O.+.s c ] ] ] ]X.X. ! ` ` ` NXlXM.G zX>X> .XJ G GX2X2 GXD. XD.pXg.).).).).).).)XrXrX:X:Xg ,.|XhXi.@.W.v ] T TXm T w.>X..>.> w w tX..c.c S.c.c.c ! ! !.T.T.T xXaXa x.&Xa x.& x.&.& ) ).c.U a IXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XM.k.9.qX$ t ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.bXi.( F.*.* F.LXHXo y ^.4.L.dX9Xx.q.q.4.% c g k.v ] w.cX. x ` ` ` ` `.k Q .XVXV C.{ G GX2X2X2 G > C 3.t.).).).).).).)XrXrX:X:X:X:X:.U.U e.C 9.WXm T T TX..>.>.>X. wX.X.X. S.c.c.c.cXx.T.T !.T.T.TXa.T.-.- x.& x.&.& ).& ) ) ).&.v 2Xf.uXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` `XS.jX@X X .c ` ` ` ` ` ` ` ` ` ` ` ` ` ` r.g.H./X@.qX$ O.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XMXh 8X#.*.*X5.l P.4 J O ^.h rXI 0 ' *X+ @ 0.+ c.W gX.X. x ` ` ` ` `.+.'XV D D [.J GX2X2X2X2Xg GXd D -.).).).).).)XrXrX:X:X:X:X:.#.#.#Xr , }.CXb kXm T.>.>.>.>.> w wX..c !X..c.c.c.c.T ! !.TXa.T.T.T.T x x x.& x.&.& ).& ) ) ).^ !Xz |., & ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` `.m 0.s.kX cXcX3X3X3X3Xv r.D.$.+.kXS ` ` ` ` ` rX5.xX5 = O.yX$X$X: ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` rXh 8XFX#.*.XX;X2 J J U ^.+ @ @ 0.t.+.s.+ 4 ] kXz.v ! ` ` ` ` ` cX6Xn.f .XGXJ GX2X2X2XgXg.).t X.<.p.).).).)Xg.)XrX:X:X:X:.3Xg.#.#.#.#.#.U.U.@Xw ;Xm.> w.> t w tX..cX..c.c.c %Xx.T !.T.-Xa !.- x.TXa x x x.& x ) ) ) ) )XSXSXS.&Xx kXfXp.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` `.m.jX@ cXcXcX3X3X3.p.q.2.q.. I ;.~Xi.@ ,XM ` ` ` NX4X1.* FXPX$X$X$X$ O ` ` ` ` ` ` ` ` `Xl N ` ` ` ` ` ` ` r |.,X5 h.* h.l J J J J.4.2 =.p.4 O O O.% wX.X. %XMXz g ` ` ` `.0 < XXOX,XnXP GX2X2X2XgXg.).).U.PX7 G.).).) =.w.)X:X:X:.q o j.#.#.#.#X+X+ V c ,..XwXzXjX.X. S '.cX.X..c.cX..cXx !.T.TXa.T.T.TXa x x.- x.&.& )XS.m.m ` ` ` ` ` ` ` `XM./.K.$ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` `.j.+ c.2.q.q j j j j.q.q.q.h ; &.u.~ #Xh RX> r ` `Xp h.*.*.oXZ.yX$X$X$X$.T ` ` `Xl k.^ ` `.D j.^ ` ` ` g ` ` `.k q 8.xX#.* d J J J J.4 ^ ^ BXs O ^ O ^X9X..k.& ` ` N ` ` x `XJ.] }XV C C =X2X2X2.Q.w G.).).) 3 i -.).).Q oX*.w.)X:.3.r o b G.#.#Xr.tX+ V V VXH k.U { k T S.cX..c.c.c.c.cXxXx.c !.TXa.T.T x xXa x )XS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` gXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` `.+.% O O O.y.y.y O O O.%.% |.D &.D.(.K.VXC R.f g rXq.x.1 MX8X6 QX$X$X$X$ y ` ` ` g o.Q ` x E n.Q ` ` r E.# ` ` ` r q 8X5 hX1 J J J.4X9X9 U ^ 1.~.4 ^.y.4 * 2.3.^ ` ` ` !.:X: HXt i [ [XD 1X2X2 G.w oX*.t.)X2X* QX>.3.) oX* o n.w.Q b b o n.%X:.p o o.# V V V V V y c.6 {XzX..c.c.c.c S !XxXxXx !.T.TXa.T x.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` `.T.c.c.c yX:.).pX$X$X$ OX*Xb ; ; :.i W.MXf.YX;Xq M.M fXUXyXuXu q QX$X$X$.% ! ` `.W.Z.r y.D n n.Z t ` 1 b n.T ` ` `.$ a.,Xq & * J U J U U J U O.4.~ U U UX9.pXP.p.^ `.^.%.:.r HX<.f. .NXn.7.QX2.q b o bX*.t j.r o =X7 = nX* o n nX* bX* o n b.w n o o.t V V V VXm y y yXH c.6XzX..c.cXa !.T !.T !Xa x.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` `.^ y.pX$.r._.M.a.FX%XL K.1 L.a M.xX;.!X6X-X- H R zX-X$.y.Z.p ` x.7.Z.ZX* j.r n.ZX* g o b.r j ` ` ` `Xz.L.jXI.- J.4 J J J U U O O.4.6 U U U U.q.7.U `.+ oXJ o H < (Xn ..'.`X*.Q o b o n bX* b b o n.J Q nX* o.r.r b b o b n o bX* o b.q V V VXg.w V y y y y 4 kXiXz.c ! ! !Xx.T x.m ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` `.z.F $.. R.! W $XF F.F $ K.[ f Q Q.J Q.G z.f <.` o.ZX$ y.v.r.Z.r.y.y.r n.y.Z.7 n b.r.r.t.$.$ rXz.~ 2XK.~.QX9 J.- @.s.q.4.4 ^ UX9 UX9X9 U.4X*.U E EXJ /.' XXV [XV.<.` b b b b o n b b n b o b nXJ.w b b.r.rX* n o n.r o b o o bX* VX+.pX* o.t y y y y T TX .+XN.u S.T xXS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` `Xz M.[ f.C.C K +.MXA.F.oX#.*.1X8 u u -. EXk.{XP.{.{ - (XJ >._.]XPX.SXV u./Xc.(.O.].h.JXy.`.R /.h B B.h.uXI.m./.n.nXK.7.}.Z.RXU.i l f {.l.' ~.'.B.f X zXtX- HX-XuXuX6X&X&X6XyXuX&.AX6X&XuX mXu.]XV 3 -X7 1 j = 3XP 1 =Xd =.6X= DXf a.3.~XG.aXw.h.!X&Xu.R.}.h B.~.h 0.mX7 I.n.LXK.h /X-X6XuX& j.q.pX6.A.' XXD }XO.; / ~X&X6.AX&.E.E ~.E.A ~.E.A.5.5.A < < <.hXs.hXU.o l M.M.K {._ B 3.! z.J /XkXP.}XD E.}.k.=.} C.U ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` `Xl.V m 8.* WXh 6 W W.8 ~ >.J j.D.9.h.~.~X7 OXG z Q.]XPXV 3XJ =.P j.P 1 - 1.PXd 3.N ,.|...6./.K #.I.!.F.E.e HX-.h B B.h.z @.%.n.n.n.L B.}X<. >XkXJ.3 jX6.AXU q.f X <.;X- Q ~Xy.E.E.5.eXU.E.eXUX8.EXt.E.5 p (.< 6 Z.~., K., LX0 8.M |._Xd 7X;., W.O.G.<.}XP E - E -Xk.}.^ ` ` N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` 7 I $.* _.VX;.FX;.VXi.| u.v &.D.~.6.6X7 O /XDXb.J E = C =.PXJXkXdXX - -XJ.PXJ.PXK D.! R.=Xb 9 f.V.Y.8.o.e H.}.h B B.7.m.%XK { 2XK B.{ /.! 6 [ iXA mX&.5Xt AXn (XZ ~ ~Xt.;.;.5.e.E.e.e.EX8.o.F 5.o 5X%X% l (.,.u.u.~.g.H +.,.l.(.(Xw.8XKXw M $.[.aXb.!.'XP EXJXDXPXP.k N cX>Xx ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` `.j.~ $ YXq.[.o l.a #XhXKXXXC.u.9.D I.h 7.q O o Q. } Q -.]XJ.].J z u.]XPXXy.EXU uXnXG C p.' Q QXt.;.E.eX8 YXq _.x +.x.x.1 K FX;X5 K _ : I IX4.g.n.g.n.YXw.LXK p.8 K M M $X0 $.i 7.h.X-.`.R.r j cX@.sX@ qX8.o.E.A.'.eX8XU < A.fXU QX7X=X3X3.2 D R.N 7 e e 7XXXhXh q a.K.MX; 8X4.D.D.u.u.DXcXcXc ;.L., #.M.!.8 MX; LX;X0.L F.HX0X5Xq +X0 8.@XkXJXJ - }XP.b ` ` `.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` rXL.1.X +.XX#.H 8 f f.V 6 p.] R 9 # LX0.( z.<.G Q.]X&XZ.A.A.A.AX&XyXZ.A.AXyXUXZ p.E p A aXGXh..XAXAXh. . |Xh q 9.KXf.! z i <.'.;.R.:X$X*.q 3X@XNXK.o.e.E.5.E.EX8.F AXZ uX> } DX=X3 D i.= Z.SX=.=.|X>X>X>X>X>X>X>.|X=.SXc.0.6./XcXcXc.~.,.( # 9.M.O lX; W Y.[ _Xq.1X0.g K.HXqXq.g.~.~ A. .}.}.+ g.U.PXB ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` `.b.g FXF F F +.x W.[.[.M f 9...fXh.N RXOX<.|XkXD (.'XZXU ~X& ~.A ~XZXt.AXZ.AXU.AXZ.5.A p.f.fX>. Xe X. XwXA | qXe s.f.fXeXh.(.| 6.V |.F B.`.R.R.R b.z.u.sXw.EX8XU.EX8.!.FXZ XX>X>X> [ D.=.=.SX3X3.SX=.6XC.V | | |Xh.|.SX3.S.2.3Xd 1.2.3 Z eXf.I W $.a fX8 #.M M $X0 MXq.H K _.1 KX5Xq _X0.H.l 7 u - E -XX.}.^ `.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` I _ F.X.X F.H.[.oX% $.K..Xf q.NXeXeXO.N.'.<.P m ~.'XZXZXuX&XZXZX.N RXV D.SX3X3X3X3.S { W.M.M $ f.6XcXcXc , 7XiXK 7XB.zXs z z. .! W.a.a.IX; 8X; W.[ MX0XqXL K _ _ F KX5 +.g.~XNXw. -.}.+.W.l.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` &XL l FX1.X + F.M.Y.C.V mXh qXh z mX>.'.f u u.JXGXuXZX& Q Q.' u u.]X<.J.G -Xk.G.PXD CXD ..fXG.fXhX,.NX> X R.N. .Xw a |XCXhXCXD q A A.BXn.{ 7 /X6 ~XD / 3 &.j 6 9 ( W.[.a | 6 6XGXO.V.MXf s 7.SX3X3X3.S.3XV.NXh | f #./XcXc.L.,.( _.Y.lXw.M l.! . C (.!.!.F f.K.MX0X;X; 8.[X0.[.HXF.1 F + +.x.x + _Xq { u [XJXbXiXz ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` `.$.xXLX0XqX5.H.H.H 5 $.V. .< zXhXh R..} 7XD f 6.Y.B EXz.9XwXiXb L.x hX5XL.[.f.. W f.K $.M./XcXc.UXcX3.=X>X>X>X> R qXb.6.K M $ M 5.[ WX%.i l.8 qXe XXG.F._.K.a f f #.M _., _X; K _X0.H F FX5.x F K ; ;.6 s.l.} e `XMXp.$ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` `.$ _ F.1X0.H +.X h FXL f |.fXG XXh R. XG m z.'XyX&.'.]X<.G ~XJ.z.=XB 7 DXs 7 i -Xk.h = 1 ZX=X=.= D D D [XVX> .Xh.NX>Xh.N aXe {XeXV {.CXh 9Xf.{.}XbXiXA..Xf.C.N.P -.(XbXw _.x.xXF Y M. | K fXCX; 9.(XcXcXcXzXc.~ WXf.YXh.NX>X,X>XAXf.K f f 9.iX%X%X%X%.a sXA.fXn.e. .I |.( a.M #.( #.H 8.nX0Xq KX5X5X5 +XF.g :X4 _X; XXJ e.P.n.P N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` NX5X#XF FXq.x F.X + +XL.KXCXh.<.<.G.< 2XX A aXe a.N.N q RXeXhXC.N q /.} e.NXA | a.C | [.= eXi #Xq.x.HXFX;XL..XC $ #.V.K L #./ ;XcXcXc.g $X; 8X; _XfXCXC. }XVXkXsXdXkXnXn A.8.8.BXA A A.O.O...KXKXC 6.VXK 9.IX0.( # W.[.g L +.x.xXF +XF.x :.~.Y.fXb.lXVXz ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` `.$XqX%.x F.[X5XLX&X6.`._ qXhXn.<.; mX>X,XnXZ pXU.< uX& ~.G Q.J N ` ` ` ` ` ` ` ` ` ` ` `Xl gXN CXd.= D } i.z C.=.= [XX.NXG |XO ..| RXCXh s.NXC.` = eXw | a.Y.Y qXX.S.=.,., _ F.H.1 FXFXf 9Xf.MX0XCXfX0 f.Y.nXNXc.L.gX0 9.( L.VXf 8.K |XwXKXi.6.,.Y 8 f.aX,.PXV. A.O._ a.BXK s f a { {.VXf.(.(.KX0.,., # MX5 _ FX5.X :.u I.g 8.B iXV.b.$.L.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` k <.;.RX8 $.x.F.5 H.RX-.|.| XXZ p <.N X u.5XUX6XtX& ~ ~XD ~.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` N.$ e uX>XV D.=.3 i } e.| zXnXi.P X...NX> a.C u.` CXC aXhXhXhXh { eX= D RXF.x hXqXLXLX0X;Xf 9Xf 9.V.V $.M f.(.L.n.6.6.,.lXb.l L 9.MX0.(Xw.@.L 7.(X; # LX;.(.(XiXs.z C.O < s 7Xi..XwXiXK f.V.(XK a.M.(.L., M L.~X4 +.XX4XFXF.XX4.g.IXKXDXbXb.W ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` k m.;.R.R f.I.F.F.F.A.e [ e [.< pX,. X,XG u.`.:.; ~ ~.G -XV ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XMXz.JXJ -.|X> C i [ [ 2 ZXkXhXn |.NXn.C.7 /XhXe.BXCXh.NXh.@.U.U 7 9 F.HXqXF.[X;.MXLX5.K a a # #.VX;.(Xb.L.n./.6.l.LXb {.VX;Xf.V.Y 9XX.l eXwXwXi L.,.l.l.l.@ iXd.< p i.@.B R i e R R {.|XA #.Y {XbXK LX;.L.L LX5 IX4.x d.u.D I + A.l.|Xs.+ ` ` `Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` `.+.J.. 6._.! AX8X8 YX#.X 7.= iXOXnX>X, X.<.`.:.:X-.J ~ .XyXz ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xl.v e z u zX>.| DX= [.N ..f qXG 6.J.Z.<. Xf A..XA 9XX e Z.@.,.x 8XLX; FX; $ fX;Xf 8 aXhXA.MXA.V.n./.0.W./.6Xb.lX0XC.C.M.. 2.l L q.(XV i ZX=.~.6.(XK.6 7XK 2Xk.G uX> } i.|X>..XK 2 2.NXA {Xb {.Y.K f.l./X4X0.L.gXF :Xp : dX#.X M a.P.6 NXx k.z ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` N i.L I :XK.|.'X8.H +.(.= DXk XX>X>X>.G.R.:.:.: E Q.' } ~XM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XM k u u C i }X>X>XG }.f.O u.Z EXe.fXn. .! 6Xe.6 6.Y F.1.1.1 + $XLX; +Xf 9 |X;X0 a A 9 |.C {XB ,XB.6.n.6XKXf 9 |.K # 2XX {.C } D.P 1.z.6Xi.YX% {XbXw 6 2 C.JXD.@ i 2.N } i }X>Xh s s.| RXh a |XiXb.M 8.g.~X0X4 IX4.*X1 I :.XX; s 1 E > EXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` `.s ;.~.6 D [ R < z i [ C }XG XX>X>.J.:.:.:X$.: EXP.P.' i ` ` ` ` ` ` ` ` ` ` ` `XM N ` ` ` ` ` ` ` ` ` ` ` ` ` ` 3.`.].'X> CX>XGXGXD >.r.R.f z A.B 6._ 9. .I.*.X h.1.HXLXF.[ $ $X0 8.V | f qXCXG |.K., s.6.~XBXBXb.L s.C.Y #XA aXi iXK {.zXXXn >XkXD 6 l Y Y q 7.NXD X C.hX=.S i }.=.3 [X, R [ 2X>.N RXC 2 2 |.YXf.Y ; MX;.n : h IXp IX1.X _XX>XD >.R.:.:X$X$X$.:XP.} 1 uXz ` ` ` ` ` ` ` ` ` N.DXp.~Xi.uXM ` ` ` ` ` ` ` ` ` ` ` g =.w.Z.r.R.`.R.;.. /X$ oXnXnXG.f.f._ p 6 #.1.*.x.* h.HXL.[Xq W.MXfX; | qXAXeXC |XhXA.MXh s./ ,XB 7XB.,XhXh.( [XB.0.0 7.6 , > u.].hXJ z.I.F Y.8 i B...B < mXH g.+ cX:.0 i i.=X= DX>.NXX.N sX>XOXhXhXK.(.KXf.L.n.x d I.*.*.*X1.X.I E E i ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` `.+.=.@.N. .N.N.NX> .X-.`.: ^X$X$.:X$X$.:X- = - Q N ` ` ` ` ` ` `XS 0Xp d & d I.l 6 p <.U ! ` ` ` ` ` ` ` c = - - /.R.r.R.7 n o >X> X.N XX,.f <.E.I.H.H F.XXq hX0.H.i.H fXf a 8 L.Y.f.N f 9 R R 9 aXhXBXN.6 2.@Xi. .| 2./ , Z.UX=Xs.z - ~ m ~.J.G .N RXeXh 9Xi.YX;.g I h d : :.* h K.J.W.&.+XP.& ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` `XM.W.NX>X>XD.J.`.r O ^X$X$X$X$.:X$.:.: QXd u k ` ` ` ` ` ` `.m 0.j &X@.j : ;.n..X&.J =X7 c.^ ` ` ` `.^ =XJ.GX< ~XZ.'. -.O.[.IXq K.H.xXL.x.1X5 MX% $X;Xh 9XA 9XC ..f.V.CXe q.(.6XB.@ {.| 7 7Xb i i Z DXG.0.0Xd Z.h Q.}X7.{.{.G m 6Xn.PXsXn p.O.E ~.b ` ` ` ` ` ` ` ` ` ` ` ` % g.+.U.= [.NX>.N R.N.YXf 9., MX4 :.*.*.*X#.H ; 3 E o.v ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` `.^.%.y.yX$ ^ OX* OX$ OX$X$X$.:X$.:.y.J -.]XM ` ` ` ` `.m.m.m.mXS.sXzXBXi {XCXe / BX7.wXZ DXM ` ` `.k.}.}.' H ~X&Xy.<.; E.{ -.G u u z . { K.I.C L + 8X#Xq _.1XLXq.I f $XA q RXAXf.N.f A.Y a. .|.6 i.| 2.6 1 Z 1 , 1.2.z.{.h.3.{ 3 3 ZX7.2.2.2X= 1.h.G >XD.. 6 p pXt ..b ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XlXM 4 k D }Xh.NXh a |.K #.,XLXF d h.X F / E o = ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` `.T.% j.p G.Q.q 4.%.qX$.%.:.:.:X$.R.P.J.W ` ` ` ` ` ` ` ` ` ` ` ` g./ D , k -.w jX7X7 /X-X-.p.+.k.U.{.J HX& ~.;X& m u E EX7X= Z 1Xd X A 6.8.B.YX5.K dXF 8.H MXL _.I.a.! R.NXhXh.. z (. XhXOXX 7XB.=.=XB Z.3.2.S 3 - e.{.{ 1 =X7 3.S.2X3X3Xv `XS 4Xd QXX> X a.! f 8X; +XFXF FX<.7 EXM ` `.& ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` `.bXg GX:.Q.q.t j.%.y j.:X$.:X$.`.h.< % ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g 3 j jX7 j j.7.7.%.w.w.w QX-.; /.;Xt.< k.U =.2 Z.SX3X3Xd ..B.aXA $.[.Y.K.XX;X5XL Y.i.H.!.8 9XO.NXe {XnXO.N aXCXOX,XK i e.=.0.2 1.2 1 3 1 3X7.PX=.2 [ Z.SX3Xv ` ` ` ` NXz.J ~XUXZXt.A.E.eXw.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XMXz.@ }X> {.. f.OX8XLXq.x.H.O.JXM x.p.3 ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ).#.) V.% O.%.Q.y.y.yX$.:X$ b E.' k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xv.t j j.w.w.7.7.wX*.7X- / /X6 ~.' g ` %.3.3 Z.SX3X3X=Xh.C.K.V.aX%.I.(X5 LX#.X M.i.i.I 6 < 6.NXO.N R.NXOX> (.NX> a a C.=XcX7X7 ZX=.2.3X7.2X7.S i .X= c x ` ` ` ` ` ` `.kXJX6 HX6.A.5X%.1XL.LXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XS.k.WX>.NXe.C 6X%.I M.1Xq K.~X* n o N ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` `Xv G x.qX$X$ G OX$X$X$X$ ^ =XJ.P.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xx 1 /.w j.w E / HX- /X6Xt.' g ` ` `.+.= [ ZX3.S.S i CXV C. X% $XwX;X;XLX#.i.[X% l._Xy < 9X>XO.N qX> X.N a.N.N 2Xs.3.S.SX3.2X7X3X7.SX3 Z [.|.0Xj ` ` ` ` ` ` ` ` ` N.J / H HX&.5.X h.x 5.W ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XM k iXeXO.K 6.8 YXq 8.8.Z.r.r r ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` x.Q `.)X$.:.q.%X$X$X$X$ b D u.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^.2 E.;.;.; Q Q.w /.;XD g ` ` ` ` `.W } i.SX3.SX= zXV.P.P.!.i {Xw #.i + + MX% l.[XZXZ.NXhX>X>Xh R [ [XK.| i.3.S.2.S.2X3X3.SX3X3 Z.= }XzXv ` ` ` ` ` ` ` ` ` ` ` `XB.]X< ~Xu.e F.x.*XqX8.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` N kX> } X 6 W l W.[XU.y.r g ` ` yXM ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` `XSXg ! t.q.q.%.q.yX$X$ O - i ,XS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^ kXuXu.; QXP.w Q >.b ` ` ` ` ` `Xl.WX>.|X=.S.S =.G C.P.B 8XKXw # 5XL.H.H Y.o.O p.'.NXhX> XX>.|.| [.|.@X=.SX3X3X3X3X3.SX3X3X3.0.$Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` gXy.5.5.E.e.8 l.i lX8 g ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` %.U.N. Xn.O.F.I $._ Q.nXMX X$.+ ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` !X `.Q.#.q.%.%X$ ^.'X>Xs.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.vXuXuXP j = >.b ` ` ` ` ` ` ` `Xl.WX> }.0X3.S ZXd [.|X,. 2.[ W.HXL 5Xq.F } m uX,.N 2 [ D.=.= D [ iXB ZX=X3X3X3X3X3X3 cXv ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^X&Xy.E.E u =X8.E.E.A.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g 7 i X.O <.F $ f 6.C =X$X= ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xv ` c c.p j c ^ n s. .v ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.b ,.w Q ,.b ` ` ` ` ` ` ` ` ` `XlXz [ D.S.S.2 3 1.z 1 C C W.[.i Y Y 5.C 7 -.'X> } C.| [ }XX }XV D.=.=.=.3X=.2 3 3 /.& ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` kX&.E.eXU =X<.5Xy.P ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` N.+ DX, iXn A.O.F.a ~ ~XP.+ 4 cXB r ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.v k.W.W.n.7.G.BXz ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XM ,.3X3X3X=.zX7Xs z.O.o 5X% M.i.i.YXNXd ~X> } }X>X>XD C.P - -.G Q / HX-.7X6X6 k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` NX&.AX8.o.~ B.E.A k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` % kX=.@ R Z.fXV.P < D 1 ZX3 c ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` g.xX#XF _.Y.N.WXS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xl.$XB.3.3.= i > z.O l 5.o 5X;X% W.6 BXt k g.$.$.kXxXM.3XuXuX6 H HX6X6X6Xu e.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` e.E.o l.6.n M.e.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.b.+ i.S e.zX3.zX3X3.S c ) ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` NX0.*.*.KXXXzXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` r.+XBXVXV >.< p._.F.o # l l.CXB.]XM ` ` ` ` `.b -XuXuX6X6XuXuXuXu.J.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.+Xy.e {.l YX%.e.$ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XS.k.# k.S.S c cXv ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.$X5 9./.k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` NXM r./.'.5X8._ 8 l.i l 2 6 g ` ` ` ` ` k -X6Xu ~.;XuXuXu.J.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XM ~.{X=.n.1X%.eXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` N.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xl./X&.e.E l M FXL.Y.e.+ ` ` ` ` `.|XdX,.'XD.J u u k N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^X7X7 Z.~X4 5.oXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^XB.5.F 5XF.*.X f.o.W ` ` ` ` ` DXD D > D >XD.PXM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^.w.hXKXpX4 Y.o.$ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ;.i.i.1X#.xXF $.o.G ` ` ` ` `.= } Z z Z DXDXVXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X .w u. .~X0Xq l k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.$.i Y.[Xq + + 8.a.E , ` ` ` ` `.2 [X=Xd.3.S ZXz ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 1XU p B.6 L Y.iXb ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.k ;.[Xq.1.iX;.i._ p.e.E.+ ` ` ` ` `.p.=.SX7.P.z ,Xl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.kX&.EX8.iX0Xq YX%. .b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X e l.1.XXF.H.C.f.FXU.AXy , ` ` ` ` ` `.pXP i 3.y.yXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^.GXy.E l.i M.[Xq 5X8.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` k 2.Y.X hX1Xq.8 1 mXt QXd g ` ` ` ` ` ` `.).p n o.% O ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xz.A p.F l.i M + Y lX8Xz ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.+ 6 YX5.*X1 5.F m.{ Q.U.k ` ` ` ` ` ` ` ` `.cX:X$.p.).p ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` NXu.A.5 l Y.xX1 +.H 5X8.W ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 1 l.1.*.xX; >.}.UX XS ` ` ` ` ` ` ` ` ` ` ` ` tX$X:.c.p ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XMXy.5 p.o Y.*.*.x.1XL l > ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xl k.<.iXL.X.i 3X7Xx ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^X$ y ` G ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xz /.A p.[X5X#X1.XXLX%.o [ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xl.gX0 B.i F.[.GX3.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.q.c `.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.$ lX8 ~.5X8.oXL.x.i.iX8X8.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.D IX0., + F._.t.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` y.c ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xi 8 IXtX&.E.E lX%.F.E.A e ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xp., :X4 :X5.!.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.b.B.6.l.IXF.8.[.*.*X0 q.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xz.g I.~ d.gXX N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.b.|./ 6 8 :.V.g.D d.g ; ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.D.~.n ; ;.l k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` NXB 7.V.,.u |.~ d.X., k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` gXN.0.(XNXB.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `./X, aXN.gXA./ ;.g.Y g ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` gXi 1.s.D N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.k 1XiXN ; 7 ,XcXcXBXl ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.T.sXz.s 0 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` y.q ,.0XcXd {.L.0XM ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xv.s.j.sXS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X .p [Xb.6.w.$.D r ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.&.s.^.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.# y.+./ 7 k.k.sXS ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.s ` x ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` VXa.#.s.s.m V.s ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.T ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.&XS V.s.s `X .s ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.c.j 0 `Xv 0 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `X ) ` `.^ y ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `.TXv ` ` `.& ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Xg ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", + " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` x ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `" + }; *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/Qt/qttableview.cpp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,2275 ---- + /********************************************************************** + ** $Id: qttableview.cpp,v 1.2 2002/03/09 03:13:15 jwalz Exp $ + ** + ** Implementation of QtTableView class + ** + ** Created : 941115 + ** + ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. + ** + ** This file contains a class moved out of the Qt GUI Toolkit API. It + ** may be used, distributed and modified without limitation. + ** + **********************************************************************/ + + #include "qttableview.h" + #if QT_VERSION >= 300 + #ifndef QT_NO_QTTABLEVIEW + #include + #include + #include + #include + + enum ScrollBarDirtyFlags { + verGeometry = 0x01, + verSteps = 0x02, + verRange = 0x04, + verValue = 0x08, + horGeometry = 0x10, + horSteps = 0x20, + horRange = 0x40, + horValue = 0x80, + verMask = 0x0F, + horMask = 0xF0 + }; + + + #define HSBEXT horizontalScrollBar()->sizeHint().height() + #define VSBEXT verticalScrollBar()->sizeHint().width() + + + class QCornerSquare : public QWidget // internal class + { + public: + QCornerSquare( QWidget *, const char* = 0 ); + void paintEvent( QPaintEvent * ); + }; + + QCornerSquare::QCornerSquare( QWidget *parent, const char *name ) + : QWidget( parent, name ) + { + } + + void QCornerSquare::paintEvent( QPaintEvent * ) + { + } + + + // NOT REVISED + /*! + \class QtTableView qttableview.h + \brief The QtTableView class provides an abstract base for tables. + + \obsolete + + A table view consists of a number of abstract cells organized in rows + and columns, and a visible part called a view. The cells are identified + with a row index and a column index. The top-left cell is in row 0, + column 0. + + The behavior of the widget can be finely tuned using + setTableFlags(); a typical subclass will consist of little more than a + call to setTableFlags(), some table content manipulation and an + implementation of paintCell(). Subclasses that need cells with + variable width or height must reimplement cellHeight() and/or + cellWidth(). Use updateTableSize() to tell QtTableView when the + width or height has changed. + + When you read this documentation, it is important to understand the + distinctions among the four pixel coordinate systems involved. + + \list 1 + \i The \e cell coordinates. (0,0) is the top-left corner of a cell. + Cell coordinates are used by functions such as paintCell(). + + \i The \e table coordinates. (0,0) is the top-left corner of the cell at + row 0 and column 0. These coordinates are absolute; that is, they are + independent of what part of the table is visible at the moment. They are + used by functions such as setXOffset() or maxYOffset(). + + \i The \e widget coordinates. (0,0) is the top-left corner of the widget, + \e including the frame. They are used by functions such as repaint(). + + \i The \e view coordinates. (0,0) is the top-left corner of the view, \e + excluding the frame. This is the least-used coordinate system; it is used by + functions such as viewWidth(). \endlist + + It is rather unfortunate that we have to use four different + coordinate systems, but there was no alternative to provide a flexible and + powerful base class. + + Note: The row,column indices are always given in that order, + i.e., first the vertical (row), then the horizontal (column). This is + the opposite order of all pixel operations, which take first the + horizontal (x) and then the vertical (y). + + + + \warning the functions setNumRows(), setNumCols(), setCellHeight(), + setCellWidth(), setTableFlags() and clearTableFlags() may cause + virtual functions such as cellWidth() and cellHeight() to be called, + even if autoUpdate() is FALSE. This may cause errors if relevant + state variables are not initialized. + + \warning Experience has shown that use of this widget tends to cause + more bugs than expected and our analysis indicates that the widget's + very flexibility is the problem. If QScrollView or QListBox can + easily be made to do the job you need, we recommend subclassing + those widgets rather than QtTableView. In addition, QScrollView makes + it easy to have child widgets inside tables, which QtTableView + doesn't support at all. + + \sa QScrollView + \link guibooks.html#fowler GUI Design Handbook: Table\endlink + */ + + + /*! + Constructs a table view. The \a parent, \a name and \f arguments + are passed to the QFrame constructor. + + The \link setTableFlags() table flags\endlink are all cleared (set to 0). + Set \c Tbl_autoVScrollBar or \c Tbl_autoHScrollBar to get automatic scroll + bars and \c Tbl_clipCellPainting to get safe clipping. + + The \link setCellHeight() cell height\endlink and \link setCellWidth() + cell width\endlink are set to 0. + + Frame line shapes (QFrame::HLink and QFrame::VLine) are disallowed; + see QFrame::setFrameStyle(). + + Note that the \a f argument is \e not \link setTableFlags() table + flags \endlink but rather \link QWidget::QWidget() widget + flags. \endlink + + */ + + QtTableView::QtTableView( QWidget *parent, const char *name, WFlags f ) + : QFrame( parent, name, f ) + { + nRows = nCols = 0; // zero rows/cols + xCellOffs = yCellOffs = 0; // zero offset + xCellDelta = yCellDelta = 0; // zero cell offset + xOffs = yOffs = 0; // zero total pixel offset + cellH = cellW = 0; // user defined cell size + tFlags = 0; + vScrollBar = hScrollBar = 0; // no scroll bars + cornerSquare = 0; + sbDirty = 0; + eraseInPaint = FALSE; + verSliding = FALSE; + verSnappingOff = FALSE; + horSliding = FALSE; + horSnappingOff = FALSE; + coveringCornerSquare = FALSE; + inSbUpdate = FALSE; + } + + /*! + Destroys the table view. + */ + + QtTableView::~QtTableView() + { + delete vScrollBar; + delete hScrollBar; + delete cornerSquare; + } + + + /*! + \internal + Reimplements QWidget::setBackgroundColor() for binary compatibility. + \sa setPalette() + */ + + void QtTableView::setBackgroundColor( const QColor &c ) + { + QWidget::setBackgroundColor( c ); + } + + /*!\reimp + */ + + void QtTableView::setPalette( const QPalette &p ) + { + QWidget::setPalette( p ); + } + + /*!\reimp + */ + + void QtTableView::show() + { + showOrHideScrollBars(); + QWidget::show(); + } + + + /*! + \overload void QtTableView::repaint( bool erase ) + Repaints the entire view. + */ + + /*! + Repaints the table view directly by calling paintEvent() directly + unless updates are disabled. + + Erases the view area \a (x,y,w,h) if \a erase is TRUE. Parameters \a + (x,y) are in \e widget coordinates. + + If \a w is negative, it is replaced with width() - x. + If \a h is negative, it is replaced with height() - y. + + Doing a repaint() usually is faster than doing an update(), but + calling update() many times in a row will generate a single paint + event. + + At present, QtTableView is the only widget that reimplements \link + QWidget::repaint() repaint()\endlink. It does this because by + clearing and then repainting one cell at at time, it can make the + screen flicker less than it would otherwise. */ + + void QtTableView::repaint( int x, int y, int w, int h, bool erase ) + { + if ( !isVisible() || testWState(WState_BlockUpdates) ) + return; + if ( w < 0 ) + w = width() - x; + if ( h < 0 ) + h = height() - y; + QRect r( x, y, w, h ); + if ( r.isEmpty() ) + return; // nothing to do + QPaintEvent e( r ); + if ( erase && backgroundMode() != NoBackground ) + eraseInPaint = TRUE; // erase when painting + paintEvent( &e ); + eraseInPaint = FALSE; + } + + /*! + \overload void QtTableView::repaint( const QRect &r, bool erase ) + Replaints rectangle \a r. If \a erase is TRUE draws the background + using the palette's background. + */ + + + /*! + \fn int QtTableView::numRows() const + Returns the number of rows in the table. + \sa numCols(), setNumRows() + */ + + /*! + Sets the number of rows of the table to \a rows (must be non-negative). + Does not change topCell(). + + The table repaints itself automatically if autoUpdate() is set. + + \sa numCols(), setNumCols(), numRows() + */ + + void QtTableView::setNumRows( int rows ) + { + if ( rows < 0 ) { + #if defined(QT_CHECK_RANGE) + qWarning( "QtTableView::setNumRows: (%s) Negative argument %d.", + name( "unnamed" ), rows ); + #endif + return; + } + if ( nRows == rows ) + return; + + if ( autoUpdate() && isVisible() ) { + int oldLastVisible = lastRowVisible(); + int oldTopCell = topCell(); + nRows = rows; + if ( autoUpdate() && isVisible() && + ( oldLastVisible != lastRowVisible() || oldTopCell != topCell() ) ) + repaint( oldTopCell != topCell() ); + } else { + // Be more careful - if destructing, bad things might happen. + nRows = rows; + } + updateScrollBars( verRange ); + updateFrameSize(); + } + + /*! + \fn int QtTableView::numCols() const + Returns the number of columns in the table. + \sa numRows(), setNumCols() + */ + + /*! + Sets the number of columns of the table to \a cols (must be non-negative). + Does not change leftCell(). + + The table repaints itself automatically if autoUpdate() is set. + + \sa numCols(), numRows(), setNumRows() + */ + + void QtTableView::setNumCols( int cols ) + { + if ( cols < 0 ) { + #if defined(QT_CHECK_RANGE) + qWarning( "QtTableView::setNumCols: (%s) Negative argument %d.", + name( "unnamed" ), cols ); + #endif + return; + } + if ( nCols == cols ) + return; + int oldCols = nCols; + nCols = cols; + if ( autoUpdate() && isVisible() ) { + int maxCol = lastColVisible(); + if ( maxCol >= oldCols || maxCol >= nCols ) + repaint(); + } + updateScrollBars( horRange ); + updateFrameSize(); + } + + + /*! + \fn int QtTableView::topCell() const + Returns the index of the first row in the table that is visible in + the view. The index of the first row is 0. + \sa leftCell(), setTopCell() + */ + + /*! + Scrolls the table so that \a row becomes the top row. + The index of the very first row is 0. + \sa setYOffset(), setTopLeftCell(), setLeftCell() + */ + + void QtTableView::setTopCell( int row ) + { + setTopLeftCell( row, -1 ); + return; + } + + /*! + \fn int QtTableView::leftCell() const + Returns the index of the first column in the table that is visible in + the view. The index of the very leftmost column is 0. + \sa topCell(), setLeftCell() + */ + + /*! + Scrolls the table so that \a col becomes the leftmost + column. The index of the leftmost column is 0. + \sa setXOffset(), setTopLeftCell(), setTopCell() + */ + + void QtTableView::setLeftCell( int col ) + { + setTopLeftCell( -1, col ); + return; + } + + /*! + Scrolls the table so that the cell at row \a row and colum \a + col becomes the top-left cell in the view. The cell at the extreme + top left of the table is at position (0,0). + \sa setLeftCell(), setTopCell(), setOffset() + */ + + void QtTableView::setTopLeftCell( int row, int col ) + { + int newX = xOffs; + int newY = yOffs; + + if ( col >= 0 ) { + if ( cellW ) { + newX = col*cellW; + if ( newX > maxXOffset() ) + newX = maxXOffset(); + } else { + newX = 0; + while ( col ) + newX += cellWidth( --col ); // optimize using current! ### + } + } + if ( row >= 0 ) { + if ( cellH ) { + newY = row*cellH; + if ( newY > maxYOffset() ) + newY = maxYOffset(); + } else { + newY = 0; + while ( row ) + newY += cellHeight( --row ); // optimize using current! ### + } + } + setOffset( newX, newY ); + } + + + /*! + \fn int QtTableView::xOffset() const + + Returns the x coordinate in \e table coordinates of the pixel that is + currently on the left edge of the view. + + \sa setXOffset(), yOffset(), leftCell() */ + + /*! + Scrolls the table so that \a x becomes the leftmost pixel in the view. + The \a x parameter is in \e table coordinates. + + The interaction with \link setTableFlags() Tbl_snapToHGrid + \endlink is tricky. + + \sa xOffset(), setYOffset(), setOffset(), setLeftCell() + */ + + void QtTableView::setXOffset( int x ) + { + setOffset( x, yOffset() ); + } + + /*! + \fn int QtTableView::yOffset() const + + Returns the y coordinate in \e table coordinates of the pixel that is + currently on the top edge of the view. + + \sa setYOffset(), xOffset(), topCell() + */ + + + /*! + Scrolls the table so that \a y becomes the top pixel in the view. + The \a y parameter is in \e table coordinates. + + The interaction with \link setTableFlags() Tbl_snapToVGrid + \endlink is tricky. + + \sa yOffset(), setXOffset(), setOffset(), setTopCell() + */ + + void QtTableView::setYOffset( int y ) + { + setOffset( xOffset(), y ); + } + + /*! + Scrolls the table so that \a (x,y) becomes the top-left pixel + in the view. Parameters \a (x,y) are in \e table coordinates. + + The interaction with \link setTableFlags() Tbl_snapTo*Grid \endlink + is tricky. If \a updateScrBars is TRUE, the scroll bars are + updated. + + \sa xOffset(), yOffset(), setXOffset(), setYOffset(), setTopLeftCell() + */ + + void QtTableView::setOffset( int x, int y, bool updateScrBars ) + { + if ( (!testTableFlags(Tbl_snapToHGrid) || xCellDelta == 0) && + (!testTableFlags(Tbl_snapToVGrid) || yCellDelta == 0) && + (x == xOffs && y == yOffs) ) + return; + + if ( x < 0 ) + x = 0; + if ( y < 0 ) + y = 0; + + if ( cellW ) { + if ( x > maxXOffset() ) + x = maxXOffset(); + xCellOffs = x / cellW; + if ( !testTableFlags(Tbl_snapToHGrid) ) { + xCellDelta = (short)(x % cellW); + } else { + x = xCellOffs*cellW; + xCellDelta = 0; + } + } else { + int xn=0, xcd=0, col = 0; + while ( col < nCols-1 && x >= xn+(xcd=cellWidth(col)) ) { + xn += xcd; + col++; + } + xCellOffs = col; + if ( testTableFlags(Tbl_snapToHGrid) ) { + xCellDelta = 0; + x = xn; + } else { + xCellDelta = (short)(x-xn); + } + } + if ( cellH ) { + if ( y > maxYOffset() ) + y = maxYOffset(); + yCellOffs = y / cellH; + if ( !testTableFlags(Tbl_snapToVGrid) ) { + yCellDelta = (short)(y % cellH); + } else { + y = yCellOffs*cellH; + yCellDelta = 0; + } + } else { + int yn=0, yrd=0, row=0; + while ( row < nRows-1 && y >= yn+(yrd=cellHeight(row)) ) { + yn += yrd; + row++; + } + yCellOffs = row; + if ( testTableFlags(Tbl_snapToVGrid) ) { + yCellDelta = 0; + y = yn; + } else { + yCellDelta = (short)(y-yn); + } + } + int dx = (x - xOffs); + int dy = (y - yOffs); + xOffs = x; + yOffs = y; + if ( autoUpdate() && isVisible() ) + scroll( dx, dy ); + if ( updateScrBars ) + updateScrollBars( verValue | horValue ); + } + + + /*! + \overload int QtTableView::cellWidth() const + + Returns the column width in pixels. Returns 0 if the columns have + variable widths. + + \sa setCellWidth(), cellHeight() + */ + + /*! + Returns the width of column \a col in pixels. + + This function is virtual and must be reimplemented by subclasses that + have variable cell widths. Note that if the total table width + changes, updateTableSize() must be called. + + \sa setCellWidth(), cellHeight(), totalWidth(), updateTableSize() + */ + + int QtTableView::cellWidth( int ) + { + return cellW; + } + + + /*! + Sets the width in pixels of the table cells to \a cellWidth. + + Setting it to 0 means that the column width is variable. When + set to 0 (this is the default) QtTableView calls the virtual function + cellWidth() to get the width. + + \sa cellWidth(), setCellHeight(), totalWidth(), numCols() + */ + + void QtTableView::setCellWidth( int cellWidth ) + { + if ( cellW == cellWidth ) + return; + #if defined(QT_CHECK_RANGE) + if ( cellWidth < 0 || cellWidth > SHRT_MAX ) { + qWarning( "QtTableView::setCellWidth: (%s) Argument out of range (%d)", + name( "unnamed" ), cellWidth ); + return; + } + #endif + cellW = (short)cellWidth; + + updateScrollBars( horSteps | horRange ); + if ( autoUpdate() && isVisible() ) + repaint(); + + } + + /*! + \overload int QtTableView::cellHeight() const + + Returns the row height, in pixels. Returns 0 if the rows have + variable heights. + + \sa setCellHeight(), cellWidth() + */ + + + /*! + Returns the height of row \a row in pixels. + + This function is virtual and must be reimplemented by subclasses that + have variable cell heights. Note that if the total table height + changes, updateTableSize() must be called. + + \sa setCellHeight(), cellWidth(), totalHeight() + */ + + int QtTableView::cellHeight( int ) + { + return cellH; + } + + /*! + Sets the height in pixels of the table cells to \a cellHeight. + + Setting it to 0 means that the row height is variable. When set + to 0 (this is the default), QtTableView calls the virtual function + cellHeight() to get the height. + + \sa cellHeight(), setCellWidth(), totalHeight(), numRows() + */ + + void QtTableView::setCellHeight( int cellHeight ) + { + if ( cellH == cellHeight ) + return; + #if defined(QT_CHECK_RANGE) + if ( cellHeight < 0 || cellHeight > SHRT_MAX ) { + qWarning( "QtTableView::setCellHeight: (%s) Argument out of range (%d)", + name( "unnamed" ), cellHeight ); + return; + } + #endif + cellH = (short)cellHeight; + if ( autoUpdate() && isVisible() ) + repaint(); + updateScrollBars( verSteps | verRange ); + } + + + /*! + Returns the total width of the table in pixels. + + This function is virtual and should be reimplemented by subclasses that + have variable cell widths and a non-trivial cellWidth() function, or a + large number of columns in the table. + + The default implementation may be slow for very wide tables. + + \sa cellWidth(), totalHeight() */ + + int QtTableView::totalWidth() + { + if ( cellW ) { + return cellW*nCols; + } else { + int tw = 0; + for( int i = 0 ; i < nCols ; i++ ) + tw += cellWidth( i ); + return tw; + } + } + + /*! + Returns the total height of the table in pixels. + + This function is virtual and should be reimplemented by subclasses that + have variable cell heights and a non-trivial cellHeight() function, or a + large number of rows in the table. + + The default implementation may be slow for very tall tables. + + \sa cellHeight(), totalWidth() + */ + + int QtTableView::totalHeight() + { + if ( cellH ) { + return cellH*nRows; + } else { + int th = 0; + for( int i = 0 ; i < nRows ; i++ ) + th += cellHeight( i ); + return th; + } + } + + + /*! + \fn uint QtTableView::tableFlags() const + + Returns the union of the table flags that are currently set. + + \sa setTableFlags(), clearTableFlags(), testTableFlags() + */ + + /*! + \fn bool QtTableView::testTableFlags( uint f ) const + + Returns TRUE if any of the table flags in \a f are currently set, + otherwise FALSE. + + \sa setTableFlags(), clearTableFlags(), tableFlags() + */ + + /*! + Sets the table flags to \a f. + + If a flag setting changes the appearance of the table, the table is + repainted if - and only if - autoUpdate() is TRUE. + + The table flags are mostly single bits, though there are some multibit + flags for convenience. Here is a complete list: + +
+
Tbl_vScrollBar
- The table has a vertical scroll bar. +
Tbl_hScrollBar
- The table has a horizontal scroll bar. +
Tbl_autoVScrollBar
- The table has a vertical scroll bar if + - and only if - the table is taller than the view. +
Tbl_autoHScrollBar
The table has a horizontal scroll bar if + - and only if - the table is wider than the view. +
Tbl_autoScrollBars
- The union of the previous two flags. +
Tbl_clipCellPainting
- The table uses QPainter::setClipRect() to + make sure that paintCell() will not draw outside the cell + boundaries. +
Tbl_cutCellsV
- The table will never show part of a + cell at the bottom of the table; if there is not space for all of + a cell, the space is left blank. +
Tbl_cutCellsH
- The table will never show part of a + cell at the right side of the table; if there is not space for all of + a cell, the space is left blank. +
Tbl_cutCells
- The union of the previous two flags. +
Tbl_scrollLastHCell
- When the user scrolls horizontally, + let him/her scroll the last cell left until it is at the left + edge of the view. If this flag is not set, the user can only scroll + to the point where the last cell is completely visible. +
Tbl_scrollLastVCell
- When the user scrolls vertically, let + him/her scroll the last cell up until it is at the top edge of + the view. If this flag is not set, the user can only scroll to the + point where the last cell is completely visible. +
Tbl_scrollLastCell
- The union of the previous two flags. +
Tbl_smoothHScrolling
- The table scrolls as smoothly as + possible when the user scrolls horizontally. When this flag is not + set, scrolling is done one cell at a time. +
Tbl_smoothVScrolling
- The table scrolls as smoothly as + possible when scrolling vertically. When this flag is not set, + scrolling is done one cell at a time. +
Tbl_smoothScrolling
- The union of the previous two flags. +
Tbl_snapToHGrid
- Except when the user is actually scrolling, + the leftmost column shown snaps to the leftmost edge of the view. +
Tbl_snapToVGrid
- Except when the user is actually + scrolling, the top row snaps to the top edge of the view. +
Tbl_snapToGrid
- The union of the previous two flags. +
+ + You can specify more than one flag at a time using bitwise OR. + + Example: + \code + setTableFlags( Tbl_smoothScrolling | Tbl_autoScrollBars ); + \endcode + + \warning The cutCells options (\c Tbl_cutCells, \c Tbl_cutCellsH and + Tbl_cutCellsV) may cause painting problems when scrollbars are + enabled. Do not combine cutCells and scrollbars. + + + \sa clearTableFlags(), testTableFlags(), tableFlags() + */ + + void QtTableView::setTableFlags( uint f ) + { + f = (f ^ tFlags) & f; // clear flags already set + tFlags |= f; + + bool updateOn = autoUpdate(); + setAutoUpdate( FALSE ); + + uint repaintMask = Tbl_cutCellsV | Tbl_cutCellsH; + + if ( f & Tbl_vScrollBar ) { + setVerScrollBar( TRUE ); + } + if ( f & Tbl_hScrollBar ) { + setHorScrollBar( TRUE ); + } + if ( f & Tbl_autoVScrollBar ) { + updateScrollBars( verRange ); + } + if ( f & Tbl_autoHScrollBar ) { + updateScrollBars( horRange ); + } + if ( f & Tbl_scrollLastHCell ) { + updateScrollBars( horRange ); + } + if ( f & Tbl_scrollLastVCell ) { + updateScrollBars( verRange ); + } + if ( f & Tbl_snapToHGrid ) { + updateScrollBars( horRange ); + } + if ( f & Tbl_snapToVGrid ) { + updateScrollBars( verRange ); + } + if ( f & Tbl_snapToGrid ) { // Note: checks for 2 flags + if ( (f & Tbl_snapToHGrid) != 0 && xCellDelta != 0 || //have to scroll? + (f & Tbl_snapToVGrid) != 0 && yCellDelta != 0 ) { + snapToGrid( (f & Tbl_snapToHGrid) != 0, // do snapping + (f & Tbl_snapToVGrid) != 0 ); + repaintMask |= Tbl_snapToGrid; // repaint table + } + } + + if ( updateOn ) { + setAutoUpdate( TRUE ); + updateScrollBars(); + if ( isVisible() && (f & repaintMask) ) + repaint(); + } + + } + + /*! + Clears the \link setTableFlags() table flags\endlink that are set + in \a f. + + Example (clears a single flag): + \code + clearTableFlags( Tbl_snapToGrid ); + \endcode + + The default argument clears all flags. + + \sa setTableFlags(), testTableFlags(), tableFlags() + */ + + void QtTableView::clearTableFlags( uint f ) + { + f = (f ^ ~tFlags) & f; // clear flags that are already 0 + tFlags &= ~f; + + bool updateOn = autoUpdate(); + setAutoUpdate( FALSE ); + + uint repaintMask = Tbl_cutCellsV | Tbl_cutCellsH; + + if ( f & Tbl_vScrollBar ) { + setVerScrollBar( FALSE ); + } + if ( f & Tbl_hScrollBar ) { + setHorScrollBar( FALSE ); + } + if ( f & Tbl_scrollLastHCell ) { + int maxX = maxXOffset(); + if ( xOffs > maxX ) { + setOffset( maxX, yOffs ); + repaintMask |= Tbl_scrollLastHCell; + } + updateScrollBars( horRange ); + } + if ( f & Tbl_scrollLastVCell ) { + int maxY = maxYOffset(); + if ( yOffs > maxY ) { + setOffset( xOffs, maxY ); + repaintMask |= Tbl_scrollLastVCell; + } + updateScrollBars( verRange ); + } + if ( f & Tbl_smoothScrolling ) { // Note: checks for 2 flags + if ((f & Tbl_smoothHScrolling) != 0 && xCellDelta != 0 ||//must scroll? + (f & Tbl_smoothVScrolling) != 0 && yCellDelta != 0 ) { + snapToGrid( (f & Tbl_smoothHScrolling) != 0, // do snapping + (f & Tbl_smoothVScrolling) != 0 ); + repaintMask |= Tbl_smoothScrolling; // repaint table + } + } + if ( f & Tbl_snapToHGrid ) { + updateScrollBars( horRange ); + } + if ( f & Tbl_snapToVGrid ) { + updateScrollBars( verRange ); + } + if ( updateOn ) { + setAutoUpdate( TRUE ); + updateScrollBars(); // returns immediately if nothing to do + if ( isVisible() && (f & repaintMask) ) + repaint(); + } + + } + + + /*! + \fn bool QtTableView::autoUpdate() const + + Returns TRUE if the view updates itself automatically whenever it + is changed in some way. + + \sa setAutoUpdate() + */ + + /*! + Sets the auto-update option of the table view to \a enable. + + If \a enable is TRUE (this is the default), the view updates itself + automatically whenever it has changed in some way (for example, when a + \link setTableFlags() flag\endlink is changed). + + If \a enable is FALSE, the view does NOT repaint itself or update + its internal state variables when it is changed. This can be + useful to avoid flicker during large changes and is singularly + useless otherwise. Disable auto-update, do the changes, re-enable + auto-update and call repaint(). + + \warning Do not leave the view in this state for a long time + (i.e., between events). If, for example, the user interacts with the + view when auto-update is off, strange things can happen. + + Setting auto-update to TRUE does not repaint the view; you must call + repaint() to do this. + + \sa autoUpdate(), repaint() + */ + + void QtTableView::setAutoUpdate( bool enable ) + { + if ( isUpdatesEnabled() == enable ) + return; + setUpdatesEnabled( enable ); + if ( enable ) { + showOrHideScrollBars(); + updateScrollBars(); + } + } + + + /*! + Repaints the cell at row \a row, column \a col if it is inside the view. + + If \a erase is TRUE, the relevant part of the view is cleared to the + background color/pixmap before the contents are repainted. + + \sa isVisible() + */ + + void QtTableView::updateCell( int row, int col, bool erase ) + { + int xPos, yPos; + if ( !colXPos( col, &xPos ) ) + return; + if ( !rowYPos( row, &yPos ) ) + return; + QRect uR = QRect( xPos, yPos, + cellW ? cellW : cellWidth(col), + cellH ? cellH : cellHeight(row) ); + repaint( uR.intersect(viewRect()), erase ); + } + + + /*! + \fn QRect QtTableView::cellUpdateRect() const + + This function should be called only from the paintCell() function in + subclasses. It returns the portion of a cell that actually needs to be + updated in \e cell coordinates. This is useful only for non-trivial + paintCell(). + + */ + + /*! + Returns the rectangle that is the actual table, excluding any + frame, in \e widget coordinates. + */ + + QRect QtTableView::viewRect() const + { + return QRect( frameWidth(), frameWidth(), viewWidth(), viewHeight() ); + } + + + /*! + Returns the index of the last (bottom) row in the view. + The index of the first row is 0. + + If no rows are visible it returns -1. This can happen if the + view is too small for the first row and Tbl_cutCellsV is set. + + \sa lastColVisible() + */ + + int QtTableView::lastRowVisible() const + { + int cellMaxY; + int row = findRawRow( maxViewY(), &cellMaxY ); + if ( row == -1 || row >= nRows ) { // maxViewY() past end? + row = nRows - 1; // yes: return last row + } else { + if ( testTableFlags(Tbl_cutCellsV) && cellMaxY > maxViewY() ) { + if ( row == yCellOffs ) // cut by right margin? + return -1; // yes, nothing in the view + else + row = row - 1; // cut by margin, one back + } + } + return row; + } + + /*! + Returns the index of the last (right) column in the view. + The index of the first column is 0. + + If no columns are visible it returns -1. This can happen if the + view is too narrow for the first column and Tbl_cutCellsH is set. + + \sa lastRowVisible() + */ + + int QtTableView::lastColVisible() const + { + int cellMaxX; + int col = findRawCol( maxViewX(), &cellMaxX ); + if ( col == -1 || col >= nCols ) { // maxViewX() past end? + col = nCols - 1; // yes: return last col + } else { + if ( testTableFlags(Tbl_cutCellsH) && cellMaxX > maxViewX() ) { + if ( col == xCellOffs ) // cut by bottom margin? + return -1; // yes, nothing in the view + else + col = col - 1; // cell by margin, one back + } + } + return col; + } + + /*! + Returns TRUE if \a row is at least partially visible. + \sa colIsVisible() + */ + + bool QtTableView::rowIsVisible( int row ) const + { + return rowYPos( row, 0 ); + } + + /*! + Returns TRUE if \a col is at least partially visible. + \sa rowIsVisible() + */ + + bool QtTableView::colIsVisible( int col ) const + { + return colXPos( col, 0 ); + } + + + /*! + \internal + Called when both scroll bars are active at the same time. Covers the + bottom left corner between the two scroll bars with an empty widget. + */ + + void QtTableView::coverCornerSquare( bool enable ) + { + coveringCornerSquare = enable; + if ( !cornerSquare && enable ) { + cornerSquare = new QCornerSquare( this ); + Q_CHECK_PTR( cornerSquare ); + cornerSquare->setGeometry( maxViewX() + frameWidth() + 1, + maxViewY() + frameWidth() + 1, + VSBEXT, + HSBEXT); + } + if ( autoUpdate() && cornerSquare ) { + if ( enable ) + cornerSquare->show(); + else + cornerSquare->hide(); + } + } + + + /*! + \internal + Scroll the view to a position such that: + + If \a horizontal is TRUE, the leftmost column shown fits snugly + with the left edge of the view. + + If \a vertical is TRUE, the top row shown fits snugly with the top + of the view. + + You can achieve the same effect automatically by setting any of the + \link setTableFlags() Tbl_snapTo*Grid \endlink table flags. + */ + + void QtTableView::snapToGrid( bool horizontal, bool vertical ) + { + int newXCell = -1; + int newYCell = -1; + if ( horizontal && xCellDelta != 0 ) { + int w = cellW ? cellW : cellWidth( xCellOffs ); + if ( xCellDelta >= w/2 ) + newXCell = xCellOffs + 1; + else + newXCell = xCellOffs; + } + if ( vertical && yCellDelta != 0 ) { + int h = cellH ? cellH : cellHeight( yCellOffs ); + if ( yCellDelta >= h/2 ) + newYCell = yCellOffs + 1; + else + newYCell = yCellOffs; + } + setTopLeftCell( newYCell, newXCell ); //row,column + } + + /*! + \internal + This internal slot is connected to the horizontal scroll bar's + QScrollBar::valueChanged() signal. + + Moves the table horizontally to offset \a val without updating the + scroll bar. + */ + + void QtTableView::horSbValue( int val ) + { + if ( horSliding ) { + horSliding = FALSE; + if ( horSnappingOff ) { + horSnappingOff = FALSE; + tFlags |= Tbl_snapToHGrid; + } + } + setOffset( val, yOffs, FALSE ); + } + + /*! + \internal + This internal slot is connected to the horizontal scroll bar's + QScrollBar::sliderMoved() signal. + + Scrolls the table smoothly horizontally even if \c Tbl_snapToHGrid is set. + */ + + void QtTableView::horSbSliding( int val ) + { + if ( testTableFlags(Tbl_snapToHGrid) && + testTableFlags(Tbl_smoothHScrolling) ) { + tFlags &= ~Tbl_snapToHGrid; // turn off snapping while sliding + setOffset( val, yOffs, FALSE ); + tFlags |= Tbl_snapToHGrid; // turn on snapping again + } else { + setOffset( val, yOffs, FALSE ); + } + } + + /*! + \internal + This internal slot is connected to the horizontal scroll bar's + QScrollBar::sliderReleased() signal. + */ + + void QtTableView::horSbSlidingDone( ) + { + if ( testTableFlags(Tbl_snapToHGrid) && + testTableFlags(Tbl_smoothHScrolling) ) + snapToGrid( TRUE, FALSE ); + } + + /*! + \internal + This internal slot is connected to the vertical scroll bar's + QScrollBar::valueChanged() signal. + + Moves the table vertically to offset \a val without updating the + scroll bar. + */ + + void QtTableView::verSbValue( int val ) + { + if ( verSliding ) { + verSliding = FALSE; + if ( verSnappingOff ) { + verSnappingOff = FALSE; + tFlags |= Tbl_snapToVGrid; + } + } + setOffset( xOffs, val, FALSE ); + } + + /*! + \internal + This internal slot is connected to the vertical scroll bar's + QScrollBar::sliderMoved() signal. + + Scrolls the table smoothly vertically even if \c Tbl_snapToVGrid is set. + */ + + void QtTableView::verSbSliding( int val ) + { + if ( testTableFlags(Tbl_snapToVGrid) && + testTableFlags(Tbl_smoothVScrolling) ) { + tFlags &= ~Tbl_snapToVGrid; // turn off snapping while sliding + setOffset( xOffs, val, FALSE ); + tFlags |= Tbl_snapToVGrid; // turn on snapping again + } else { + setOffset( xOffs, val, FALSE ); + } + } + + /*! + \internal + This internal slot is connected to the vertical scroll bar's + QScrollBar::sliderReleased() signal. + */ + + void QtTableView::verSbSlidingDone( ) + { + if ( testTableFlags(Tbl_snapToVGrid) && + testTableFlags(Tbl_smoothVScrolling) ) + snapToGrid( FALSE, TRUE ); + } + + + /*! + This virtual function is called before painting of table cells + is started. It can be reimplemented by subclasses that want to + to set up the painter in a special way and that do not want to + do so for each cell. + */ + + void QtTableView::setupPainter( QPainter * ) + { + } + + /*! + \fn void QtTableView::paintCell( QPainter *p, int row, int col ) + + This pure virtual function is called to paint the single cell at \a + (row,col) using \a p, which is open when paintCell() is called and + must remain open. + + The coordinate system is \link QPainter::translate() translated \endlink + so that the origin is at the top-left corner of the cell to be + painted, i.e. \e cell coordinates. Do not scale or shear the coordinate + system (or if you do, restore the transformation matrix before you + return). + + The painter is not clipped by default and for maximum efficiency. For safety, + call setTableFlags(Tbl_clipCellPainting) to enable clipping. + + \sa paintEvent(), setTableFlags() */ + + + /*! + Handles paint events, \a e, for the table view. + + Calls paintCell() for the cells that needs to be repainted. + */ + + void QtTableView::paintEvent( QPaintEvent *e ) + { + QRect updateR = e->rect(); // update rectangle + if ( sbDirty ) { + bool e = eraseInPaint; + updateScrollBars(); + eraseInPaint = e; + } + + QPainter paint( this ); + + if ( !contentsRect().contains( updateR, TRUE ) ) {// update frame ? + drawFrame( &paint ); + if ( updateR.left() < frameWidth() ) //### + updateR.setLeft( frameWidth() ); + if ( updateR.top() < frameWidth() ) + updateR.setTop( frameWidth() ); + } + + int maxWX = maxViewX(); + int maxWY = maxViewY(); + if ( updateR.right() > maxWX ) + updateR.setRight( maxWX ); + if ( updateR.bottom() > maxWY ) + updateR.setBottom( maxWY ); + + setupPainter( &paint ); // prepare for painting table + + int firstRow = findRow( updateR.y() ); + int firstCol = findCol( updateR.x() ); + int xStart, yStart; + if ( !colXPos( firstCol, &xStart ) || !rowYPos( firstRow, &yStart ) ) { + paint.eraseRect( updateR ); // erase area outside cells but in view + return; + } + int maxX = updateR.right(); + int maxY = updateR.bottom(); + int row = firstRow; + int col; + int yPos = yStart; + int xPos = maxX+1; // in case the while() is empty + int nextX; + int nextY; + QRect winR = viewRect(); + QRect cellR; + QRect cellUR; + #ifndef QT_NO_TRANSFORMATIONS + QWMatrix matrix; + #endif + + while ( yPos <= maxY && row < nRows ) { + nextY = yPos + (cellH ? cellH : cellHeight( row )); + if ( testTableFlags( Tbl_cutCellsV ) && nextY > ( maxWY + 1 ) ) + break; + col = firstCol; + xPos = xStart; + while ( xPos <= maxX && col < nCols ) { + nextX = xPos + (cellW ? cellW : cellWidth( col )); + if ( testTableFlags( Tbl_cutCellsH ) && nextX > ( maxWX + 1 ) ) + break; + + cellR.setRect( xPos, yPos, cellW ? cellW : cellWidth(col), + cellH ? cellH : cellHeight(row) ); + cellUR = cellR.intersect( updateR ); + if ( cellUR.isValid() ) { + cellUpdateR = cellUR; + cellUpdateR.moveBy( -xPos, -yPos ); // cell coordinates + if ( eraseInPaint ) + paint.eraseRect( cellUR ); + + #ifndef QT_NO_TRANSFORMATIONS + matrix.translate( xPos, yPos ); + paint.setWorldMatrix( matrix ); + if ( testTableFlags(Tbl_clipCellPainting) || + frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt + paint.setClipRect( cellUR ); + paintCell( &paint, row, col ); + paint.setClipping( FALSE ); + } else { + paintCell( &paint, row, col ); + } + matrix.reset(); + paint.setWorldMatrix( matrix ); + #else + paint.translate( xPos, yPos ); + if ( testTableFlags(Tbl_clipCellPainting) || + frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt + paint.setClipRect( cellUR ); + paintCell( &paint, row, col ); + paint.setClipping( FALSE ); + } else { + paintCell( &paint, row, col ); + } + paint.translate( -xPos, -yPos ); + #endif + } + col++; + xPos = nextX; + } + row++; + yPos = nextY; + } + + // while painting we have to erase any areas in the view that + // are not covered by cells but are covered by the paint event + // rectangle these must be erased. We know that xPos is the last + // x pixel updated + 1 and that yPos is the last y pixel updated + 1. + + // Note that this needs to be done regardless whether we do + // eraseInPaint or not. Reason: a subclass may implement + // flicker-freeness and encourage the use of repaint(FALSE). + // The subclass, however, cannot draw all pixels, just those + // inside the cells. So QtTableView is reponsible for all pixels + // outside the cells. + + QRect viewR = viewRect(); + const QColorGroup g = colorGroup(); + + if ( xPos <= maxX ) { + QRect r = viewR; + r.setLeft( xPos ); + r.setBottom( yPossetCursor( arrowCursor ); + #endif + sb->resize( sb->sizeHint() ); // height is irrelevant + Q_CHECK_PTR(sb); + sb->setTracking( FALSE ); + sb->setFocusPolicy( NoFocus ); + connect( sb, SIGNAL(valueChanged(int)), + SLOT(verSbValue(int))); + connect( sb, SIGNAL(sliderMoved(int)), + SLOT(verSbSliding(int))); + connect( sb, SIGNAL(sliderReleased()), + SLOT(verSbSlidingDone())); + sb->hide(); + that->vScrollBar = sb; + return sb; + } + return vScrollBar; + } + + /*! + Returns a pointer to the horizontal scroll bar mainly so you can + connect() to its signals. Note that the scroll bar works in pixel + values; use findCol() to translate to cell numbers. + */ + + QScrollBar *QtTableView::horizontalScrollBar() const + { + QtTableView *that = (QtTableView*)this; // semantic const + if ( !hScrollBar ) { + QScrollBar *sb = new QScrollBar( QScrollBar::Horizontal, that ); + #ifndef QT_NO_CURSOR + sb->setCursor( arrowCursor ); + #endif + sb->resize( sb->sizeHint() ); // width is irrelevant + sb->setFocusPolicy( NoFocus ); + Q_CHECK_PTR(sb); + sb->setTracking( FALSE ); + connect( sb, SIGNAL(valueChanged(int)), + SLOT(horSbValue(int))); + connect( sb, SIGNAL(sliderMoved(int)), + SLOT(horSbSliding(int))); + connect( sb, SIGNAL(sliderReleased()), + SLOT(horSbSlidingDone())); + sb->hide(); + that->hScrollBar = sb; + return sb; + } + return hScrollBar; + } + + /*! + Enables or disables the horizontal scroll bar, as required by + setAutoUpdate() and the \link setTableFlags() table flags\endlink. + */ + + void QtTableView::setHorScrollBar( bool on, bool update ) + { + if ( on ) { + tFlags |= Tbl_hScrollBar; + horizontalScrollBar(); // created + if ( update ) + updateScrollBars( horMask | verMask ); + else + sbDirty = sbDirty | (horMask | verMask); + if ( testTableFlags( Tbl_vScrollBar ) ) + coverCornerSquare( TRUE ); + if ( autoUpdate() ) + sbDirty = sbDirty | horMask; + } else { + tFlags &= ~Tbl_hScrollBar; + if ( !hScrollBar ) + return; + coverCornerSquare( FALSE ); + bool hideScrollBar = autoUpdate() && hScrollBar->isVisible(); + if ( hideScrollBar ) + hScrollBar->hide(); + if ( update ) + updateScrollBars( verMask ); + else + sbDirty = sbDirty | verMask; + if ( hideScrollBar && isVisible() ) + repaint( hScrollBar->x(), hScrollBar->y(), + width() - hScrollBar->x(), hScrollBar->height() ); + } + if ( update ) + updateFrameSize(); + } + + + /*! + Enables or disables the vertical scroll bar, as required by + setAutoUpdate() and the \link setTableFlags() table flags\endlink. + */ + + void QtTableView::setVerScrollBar( bool on, bool update ) + { + if ( on ) { + tFlags |= Tbl_vScrollBar; + verticalScrollBar(); // created + if ( update ) + updateScrollBars( verMask | horMask ); + else + sbDirty = sbDirty | (horMask | verMask); + if ( testTableFlags( Tbl_hScrollBar ) ) + coverCornerSquare( TRUE ); + if ( autoUpdate() ) + sbDirty = sbDirty | verMask; + } else { + tFlags &= ~Tbl_vScrollBar; + if ( !vScrollBar ) + return; + coverCornerSquare( FALSE ); + bool hideScrollBar = autoUpdate() && vScrollBar->isVisible(); + if ( hideScrollBar ) + vScrollBar->hide(); + if ( update ) + updateScrollBars( horMask ); + else + sbDirty = sbDirty | horMask; + if ( hideScrollBar && isVisible() ) + repaint( vScrollBar->x(), vScrollBar->y(), + vScrollBar->width(), height() - vScrollBar->y() ); + } + if ( update ) + updateFrameSize(); + } + + + + + int QtTableView::findRawRow( int yPos, int *cellMaxY, int *cellMinY, + bool goOutsideView ) const + { + int r = -1; + if ( nRows == 0 ) + return r; + if ( goOutsideView || yPos >= minViewY() && yPos <= maxViewY() ) { + if ( yPos < minViewY() ) { + #if defined(QT_CHECK_RANGE) + qWarning( "QtTableView::findRawRow: (%s) internal error: " + "yPos < minViewY() && goOutsideView " + "not supported. (%d,%d)", + name( "unnamed" ), yPos, yOffs ); + #endif + return -1; + } + if ( cellH ) { // uniform cell height + r = (yPos - minViewY() + yCellDelta)/cellH; // cell offs from top + if ( cellMaxY ) + *cellMaxY = (r + 1)*cellH + minViewY() - yCellDelta - 1; + if ( cellMinY ) + *cellMinY = r*cellH + minViewY() - yCellDelta; + r += yCellOffs; // absolute cell index + } else { // variable cell height + QtTableView *tw = (QtTableView *)this; + r = yCellOffs; + int h = minViewY() - yCellDelta; //##arnt3 + int oldH = h; + Q_ASSERT( r < nRows ); + while ( r < nRows ) { + oldH = h; + h += tw->cellHeight( r ); // Start of next cell + if ( yPos < h ) + break; + r++; + } + if ( cellMaxY ) + *cellMaxY = h - 1; + if ( cellMinY ) + *cellMinY = oldH; + } + } + return r; + + } + + + int QtTableView::findRawCol( int xPos, int *cellMaxX, int *cellMinX , + bool goOutsideView ) const + { + int c = -1; + if ( nCols == 0 ) + return c; + if ( goOutsideView || xPos >= minViewX() && xPos <= maxViewX() ) { + if ( xPos < minViewX() ) { + #if defined(QT_CHECK_RANGE) + qWarning( "QtTableView::findRawCol: (%s) internal error: " + "xPos < minViewX() && goOutsideView " + "not supported. (%d,%d)", + name( "unnamed" ), xPos, xOffs ); + #endif + return -1; + } + if ( cellW ) { // uniform cell width + c = (xPos - minViewX() + xCellDelta)/cellW; //cell offs from left + if ( cellMaxX ) + *cellMaxX = (c + 1)*cellW + minViewX() - xCellDelta - 1; + if ( cellMinX ) + *cellMinX = c*cellW + minViewX() - xCellDelta; + c += xCellOffs; // absolute cell index + } else { // variable cell width + QtTableView *tw = (QtTableView *)this; + c = xCellOffs; + int w = minViewX() - xCellDelta; //##arnt3 + int oldW = w; + Q_ASSERT( c < nCols ); + while ( c < nCols ) { + oldW = w; + w += tw->cellWidth( c ); // Start of next cell + if ( xPos < w ) + break; + c++; + } + if ( cellMaxX ) + *cellMaxX = w - 1; + if ( cellMinX ) + *cellMinX = oldW; + } + } + return c; + } + + + /*! + Returns the index of the row at position \a yPos, where \a yPos is in + \e widget coordinates. Returns -1 if \a yPos is outside the valid + range. + + \sa findCol(), rowYPos() + */ + + int QtTableView::findRow( int yPos ) const + { + int cellMaxY; + int row = findRawRow( yPos, &cellMaxY ); + if ( testTableFlags(Tbl_cutCellsV) && cellMaxY > maxViewY() ) + row = - 1; // cell cut by bottom margin + if ( row >= nRows ) + row = -1; + return row; + } + + + /*! + Returns the index of the column at position \a xPos, where \a xPos is + in \e widget coordinates. Returns -1 if \a xPos is outside the valid + range. + + \sa findRow(), colXPos() + */ + + int QtTableView::findCol( int xPos ) const + { + int cellMaxX; + int col = findRawCol( xPos, &cellMaxX ); + if ( testTableFlags(Tbl_cutCellsH) && cellMaxX > maxViewX() ) + col = - 1; // cell cut by right margin + if ( col >= nCols ) + col = -1; + return col; + } + + + /*! + Computes the position in the widget of row \a row. + + Returns TRUE and stores the result in \a *yPos (in \e widget + coordinates) if the row is visible. Returns FALSE and does not modify + \a *yPos if \a row is invisible or invalid. + + \sa colXPos(), findRow() + */ + + bool QtTableView::rowYPos( int row, int *yPos ) const + { + int y; + if ( row >= yCellOffs ) { + if ( cellH ) { + int lastVisible = lastRowVisible(); + if ( row > lastVisible || lastVisible == -1 ) + return FALSE; + y = (row - yCellOffs)*cellH + minViewY() - yCellDelta; + } else { + //##arnt3 + y = minViewY() - yCellDelta; // y of leftmost cell in view + int r = yCellOffs; + QtTableView *tw = (QtTableView *)this; + int maxY = maxViewY(); + while ( r < row && y <= maxY ) + y += tw->cellHeight( r++ ); + if ( y > maxY ) + return FALSE; + + } + } else { + return FALSE; + } + if ( yPos ) + *yPos = y; + return TRUE; + } + + + /*! + Computes the position in the widget of column \a col. + + Returns TRUE and stores the result in \a *xPos (in \e widget + coordinates) if the column is visible. Returns FALSE and does not + modify \a *xPos if \a col is invisible or invalid. + + \sa rowYPos(), findCol() + */ + + bool QtTableView::colXPos( int col, int *xPos ) const + { + int x; + if ( col >= xCellOffs ) { + if ( cellW ) { + int lastVisible = lastColVisible(); + if ( col > lastVisible || lastVisible == -1 ) + return FALSE; + x = (col - xCellOffs)*cellW + minViewX() - xCellDelta; + } else { + //##arnt3 + x = minViewX() - xCellDelta; // x of uppermost cell in view + int c = xCellOffs; + QtTableView *tw = (QtTableView *)this; + int maxX = maxViewX(); + while ( c < col && x <= maxX ) + x += tw->cellWidth( c++ ); + if ( x > maxX ) + return FALSE; + } + } else { + return FALSE; + } + if ( xPos ) + *xPos = x; + return TRUE; + } + + + /*! + Moves the visible area of the table right by \a xPixels and + down by \a yPixels pixels. Both may be negative. + + \warning You might find that QScrollView offers a higher-level of + functionality than using QtTableView and this function. + + This function is \e not the same as QWidget::scroll(); in particular, + the signs of \a xPixels and \a yPixels have the reverse semantics. + + \sa setXOffset(), setYOffset(), setOffset(), setTopCell(), + setLeftCell() + */ + + void QtTableView::scroll( int xPixels, int yPixels ) + { + QWidget::scroll( -xPixels, -yPixels, contentsRect() ); + } + + + /*! + Returns the leftmost pixel of the table view in \e view + coordinates. This excludes the frame and any header. + + \sa maxViewY(), viewWidth(), contentsRect() + */ + + int QtTableView::minViewX() const + { + return frameWidth(); + } + + + /*! + Returns the top pixel of the table view in \e view + coordinates. This excludes the frame and any header. + + \sa maxViewX(), viewHeight(), contentsRect() + */ + + int QtTableView::minViewY() const + { + return frameWidth(); + } + + + /*! + Returns the rightmost pixel of the table view in \e view + coordinates. This excludes the frame and any scroll bar, but + includes blank pixels to the right of the visible table data. + + \sa maxViewY(), viewWidth(), contentsRect() + */ + + int QtTableView::maxViewX() const + { + return width() - 1 - frameWidth() + - (tFlags & Tbl_vScrollBar ? VSBEXT + : 0); + } + + + /*! + Returns the bottom pixel of the table view in \e view + coordinates. This excludes the frame and any scroll bar, but + includes blank pixels below the visible table data. + + \sa maxViewX(), viewHeight(), contentsRect() + */ + + int QtTableView::maxViewY() const + { + return height() - 1 - frameWidth() + - (tFlags & Tbl_hScrollBar ? HSBEXT + : 0); + } + + + /*! + Returns the width of the table view, as such, in \e view + coordinates. This does not include any header, scroll bar or frame, + but it does include background pixels to the right of the table data. + + \sa minViewX() maxViewX(), viewHeight(), contentsRect() viewRect() + */ + + int QtTableView::viewWidth() const + { + return maxViewX() - minViewX() + 1; + } + + + /*! + Returns the height of the table view, as such, in \e view + coordinates. This does not include any header, scroll bar or frame, + but it does include background pixels below the table data. + + \sa minViewY() maxViewY() viewWidth() contentsRect() viewRect() + */ + + int QtTableView::viewHeight() const + { + return maxViewY() - minViewY() + 1; + } + + + void QtTableView::doAutoScrollBars() + { + int viewW = width() - frameWidth() - minViewX(); + int viewH = height() - frameWidth() - minViewY(); + bool vScrollOn = testTableFlags(Tbl_vScrollBar); + bool hScrollOn = testTableFlags(Tbl_hScrollBar); + int w = 0; + int h = 0; + int i; + + if ( testTableFlags(Tbl_autoHScrollBar) ) { + if ( cellW ) { + w = cellW*nCols; + } else { + i = 0; + while ( i < nCols && w <= viewW ) + w += cellWidth( i++ ); + } + if ( w > viewW ) + hScrollOn = TRUE; + else + hScrollOn = FALSE; + } + + if ( testTableFlags(Tbl_autoVScrollBar) ) { + if ( cellH ) { + h = cellH*nRows; + } else { + i = 0; + while ( i < nRows && h <= viewH ) + h += cellHeight( i++ ); + } + + if ( h > viewH ) + vScrollOn = TRUE; + else + vScrollOn = FALSE; + } + + if ( testTableFlags(Tbl_autoHScrollBar) && vScrollOn && !hScrollOn ) + if ( w > viewW - VSBEXT ) + hScrollOn = TRUE; + + if ( testTableFlags(Tbl_autoVScrollBar) && hScrollOn && !vScrollOn ) + if ( h > viewH - HSBEXT ) + vScrollOn = TRUE; + + setHorScrollBar( hScrollOn, FALSE ); + setVerScrollBar( vScrollOn, FALSE ); + updateFrameSize(); + } + + + /*! + \fn void QtTableView::updateScrollBars() + + Updates the scroll bars' contents and presence to match the table's + state. Generally, you should not need to call this. + + \sa setTableFlags() + */ + + /*! + Updates the scroll bars' contents and presence to match the table's + state \c or \a f. + + \sa setTableFlags() + */ + + void QtTableView::updateScrollBars( uint f ) + { + sbDirty = sbDirty | f; + if ( inSbUpdate ) + return; + inSbUpdate = TRUE; + + if ( testTableFlags(Tbl_autoHScrollBar) && (sbDirty & horRange) || + testTableFlags(Tbl_autoVScrollBar) && (sbDirty & verRange) ) + // if range change and auto + doAutoScrollBars(); // turn scroll bars on/off if needed + + if ( !autoUpdate() ) { + inSbUpdate = FALSE; + return; + } + if ( yOffset() > 0 && testTableFlags( Tbl_autoVScrollBar ) && + !testTableFlags( Tbl_vScrollBar ) ) { + setYOffset( 0 ); + } + if ( xOffset() > 0 && testTableFlags( Tbl_autoHScrollBar ) && + !testTableFlags( Tbl_hScrollBar ) ) { + setXOffset( 0 ); + } + if ( !isVisible() ) { + inSbUpdate = FALSE; + return; + } + + if ( testTableFlags(Tbl_hScrollBar) && (sbDirty & horMask) != 0 ) { + if ( sbDirty & horGeometry ) + hScrollBar->setGeometry( 0,height() - HSBEXT, + viewWidth() + frameWidth()*2, + HSBEXT); + + if ( sbDirty & horSteps ) { + if ( cellW ) + hScrollBar->setSteps( QMIN(cellW,viewWidth()/2), viewWidth() ); + else + hScrollBar->setSteps( 16, viewWidth() ); + } + + if ( sbDirty & horRange ) + hScrollBar->setRange( 0, maxXOffset() ); + + if ( sbDirty & horValue ) + hScrollBar->setValue( xOffs ); + + // show scrollbar only when it has a sane geometry + if ( !hScrollBar->isVisible() ) + hScrollBar->show(); + } + + if ( testTableFlags(Tbl_vScrollBar) && (sbDirty & verMask) != 0 ) { + if ( sbDirty & verGeometry ) + vScrollBar->setGeometry( width() - VSBEXT, 0, + VSBEXT, + viewHeight() + frameWidth()*2 ); + + if ( sbDirty & verSteps ) { + if ( cellH ) + vScrollBar->setSteps( QMIN(cellH,viewHeight()/2), viewHeight() ); + else + vScrollBar->setSteps( 16, viewHeight() ); // fttb! ### + } + + if ( sbDirty & verRange ) + vScrollBar->setRange( 0, maxYOffset() ); + + if ( sbDirty & verValue ) + vScrollBar->setValue( yOffs ); + + // show scrollbar only when it has a sane geometry + if ( !vScrollBar->isVisible() ) + vScrollBar->show(); + } + if ( coveringCornerSquare && + ( (sbDirty & verGeometry ) || (sbDirty & horGeometry)) ) + cornerSquare->move( maxViewX() + frameWidth() + 1, + maxViewY() + frameWidth() + 1 ); + + sbDirty = 0; + inSbUpdate = FALSE; + } + + + void QtTableView::updateFrameSize() + { + int rw = width() - ( testTableFlags(Tbl_vScrollBar) ? + VSBEXT : 0 ); + int rh = height() - ( testTableFlags(Tbl_hScrollBar) ? + HSBEXT : 0 ); + if ( rw < 0 ) + rw = 0; + if ( rh < 0 ) + rh = 0; + + if ( autoUpdate() ) { + int fh = frameRect().height(); + int fw = frameRect().width(); + setFrameRect( QRect(0,0,rw,rh) ); + + if ( rw != fw ) + update( QMIN(fw,rw) - frameWidth() - 2, 0, frameWidth()+4, rh ); + if ( rh != fh ) + update( 0, QMIN(fh,rh) - frameWidth() - 2, rw, frameWidth()+4 ); + } + } + + + /*! + Returns the maximum horizontal offset within the table of the + view's left edge in \e table coordinates. + + This is used mainly to set the horizontal scroll bar's range. + + \sa maxColOffset(), maxYOffset(), totalWidth() + */ + + int QtTableView::maxXOffset() + { + int tw = totalWidth(); + int maxOffs; + if ( testTableFlags(Tbl_scrollLastHCell) ) { + if ( nCols != 1) + maxOffs = tw - ( cellW ? cellW : cellWidth( nCols - 1 ) ); + else + maxOffs = tw - viewWidth(); + } else { + if ( testTableFlags(Tbl_snapToHGrid) ) { + if ( cellW ) { + maxOffs = tw - (viewWidth()/cellW)*cellW; + } else { + int goal = tw - viewWidth(); + int pos = tw; + int nextCol = nCols - 1; + int nextCellWidth = cellWidth( nextCol ); + while( nextCol > 0 && pos > goal + nextCellWidth ) { + pos -= nextCellWidth; + nextCellWidth = cellWidth( --nextCol ); + } + if ( goal + nextCellWidth == pos ) + maxOffs = goal; + else if ( goal < pos ) + maxOffs = pos; + else + maxOffs = 0; + } + } else { + maxOffs = tw - viewWidth(); + } + } + return maxOffs > 0 ? maxOffs : 0; + } + + + /*! + Returns the maximum vertical offset within the table of the + view's top edge in \e table coordinates. + + This is used mainly to set the vertical scroll bar's range. + + \sa maxRowOffset(), maxXOffset(), totalHeight() + */ + + int QtTableView::maxYOffset() + { + int th = totalHeight(); + int maxOffs; + if ( testTableFlags(Tbl_scrollLastVCell) ) { + if ( nRows != 1) + maxOffs = th - ( cellH ? cellH : cellHeight( nRows - 1 ) ); + else + maxOffs = th - viewHeight(); + } else { + if ( testTableFlags(Tbl_snapToVGrid) ) { + if ( cellH ) { + maxOffs = th - (viewHeight()/cellH)*cellH; + } else { + int goal = th - viewHeight(); + int pos = th; + int nextRow = nRows - 1; + int nextCellHeight = cellHeight( nextRow ); + while( nextRow > 0 && pos > goal + nextCellHeight ) { + pos -= nextCellHeight; + nextCellHeight = cellHeight( --nextRow ); + } + if ( goal + nextCellHeight == pos ) + maxOffs = goal; + else if ( goal < pos ) + maxOffs = pos; + else + maxOffs = 0; + } + } else { + maxOffs = th - viewHeight(); + } + } + return maxOffs > 0 ? maxOffs : 0; + } + + + /*! + Returns the index of the last column, which may be at the left edge + of the view. + + Depending on the \link setTableFlags() Tbl_scrollLastHCell\endlink flag, + this may or may not be the last column. + + \sa maxXOffset(), maxRowOffset() + */ + + int QtTableView::maxColOffset() + { + int mx = maxXOffset(); + if ( cellW ) + return mx/cellW; + else { + int xcd=0, col=0; + while ( col < nCols && mx > (xcd=cellWidth(col)) ) { + mx -= xcd; + col++; + } + return col; + } + } + + + /*! + Returns the index of the last row, which may be at the top edge of + the view. + + Depending on the \link setTableFlags() Tbl_scrollLastVCell\endlink flag, + this may or may not be the last row. + + \sa maxYOffset(), maxColOffset() + */ + + int QtTableView::maxRowOffset() + { + int my = maxYOffset(); + if ( cellH ) + return my/cellH; + else { + int ycd=0, row=0; + while ( row < nRows && my > (ycd=cellHeight(row)) ) { + my -= ycd; + row++; + } + return row; + } + } + + + void QtTableView::showOrHideScrollBars() + { + if ( !autoUpdate() ) + return; + if ( vScrollBar ) { + if ( testTableFlags(Tbl_vScrollBar) ) { + if ( !vScrollBar->isVisible() ) + sbDirty = sbDirty | verMask; + } else { + if ( vScrollBar->isVisible() ) + vScrollBar->hide(); + } + } + if ( hScrollBar ) { + if ( testTableFlags(Tbl_hScrollBar) ) { + if ( !hScrollBar->isVisible() ) + sbDirty = sbDirty | horMask; + } else { + if ( hScrollBar->isVisible() ) + hScrollBar->hide(); + } + } + if ( cornerSquare ) { + if ( testTableFlags(Tbl_hScrollBar) && + testTableFlags(Tbl_vScrollBar) ) { + if ( !cornerSquare->isVisible() ) + cornerSquare->show(); + } else { + if ( cornerSquare->isVisible() ) + cornerSquare->hide(); + } + } + } + + + /*! + Updates the scroll bars and internal state. + + Call this function when the table view's total size is changed; + typically because the result of cellHeight() or cellWidth() have changed. + + This function does not repaint the widget. + */ + + void QtTableView::updateTableSize() + { + bool updateOn = autoUpdate(); + setAutoUpdate( FALSE ); + int xofs = xOffset(); + xOffs++; //so that setOffset will not return immediately + setOffset(xofs,yOffset(),FALSE); //to calculate internal state correctly + setAutoUpdate(updateOn); + + updateScrollBars( horSteps | horRange | + verSteps | verRange ); + showOrHideScrollBars(); + } + + + #endif + #endif *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/share/tile2bmp.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,320 ---- + /* SCCS Id: @(#)tile2bmp.c 3.4 2002/03/14 */ + /* Copyright (c) NetHack PC Development Team 1995 */ + /* NetHack may be freely redistributed. See license for details. */ + + /* + * Edit History: + * + * Initial Creation M.Allison 1994/01/11 + * + */ + + /* #pragma warning(4103:disable) */ + + #include "hack.h" + #include "tile.h" + #ifndef __GNUC__ + #include "win32api.h" + #endif + + /* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */ + #if (TILE_X==32) + #define COLORS_IN_USE 256 + #else + #define COLORS_IN_USE 16 /* 16 colors */ + #endif + + #define BITCOUNT 8 + + extern char *FDECL(tilename, (int, int)); + + #if BITCOUNT==4 + #define MAX_X 320 /* 2 per byte, 4 bits per pixel */ + #define MAX_Y 480 + #else + # if (TILE_X==32) + #define MAX_X (32 * 40) + #define MAX_Y 960 + # else + #define MAX_X 640 /* 1 per byte, 8 bits per pixel */ + #define MAX_Y 480 + # endif + #endif + + /* GCC fix by Paolo Bonzini 1999/03/28 */ + #ifdef __GNUC__ + #define PACK __attribute__((packed)) + #else + #define PACK + #endif + + #ifdef __GNUC__ + typedef struct tagBMIH { + unsigned long biSize; + long biWidth; + long biHeight; + unsigned short biPlanes; + unsigned short biBitCount; + unsigned long biCompression; + unsigned long biSizeImage; + long biXPelsPerMeter; + long biYPelsPerMeter; + unsigned long biClrUsed; + unsigned long biClrImportant; + } PACK BITMAPINFOHEADER; + + typedef struct tagBMFH { + unsigned short bfType; + unsigned long bfSize; + unsigned short bfReserved1; + unsigned short bfReserved2; + unsigned long bfOffBits; + } PACK BITMAPFILEHEADER; + + typedef struct tagRGBQ { + unsigned char rgbBlue; + unsigned char rgbGreen; + unsigned char rgbRed; + unsigned char rgbReserved; + } PACK RGBQUAD; + #define UINT unsigned int + #define DWORD unsigned long + #define LONG long + #define WORD unsigned short + #define BI_RGB 0L + #define BI_RLE8 1L + #define BI_RLE4 2L + #define BI_BITFIELDS 3L + #endif /* __GNUC__ */ + + #pragma pack(1) + struct tagBMP{ + BITMAPFILEHEADER bmfh; + BITMAPINFOHEADER bmih; + #if BITCOUNT==4 + #define RGBQUAD_COUNT 16 + RGBQUAD bmaColors[RGBQUAD_COUNT]; + #else + #if (TILE_X==32) + #define RGBQUAD_COUNT 256 + #else + #define RGBQUAD_COUNT 16 + #endif + RGBQUAD bmaColors[RGBQUAD_COUNT]; + #endif + #if (COLORS_IN_USE==16) + uchar packtile[MAX_Y][MAX_X]; + #else + uchar packtile[MAX_Y][MAX_X]; + /* uchar packtile[TILE_Y][TILE_X]; */ + #endif + } PACK bmp; + #pragma pack() + + #define BMPFILESIZE (sizeof(struct tagBMP)) + + FILE *tibfile2; + + pixel tilepixels[TILE_Y][TILE_X]; + + static void FDECL(build_bmfh,(BITMAPFILEHEADER *)); + static void FDECL(build_bmih,(BITMAPINFOHEADER *)); + static void FDECL(build_bmptile,(pixel (*)[TILE_X])); + + char *tilefiles[] = { + #if (TILE_X == 32) + "../win/share/mon32.txt", + "../win/share/obj32.txt", + "../win/share/oth32.txt" + #else + "../win/share/monsters.txt", + "../win/share/objects.txt", + "../win/share/other.txt" + #endif + }; + + int num_colors = 0; + int tilecount; + int max_tiles_in_row = 40; + int tiles_in_row; + int filenum; + int initflag; + int yoffset,xoffset; + char bmpname[128]; + FILE *fp; + + int + main(argc, argv) + int argc; + char *argv[]; + { + int i, j; + + if (argc != 2) { + Fprintf(stderr, "usage: %s outfile.bmp\n", argv[0]); + exit(EXIT_FAILURE); + } else + strcpy(bmpname, argv[1]); + + #ifdef OBSOLETE + bmpfile2 = fopen(NETHACK_PACKED_TILEFILE, WRBMODE); + if (bmpfile2 == (FILE *)0) { + Fprintf(stderr, "Unable to open output file %s\n", + NETHACK_PACKED_TILEFILE); + exit(EXIT_FAILURE); + } + #endif + + tilecount = 0; + xoffset = yoffset = 0; + initflag = 0; + filenum = 0; + fp = fopen(bmpname,"wb"); + if (!fp) { + printf("Error creating tile file %s, aborting.\n",bmpname); + exit(1); + } + while (filenum < (sizeof(tilefiles) / sizeof(char *))) { + if (!fopen_text_file(tilefiles[filenum], RDTMODE)) { + Fprintf(stderr, + "usage: tile2bmp (from the util directory)\n"); + exit(EXIT_FAILURE); + } + num_colors = colorsinmap; + if (num_colors > 62) { + Fprintf(stderr, "too many colors (%d)\n", num_colors); + exit(EXIT_FAILURE); + } + if (!initflag) { + build_bmfh(&bmp.bmfh); + build_bmih(&bmp.bmih); + for (i = 0; i < MAX_Y; ++i) + for (j = 0; j < MAX_X; ++j) + bmp.packtile[i][j] = (uchar)0; + for (i = 0; i < num_colors; i++) { + bmp.bmaColors[i].rgbRed = ColorMap[CM_RED][i]; + bmp.bmaColors[i].rgbGreen = ColorMap[CM_GREEN][i]; + bmp.bmaColors[i].rgbBlue = ColorMap[CM_BLUE][i]; + bmp.bmaColors[i].rgbReserved = 0; + } + initflag = 1; + } + /* printf("Colormap initialized\n"); */ + while (read_text_tile(tilepixels)) { + build_bmptile(tilepixels); + tilecount++; + #if BITCOUNT==4 + xoffset += (TILE_X / 2); + #else + xoffset += TILE_X; + #endif + if (xoffset >= MAX_X) { + yoffset += TILE_Y; + xoffset = 0; + } + } + (void) fclose_text_file(); + ++filenum; + } + fwrite(&bmp, sizeof(bmp), 1, fp); + fclose(fp); + Fprintf(stderr, "Total of %d tiles written to %s.\n", + tilecount, bmpname); + + exit(EXIT_SUCCESS); + /*NOTREACHED*/ + return 0; + } + + + static void + build_bmfh(pbmfh) + BITMAPFILEHEADER *pbmfh; + { + pbmfh->bfType = (UINT)0x4D42; + pbmfh->bfSize = (DWORD)BMPFILESIZE; + pbmfh->bfReserved1 = (UINT)0; + pbmfh->bfReserved2 = (UINT)0; + pbmfh->bfOffBits = sizeof(bmp.bmfh) + sizeof(bmp.bmih) + + (RGBQUAD_COUNT * sizeof(RGBQUAD)); + } + + static void + build_bmih(pbmih) + BITMAPINFOHEADER *pbmih; + { + WORD cClrBits; + pbmih->biSize = (DWORD) sizeof(bmp.bmih); + #if BITCOUNT==4 + pbmih->biWidth = (LONG) MAX_X * 2; + #else + pbmih->biWidth = (LONG) MAX_X; + #endif + pbmih->biHeight = (LONG) MAX_Y; + pbmih->biPlanes = (WORD) 1; + #if BITCOUNT==4 + pbmih->biBitCount = (WORD) 4; + #else + pbmih->biBitCount = (WORD) 8; + #endif + cClrBits = (WORD)(pbmih->biPlanes * pbmih->biBitCount); + if (cClrBits == 1) + cClrBits = 1; + else if (cClrBits <= 4) + cClrBits = 4; + else if (cClrBits <= 8) + cClrBits = 8; + else if (cClrBits <= 16) + cClrBits = 16; + else if (cClrBits <= 24) + cClrBits = 24; + else cClrBits = 32; + pbmih->biCompression = (DWORD) BI_RGB; + pbmih->biXPelsPerMeter = (LONG)0; + pbmih->biYPelsPerMeter = (LONG)0; + #if (TILE_X==32) + if (cClrBits < 24) + pbmih->biClrUsed = (1<biClrUsed = (DWORD)RGBQUAD_COUNT; + #endif + + #if (TILE_X==16) + pbmih->biSizeImage = 0; + #else + pbmih->biSizeImage = ((pbmih->biWidth * cClrBits +31) & ~31) /8 + * pbmih->biHeight; + #endif + pbmih->biClrImportant = (DWORD)0; + } + + static void + build_bmptile(pixels) + pixel (*pixels)[TILE_X]; + { + int cur_x, cur_y, cur_color; + int x,y; + + for (cur_y = 0; cur_y < TILE_Y; cur_y++) { + for (cur_x = 0; cur_x < TILE_X; cur_x++) { + for (cur_color = 0; cur_color < num_colors; cur_color++) { + if (ColorMap[CM_RED][cur_color] == pixels[cur_y][cur_x].r && + ColorMap[CM_GREEN][cur_color]== pixels[cur_y][cur_x].g && + ColorMap[CM_BLUE][cur_color] == pixels[cur_y][cur_x].b) + break; + } + if (cur_color >= num_colors) + Fprintf(stderr, "color not in colormap!\n"); + y = (MAX_Y - 1) - (cur_y + yoffset); + #if BITCOUNT==4 + x = (cur_x / 2) + xoffset; + bmp.packtile[y][x] = cur_x%2 ? + (uchar)(bmp.packtile[y][x] | cur_color) : + (uchar)(cur_color<<4); + #else + x = cur_x + xoffset; + bmp.packtile[y][x] = (uchar)cur_color; + #endif + } + } + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/dgncomp.dsp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,297 ---- + # Microsoft Developer Studio Project File - Name="dgncomp" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=dgncomp - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "dgncomp.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "dgncomp.mak" CFG="dgncomp - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "dgncomp - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "dgncomp - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "dgncomp - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "..\util" + # PROP BASE Intermediate_Dir "dgncomp___Win32_Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "..\util" + # PROP Intermediate_Dir "Release" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sys\winnt" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "NDEBUG" + # ADD RSC /l 0x1009 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\util\dgn_comp.exe" + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=dgncomp + PostBuild_Cmds=echo Building dungeon echo chdir ..\dat chdir ..\dat echo ..\util\dgn_comp.exe dungeon.pdf ..\util\dgn_comp.exe dungeon.pdf echo chdir ..\build chdir ..\build + # End Special Build Tool + + !ELSEIF "$(CFG)" == "dgncomp - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "dgncomp___Win32_Debug" + # PROP BASE Intermediate_Dir "dgncomp___Win32_Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "..\util" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\sys\winnt" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # ADD BASE RSC /l 0x1009 /d "_DEBUG" + # ADD RSC /l 0x1009 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\util\dgn_comp.exe" /pdbtype:sept + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=dgncomp + PostBuild_Cmds=echo Building dungeon echo chdir ..\dat chdir ..\dat echo ..\util\dgn_comp.exe dungeon.pdf ..\util\dgn_comp.exe dungeon.pdf echo chdir ..\build chdir ..\build + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "dgncomp - Win32 Release" + # Name "dgncomp - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\src\alloc.c + # End Source File + # Begin Source File + + SOURCE=..\util\dgn_lex.c + # End Source File + # Begin Source File + + SOURCE=..\util\dgn_main.c + # End Source File + # Begin Source File + + SOURCE=..\util\dgn_yacc.c + # End Source File + # Begin Source File + + SOURCE=..\util\panic.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\align.h + # End Source File + # Begin Source File + + SOURCE=..\include\attrib.h + # End Source File + # Begin Source File + + SOURCE=..\include\color.h + # End Source File + # Begin Source File + + SOURCE=..\include\config.h + # End Source File + # Begin Source File + + SOURCE=..\include\config1.h + # End Source File + # Begin Source File + + SOURCE=..\include\coord.h + # End Source File + # Begin Source File + + SOURCE=..\include\decl.h + # End Source File + # Begin Source File + + SOURCE=..\include\dgn_comp.h + # End Source File + # Begin Source File + + SOURCE=..\include\dgn_file.h + # End Source File + # Begin Source File + + SOURCE=..\include\display.h + # End Source File + # Begin Source File + + SOURCE=..\include\dungeon.h + # End Source File + # Begin Source File + + SOURCE=..\include\engrave.h + # End Source File + # Begin Source File + + SOURCE=..\include\flag.h + # End Source File + # Begin Source File + + SOURCE=..\include\global.h + # End Source File + # Begin Source File + + SOURCE=..\include\mkroom.h + # End Source File + # Begin Source File + + SOURCE=..\include\monattk.h + # End Source File + # Begin Source File + + SOURCE=..\include\monst.h + # End Source File + # Begin Source File + + SOURCE=..\include\monsym.h + # End Source File + # Begin Source File + + SOURCE=..\include\nhlan.h + # End Source File + # Begin Source File + + SOURCE=..\include\ntconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\obj.h + # End Source File + # Begin Source File + + SOURCE=..\include\objclass.h + # End Source File + # Begin Source File + + SOURCE=..\include\onames.h + # End Source File + # Begin Source File + + SOURCE=..\include\permonst.h + # End Source File + # Begin Source File + + SOURCE=..\include\pm.h + # End Source File + # Begin Source File + + SOURCE=..\include\prop.h + # End Source File + # Begin Source File + + SOURCE=..\include\quest.h + # End Source File + # Begin Source File + + SOURCE=..\include\rect.h + # End Source File + # Begin Source File + + SOURCE=..\include\region.h + # End Source File + # Begin Source File + + SOURCE=..\include\rm.h + # End Source File + # Begin Source File + + SOURCE=..\include\skills.h + # End Source File + # Begin Source File + + SOURCE=..\include\spell.h + # End Source File + # Begin Source File + + SOURCE=..\include\timeout.h + # End Source File + # Begin Source File + + SOURCE=..\include\tradstdc.h + # End Source File + # Begin Source File + + SOURCE=..\include\trampoli.h + # End Source File + # Begin Source File + + SOURCE=..\include\trap.h + # End Source File + # Begin Source File + + SOURCE=..\include\vision.h + # End Source File + # Begin Source File + + SOURCE=..\include\winprocs.h + # End Source File + # Begin Source File + + SOURCE=..\include\wintty.h + # End Source File + # Begin Source File + + SOURCE=..\include\wintype.h + # End Source File + # Begin Source File + + SOURCE=..\include\you.h + # End Source File + # Begin Source File + + SOURCE=..\include\youprop.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/dgnstuff.dsp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,97 ---- + # Microsoft Developer Studio Project File - Name="dgnstuff" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) External Target" 0x0106 + + CFG=dgnstuff - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "dgnstuff.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "dgnstuff.mak" CFG="dgnstuff - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "dgnstuff - Win32 Release" (based on "Win32 (x86) External Target") + !MESSAGE "dgnstuff - Win32 Debug" (based on "Win32 (x86) External Target") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + + !IF "$(CFG)" == "dgnstuff - Win32 Release" + + # PROP BASE Use_MFC + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Cmd_Line "NMAKE /f dgnstuff.mak" + # PROP BASE Rebuild_Opt "/a" + # PROP BASE Target_File "dgnstuff.exe" + # PROP BASE Bsc_Name "dgnstuff.bsc" + # PROP BASE Target_Dir "" + # PROP Use_MFC + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Cmd_Line "nmake /f "dgnstuff.mak"" + # PROP Rebuild_Opt "/a" + # PROP Target_File "..\util\dgncomp.exe" + # PROP Bsc_Name "" + # PROP Target_Dir "" + + !ELSEIF "$(CFG)" == "dgnstuff - Win32 Debug" + + # PROP BASE Use_MFC + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Cmd_Line "NMAKE /f dgnstuff.mak" + # PROP BASE Rebuild_Opt "/a" + # PROP BASE Target_File "dgnstuff.exe" + # PROP BASE Bsc_Name "dgnstuff.bsc" + # PROP BASE Target_Dir "" + # PROP Use_MFC + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "dgnstuff___Win32_Debug" + # PROP Intermediate_Dir "Debug" + # PROP Cmd_Line "nmake /f "dgnstuff.mak"" + # PROP Rebuild_Opt "/a" + # PROP Target_File "..\util\dgncomp.exe" + # PROP Bsc_Name "" + # PROP Target_Dir "" + + !ENDIF + + # Begin Target + + # Name "dgnstuff - Win32 Release" + # Name "dgnstuff - Win32 Debug" + + !IF "$(CFG)" == "dgnstuff - Win32 Release" + + !ELSEIF "$(CFG)" == "dgnstuff - Win32 Debug" + + !ENDIF + + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/dgnstuff.mak Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,59 ---- + #Set all of these or none of them + #YACC = byacc.exe + #LEX = flex.exe + #YTABC = y_tab.c + #YTABH = y_tab.h + #LEXYYC = lexyy.c + + !IF "$(YACC)"!="" + @echo Yacc-alike set to $(YACC) + @echo YTABC set to $(YTABC) + @echo YTABH set to $(YTABH) + !ENDIF + + !IF "$(LEX)"!="" + @echo Lex-alike set to $(LEX) + @echo LEXYYC set to $(LEXYYC) + !ENDIF + + default: all + + all: ..\util\dgn_yacc.c ..\util\dgn_lex.c + + rebuild: clean all + + clean: + -del ..\util\dgn_lex.c + -del ..\util\dgn_yacc.c + -del ..\include\dgn_comp.h + + #========================================== + # Dungeon Compiler Stuff + #========================================== + + ..\util\dgn_yacc.c ..\include\dgn_comp.h : ..\util\dgn_comp.y + !IF "$(YACC)"=="" + @echo Using pre-built dgn_yacc.c and dgn_comp.h + @copy ..\sys\share\dgn_yacc.c ..\util\dgn_yacc.c + @copy ..\sys\share\dgn_comp.h ..\include\dgn_comp.h + !ELSE + chdir ..\util + $(YACC) -d dgn_comp.y + copy $(YTABC) $@ + copy $(YTABH) ..\include\dgn_comp.h + @del $(YTABC) + @del $(YTABH) + chdir ..\build + !ENDIF + + ..\util\dgn_lex.c: ..\util\dgn_comp.l + !IF "$(LEX)"=="" + @echo Using pre-built dgn_lex.c + @copy ..\sys\share\dgn_lex.c $@ + !ELSE + chdir ..\util + $(LEX) dgn_comp.l + copy $(LEXYYC) $@ + @del $(LEXYYC) + chdir ..\build + !ENDIF *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/dlb_main.dsp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,179 ---- + # Microsoft Developer Studio Project File - Name="dlb_main" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=dlb_main - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "dlb_main.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "dlb_main.mak" CFG="dlb_main - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "dlb_main - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "dlb_main - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "dlb_main - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sys\winnt" /I "..\win\share" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DLB" /D "WIN32CON" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "NDEBUG" + # ADD RSC /l 0x1009 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\util\dlb_main.exe" + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=Packaging via DLB + PostBuild_Cmds=echo chdir ..\dat \ + chdir ..\dat \ + chdir \ + 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 NOT exist porthelp copy ..\sys\winnt\porthelp porthelp \ + 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 \ + ..\util\dlb_main.exe cIf dlb.lst nhdat \ + echo chdir ..\build \ + chdir ..\build \ + echo if NOT exist ..\binary\*.* mkdir ..\binary \ + if NOT exist ..\binary\*.* mkdir ..\binary + # End Special Build Tool + + !ELSEIF "$(CFG)" == "dlb_main - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\sys\winnt" /I "..\win\share" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DLB" /D "WIN32CON" /D "MSWIN_GRAPHICS" /FD /GZ /c + # ADD BASE RSC /l 0x1009 /d "_DEBUG" + # ADD RSC /l 0x1009 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\util\dlb_main.exe" /pdbtype:sept + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=Packaging via dlb + PostBuild_Cmds=echo chdir ..\dat \ + chdir ..\dat \ + chdir \ + 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 NOT exist porthelp copy ..\sys\winnt\porthelp porthelp \ + 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 \ + ..\util\dlb_main.exe cIf dlb.lst nhdat \ + echo chdir ..\build \ + chdir ..\build \ + echo if NOT exist ..\binary\*.* mkdir ..\binary \ + if NOT exist ..\binary\*.* mkdir ..\binary + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "dlb_main - Win32 Release" + # Name "dlb_main - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\src\alloc.c + # End Source File + # Begin Source File + + SOURCE=..\src\dlb.c + # End Source File + # Begin Source File + + SOURCE=..\util\dlb_main.c + # End Source File + # Begin Source File + + SOURCE=..\util\panic.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\dlb.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/levcomp.dsp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,198 ---- + # Microsoft Developer Studio Project File - Name="levcomp" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=levcomp - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "levcomp.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "levcomp.mak" CFG="levcomp - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "levcomp - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "levcomp - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "levcomp - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "..\util" + # PROP Intermediate_Dir "Release" + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sys\winnt" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "NDEBUG" + # ADD RSC /l 0x1009 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=levcomp + PostBuild_Cmds=echo Building special levels echo chdir ..\dat chdir ..\dat \ + echo arch.des ..\util\levcomp.exe arch.des \ + echo barb.des ..\util\levcomp.exe barb.des \ + echo bigroom.des ..\util\levcomp.exe bigroom.des \ + echo castle.des ..\util\levcomp.exe castle.des \ + echo caveman.des ..\util\levcomp.exe caveman.des \ + echo endgame.des ..\util\levcomp.exe endgame.des \ + echo gehennom.des ..\util\levcomp.exe gehennom.des \ + echo healer.des ..\util\levcomp.exe healer.des \ + echo knight.des ..\util\levcomp.exe knight.des \ + echo knox.des ..\util\levcomp.exe knox.des \ + echo medusa.des ..\util\levcomp.exe medusa.des \ + echo mines.des ..\util\levcomp.exe mines.des \ + echo monk.des ..\util\levcomp.exe monk.des \ + echo oracle.des ..\util\levcomp.exe oracle.des \ + echo priest.des ..\util\levcomp.exe priest.des \ + echo ranger.des ..\util\levcomp.exe ranger.des \ + echo rogue.des ..\util\levcomp.exe rogue.des \ + echo samurai.des ..\util\levcomp.exe samurai.des \ + echo sokoban.des ..\util\levcomp.exe sokoban.des \ + echo tourist.des ..\util\levcomp.exe tourist.des \ + echo tower.des ..\util\levcomp.exe tower.des \ + echo valkyrie.des ..\util\levcomp.exe valkyrie.des \ + echo wizard .des ..\util\levcomp.exe wizard.des \ + echo yendor.des ..\util\levcomp.exe yendor.des \ + echo chdir ..\build chdir ..\build + # End Special Build Tool + + !ELSEIF "$(CFG)" == "levcomp - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "..\util" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\sys\winnt" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # ADD BASE RSC /l 0x1009 /d "_DEBUG" + # ADD RSC /l 0x1009 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /pdbtype:sept + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=levcomp + PostBuild_Cmds=echo Building special levels echo chdir ..\dat chdir ..\dat \ + echo arch.des ..\util\levcomp.exe arch.des \ + echo barb.des ..\util\levcomp.exe barb.des \ + echo bigroom.des ..\util\levcomp.exe bigroom.des \ + echo castle.des ..\util\levcomp.exe castle.des \ + echo caveman.des ..\util\levcomp.exe caveman.des \ + echo endgame.des ..\util\levcomp.exe endgame.des \ + echo gehennom.des ..\util\levcomp.exe gehennom.des \ + echo healer.des ..\util\levcomp.exe healer.des \ + echo knight.des ..\util\levcomp.exe knight.des \ + echo knox.des ..\util\levcomp.exe knox.des \ + echo medusa.des ..\util\levcomp.exe medusa.des \ + echo mines.des ..\util\levcomp.exe mines.des \ + echo monk.des ..\util\levcomp.exe monk.des \ + echo oracle.des ..\util\levcomp.exe oracle.des \ + echo priest.des ..\util\levcomp.exe priest.des \ + echo ranger.des ..\util\levcomp.exe ranger.des \ + echo rogue.des ..\util\levcomp.exe rogue.des \ + echo samurai.des ..\util\levcomp.exe samurai.des \ + echo sokoban.des ..\util\levcomp.exe sokoban.des \ + echo tourist.des ..\util\levcomp.exe tourist.des \ + echo tower.des ..\util\levcomp.exe tower.des \ + echo valkyrie.des ..\util\levcomp.exe valkyrie.des \ + echo wizard .des ..\util\levcomp.exe wizard.des \ + echo yendor.des ..\util\levcomp.exe yendor.des \ + echo chdir ..\build chdir ..\build + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "levcomp - Win32 Release" + # Name "levcomp - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\src\alloc.c + # End Source File + # Begin Source File + + SOURCE=..\src\decl.c + # End Source File + # Begin Source File + + SOURCE=..\src\drawing.c + # End Source File + # Begin Source File + + SOURCE=..\util\lev_lex.c + # End Source File + # Begin Source File + + SOURCE=..\util\lev_main.c + # End Source File + # Begin Source File + + SOURCE=..\util\lev_yacc.c + # End Source File + # Begin Source File + + SOURCE=..\src\monst.c + # End Source File + # Begin Source File + + SOURCE=..\src\objects.c + # End Source File + # Begin Source File + + SOURCE=..\util\panic.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\lev_comp.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/levstuff.dsp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,97 ---- + # Microsoft Developer Studio Project File - Name="levstuff" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) External Target" 0x0106 + + CFG=levstuff - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "levstuff.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "levstuff.mak" CFG="levstuff - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "levstuff - Win32 Release" (based on "Win32 (x86) External Target") + !MESSAGE "levstuff - Win32 Debug" (based on "Win32 (x86) External Target") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + + !IF "$(CFG)" == "levstuff - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Cmd_Line "NMAKE /f levstuff.mak" + # PROP BASE Rebuild_Opt "/a" + # PROP BASE Target_File "levstuff.exe" + # PROP BASE Bsc_Name "levstuff.bsc" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Cmd_Line "nmake /f "levstuff.mak"" + # PROP Rebuild_Opt "/a" + # PROP Target_File "..\util\lev_lex.c" + # PROP Bsc_Name "" + # PROP Target_Dir "" + + !ELSEIF "$(CFG)" == "levstuff - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "levstuff___Win32_Debug0" + # PROP BASE Intermediate_Dir "levstuff___Win32_Debug0" + # PROP BASE Cmd_Line "NMAKE /f levstuff.mak" + # PROP BASE Rebuild_Opt "/a" + # PROP BASE Target_File "levstuff.exe" + # PROP BASE Bsc_Name "levstuff.bsc" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "levstuff___Win32_Debug0" + # PROP Intermediate_Dir "levstuff___Win32_Debug0" + # PROP Cmd_Line "nmake /f "levstuff.mak"" + # PROP Rebuild_Opt "/a" + # PROP Target_File "..\util\lev_lex.c" + # PROP Bsc_Name "" + # PROP Target_Dir "" + + !ENDIF + + # Begin Target + + # Name "levstuff - Win32 Release" + # Name "levstuff - Win32 Debug" + + !IF "$(CFG)" == "levstuff - Win32 Release" + + !ELSEIF "$(CFG)" == "levstuff - Win32 Debug" + + !ENDIF + + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/levstuff.mak Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,59 ---- + #YACC = byacc.exe + #LEX = flex.exe + #YTABC = y_tab.c + #YTABH = y_tab.h + #LEXYYC = lexyy.c + + !IF "$(YACC)"!="" + @echo Yacc-alike set to $(YACC) + @echo YTABC set to $(YTABC) + @echo YTABH set to $(YTABH) + !ENDIF + + !IF "$(LEX)"!="" + @echo Lex-alike set to $(LEX) + @echo LEXYYC set to $(LEXYYC) + !ENDIF + + + default: all + + all: ..\util\lev_yacc.c ..\util\lev_lex.c + + rebuild: clean all + + clean: + -del ..\util\lev_lex.c + -del ..\util\lev_yacc.c + -del ..\include\lev_comp.h + + #========================================== + # Level Compiler Stuff + #========================================== + ..\util\lev_yacc.c ..\include\lev_comp.h: ..\util\lev_comp.y + !IF "$(YACC)"=="" + @echo Using pre-built lev_yacc.c and lev_comp.h + @copy ..\sys\share\lev_yacc.c ..\util\lev_yacc.c + @copy ..\sys\share\lev_comp.h ..\include\lev_comp.h + !ELSE + chdir ..\util + $(YACC) -d lev_comp.y + copy $(YTABC) $@ + copy $(YTABH) ..\include\lev_comp.h + @del $(YTABC) + @del $(YTABH) + chdir ..\build + !ENDIF + + ..\util\lev_lex.c: ..\util\lev_comp.l + !IF "$(LEX)"=="" + @echo Using pre-built lev_lex.c + @copy ..\sys\share\lev_lex.c $@ + !ELSE + chdir ..\util + $(LEX) lev_comp.l + copy $(LEXYYC) $@ + @del $(LEXYYC) + chdir ..\build + !ENDIF + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/makedefs.dsp Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,198 ---- + # Microsoft Developer Studio Project File - Name="makedefs" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=makedefs - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "makedefs.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "makedefs.mak" CFG="makedefs - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "makedefs - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "makedefs - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "makedefs - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "..\util" + # PROP Intermediate_Dir "Release" + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "." /I "..\include" /I "..\sys\winnt" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x409 /d "NDEBUG" + # ADD RSC /l 0x409 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=Running makedefs + PostBuild_Cmds=echo chdir ..\util chdir ..\util chdir \ + echo makedefs.exe -v makedefs.exe -v \ + echo makedefs.exe -o makedefs.exe -o \ + echo makedefs.exe -p makedefs.exe -p \ + echo makedefs.exe -m makedefs.exe -m \ + echo makedefs.exe -z makedefs.exe -z \ + echo chdir ..\dat chdir ..\dat chdir \ + echo Generating NetHack database echo ..\util\makedefs.exe -d ..\util\makedefs.exe -d \ + echo Generating rumors echo ..\util\makedefs.exe -r ..\util\makedefs.exe -r \ + echo Generating quests echo ..\util\makedefs.exe -q ..\util\makedefs.exe -q \ + echo Generating oracles echo ..\util\makedefs.exe -h ..\util\makedefs.exe -h \ + echo Generating dungeon.pdf echo ..\util\makedefs.exe -e ..\util\makedefs.exe -e \ + echo chdir ..\build chdir ..\build \ + copy ..\win\share\tilemap.c ..\win\share\tiletxt.c + # End Special Build Tool + + !ELSEIF "$(CFG)" == "makedefs - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "..\util" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "." /I "..\include" /I "..\sys\winnt" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # ADD BASE RSC /l 0x409 /d "_DEBUG" + # ADD RSC /l 0x409 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /pdbtype:sept + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=Running makedefs + PostBuild_Cmds=echo chdir ..\util chdir ..\util chdir \ + echo makedefs.exe -v makedefs.exe -v \ + echo makedefs.exe -o makedefs.exe -o \ + echo makedefs.exe -p makedefs.exe -p \ + echo makedefs.exe -m makedefs.exe -m \ + echo makedefs.exe -z makedefs.exe -z \ + echo chdir ..\dat chdir ..\dat chdir \ + echo Generating NetHack database echo ..\util\makedefs.exe -d ..\util\makedefs.exe -d \ + echo Generating rumors echo ..\util\makedefs.exe -r ..\util\makedefs.exe -r \ + echo Generating quests echo ..\util\makedefs.exe -q ..\util\makedefs.exe -q \ + echo Generating oracles echo ..\util\makedefs.exe -h ..\util\makedefs.exe -h \ + echo Generating dungeon.pdf echo ..\util\makedefs.exe -e ..\util\makedefs.exe -e \ + echo chdir ..\build chdir ..\build \ + copy ..\win\share\tilemap.c ..\win\share\tiletxt.c + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "makedefs - Win32 Release" + # Name "makedefs - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\util\makedefs.c + # End Source File + # Begin Source File + + SOURCE=..\src\monst.c + # End Source File + # Begin Source File + + SOURCE=..\src\objects.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\config.h + # End Source File + # Begin Source File + + SOURCE=..\include\config1.h + # End Source File + # Begin Source File + + SOURCE=..\include\coord.h + # End Source File + # Begin Source File + + SOURCE=..\include\global.h + # End Source File + # Begin Source File + + SOURCE=..\include\monattk.h + # End Source File + # Begin Source File + + SOURCE=..\include\monflag.h + # End Source File + # Begin Source File + + SOURCE=..\include\monsym.h + # End Source File + # Begin Source File + + SOURCE=..\include\nhlan.h + # End Source File + # Begin Source File + + SOURCE=..\include\ntconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\objclass.h + # End Source File + # Begin Source File + + SOURCE=..\include\patchlevel.h + # End Source File + # Begin Source File + + SOURCE=..\include\qtext.h + # End Source File + # Begin Source File + + SOURCE=..\include\tradstdc.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhaskyn.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,11 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #include + #include "winMS.h" + #include "mhaskyn.h" + + int mswin_yes_no_dialog( const char *question, const char *choices, int def) + { + return '\032'; + } \ No newline at end of file *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhaskyn.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,11 ---- + /* 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 */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhdlg.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,729 ---- + /* 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 "resource.h" + #include "mhdlg.h" + + /*---------------------------------------------------------------*/ + /* data for getlin dialog */ + struct getlin_data { + const char* question; + char* result; + size_t result_size; + }; + + BOOL 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; + } + + BOOL CALLBACK GetlinDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + struct getlin_data* data; + RECT main_rt, dlg_rt; + SIZE dlg_sz; + TCHAR wbuf[BUFSZ]; + HDC WindowDC; + HWND ControlHWND; + SIZE WindowExtents; + SIZE ViewPortExtents; + RECT ControlRect; + RECT ClientRect; + LONG Division; + LONG ButtonOffset; + + switch (message) + { + case WM_INITDIALOG: + data = (struct getlin_data*)lParam; + SetWindowText(hWnd, NH_A2W(data->question, wbuf, sizeof(wbuf))); + SetWindowLong(hWnd, GWL_USERDATA, lParam); + + /* center dialog in the main window */ + GetWindowRect(hWnd, &dlg_rt); + GetWindowRect(GetNHApp()->hMainWnd, &main_rt); + WindowDC = GetWindowDC(hWnd); + + if (!GetWindowExtEx(WindowDC, &WindowExtents) || + !GetViewportExtEx(WindowDC, &ViewPortExtents) || + !GetTextExtentPoint32(GetWindowDC (hWnd), wbuf, _tcslen(wbuf), &dlg_sz)) + { + dlg_sz.cx = 0; + } + else + { + /* I think we need to do the following scaling */ + dlg_sz.cx *= ViewPortExtents.cx; dlg_sz.cx /= WindowExtents.cx; + /* Add the size of the various items in the caption bar */ + dlg_sz.cx += GetSystemMetrics(SM_CXSIZE) + + 2 * (GetSystemMetrics (SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME)); + } + + if (dlg_sz.cx < dlg_rt.right - dlg_rt.left) + 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 ); + + /* set focus and size of the edit control */ + ControlHWND = GetDlgItem(hWnd, IDC_GETLIN_EDIT); + SetFocus(ControlHWND); + GetClientRect (hWnd, &ClientRect); + GetWindowRect (ControlHWND, &ControlRect); + MoveWindow (ControlHWND, 0, 0, + ClientRect.right - ClientRect.left, + ControlRect.bottom - ControlRect.top, TRUE); + ButtonOffset = ControlRect.bottom - ControlRect.top; + + /* Now get the OK and CANCEL buttons */ + ControlHWND = GetDlgItem(hWnd, IDOK); + GetWindowRect (ControlHWND, &ControlRect); + Division = ((ClientRect.right - ClientRect.left) - + 2 * (ControlRect.right - ControlRect.left)) / 3; + MoveWindow (ControlHWND, Division, + ButtonOffset, + ControlRect.right - ControlRect.left, + ControlRect.bottom - ControlRect.top, TRUE); + ControlHWND = GetDlgItem(hWnd, IDCANCEL); + MoveWindow (ControlHWND, + Division * 2 + ControlRect.right - ControlRect.left, + ButtonOffset, + ControlRect.right - ControlRect.left, + ControlRect.bottom - ControlRect.top, TRUE); + + /* 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; + + } /* end switch (message) */ + return FALSE; + } + + + /*---------------------------------------------------------------*/ + /* dialog data for the list of extended commands */ + struct extcmd_data { + int* selection; + }; + + BOOL 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; + } + + BOOL 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)) ); + } + + /* 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); + + /* 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; + } + + /* 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))); + + 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); + SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, CB_SETCURSEL, (WPARAM)flags.initrole, 0); + } + + /* 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); + SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, CB_SETCURSEL, (WPARAM)flags.initrace, 0); + } + + /* 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); + SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, CB_SETCURSEL, (WPARAM)flags.initgend, 0); + } + + /* 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); + SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, CB_SETCURSEL, (WPARAM)flags.initalign, 0); + } + } + + /* adjust role/race/alignment/gender list - filter out + invalid combinations + changed_sel points to the list where selection occured + (-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)? ROLE_NONE : SendMessage(control_role, CB_GETITEMDATA, ind, 0); + + ind = SendMessage(control_race, CB_GETCURSEL, 0, 0); + initrace = (ind==LB_ERR)? ROLE_NONE : SendMessage(control_race, CB_GETITEMDATA, ind, 0); + + ind = SendMessage(control_gender, CB_GETCURSEL, 0, 0); + initgend = (ind==LB_ERR)? ROLE_NONE : SendMessage(control_gender, CB_GETITEMDATA, ind, 0); + + ind = SendMessage(control_align, CB_GETCURSEL, 0, 0); + initalign = (ind==LB_ERR)? ROLE_NONE : 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 ); + } + } + + /* 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; + } \ No newline at end of file *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhdlg.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,15 ---- + /* 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 */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhfont.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,194 ---- + /* 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); + + void mswin_init_splashfonts(HWND hWnd) + { + HDC hdc = GetDC(hWnd); + HFONT fnt = NULL; + LOGFONT lgfnt; + ZeroMemory( &lgfnt, sizeof(lgfnt) ); + lgfnt.lfHeight = -80; // 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_BOLD; // font weight + lgfnt.lfItalic = FALSE; // italic attribute option + lgfnt.lfUnderline = FALSE; // underline attribute option + lgfnt.lfStrikeOut = FALSE; // strikeout attribute option + lgfnt.lfCharSet = OEM_CHARSET; // character set identifier + lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision + lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision + lgfnt.lfQuality = DEFAULT_QUALITY; // output quality + lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family + NH_A2W( "Times New Roman", lgfnt.lfFaceName, LF_FACESIZE); + version_splash_font = CreateFontIndirect(&lgfnt); + lgfnt.lfHeight = -16; // height of font + extrainfo_splash_font = CreateFontIndirect(&lgfnt); + ReleaseDC(hWnd, hdc); + } + + void mswin_destroy_splashfonts() + { + DeleteObject (version_splash_font); + DeleteObject (extrainfo_splash_font); + } + + /* 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=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; + } + + void __cdecl font_table_cleanup(void) + { + int i; + for(i=0; i */ + /* 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); + void mswin_init_splashfonts(HWND hWnd); + void mswin_destroy_splashfonts(void); + + #endif /* MSWINFont_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhinput.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,85 ---- + /* 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(void) + { + 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 (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; + + 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; + + 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; + } \ No newline at end of file *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhinput.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,35 ---- + /* 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(void); + int mswin_have_input(void); + void mswin_input_push(PMSNHEvent event); + PMSNHEvent mswin_input_pop(void); + PMSNHEvent mswin_input_peek(void); + + #endif /* MSWINInput_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmain.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,915 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "winMS.h" + #include "patchlevel.h" + #include "resource.h" + #include "mhmsg.h" + #include "mhinput.h" + #include "mhmain.h" + #include "mhmenu.h" + #include "mhstatus.h" + #include "mhmsgwnd.h" + #include "mhmap.h" + + typedef struct mswin_nethack_main_window { + int mapAcsiiModeSave; + } NHMainWindow, *PNHMainWindow; + + static 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(void); + static int menuid2mapmode(int menuid); + static int mapmode2menuid(int map_mode); + + HWND mswin_init_main_window () { + static int run_once = 0; + HWND ret; + + /* 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 */ + ret = CreateWindow( + szMainWindowClass, /* registered class name */ + szTitle, /* window name */ + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, /* window style */ + CW_USEDEFAULT, /* horizontal position of window */ + CW_USEDEFAULT, /* vertical position of window */ + CW_USEDEFAULT, /* window width */ + CW_USEDEFAULT, /* 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_NETHACKW); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = (TCHAR*)IDC_NETHACKW; + 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) + + static const char *extendedlist = "acdefijlmnopqrstuvw?2"; + + #define SCANLO 0x02 + static const char scanmap[] = { /* ... */ + '1','2','3','4','5','6','7','8','9','0',0,0,0,0, + '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',',','.','?' /* ... */ + }; + + /* + // 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: + /* 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; + 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; + + default: { + WORD c; + BYTE kbd_state[256]; + + c = 0; + ZeroMemory(kbd_state, sizeof(kbd_state)); + GetKeyboardState(kbd_state); + + if( ToAscii( wParam, (lParam>>16)&0xFF, kbd_state, &c, 0) ) { + NHEVENT_KBD( c&0xFF ); + return 0; + } else { + return 1; + } + } + + } /* end switch */ + } break; + + case WM_SYSCHAR: /* Alt-char pressed */ + { + /* + If not nethackmode, don't handle Alt-keys here. + If no Alt-key pressed it can never be an extended command + */ + if (GetNHApp()->regNetHackMode && ((lParam & 1<<29) != 0)) + { + unsigned char c = (unsigned char)(wParam & 0xFF); + unsigned char scancode = (lParam >> 16) & 0xFF; + if (index(extendedlist, tolower(c)) != 0) + { + NHEVENT_KBD(M(tolower(c))); + } else if (scancode == (SCANLO + SIZE(scanmap)) - 1) { + NHEVENT_KBD(M('?')); + } + return 0; + } + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + + case WM_COMMAND: + /* process commands - menu commands mostly */ + if( onWMCommand(hWnd, wParam, lParam) ) + return DefWindowProc(hWnd, message, wParam, lParam); + else + return 0; + + case WM_MOVE: + 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 */ + if (program_state.gameover) + { + /* assume the user really meant this, as the game is already over... */ + /* to make sure we still save bones, just set stop printing flag */ + program_state.stopprint++; + NHEVENT_KBD('\033'); /* and send keyboard input as if user pressed ESC */ + /* additional code for this is done in menu and rip windows */ + } + else + { + switch(MessageBox(hWnd, TEXT("Save?"), TEXT("NetHack for Windows"), MB_YESNOCANCEL | MB_ICONQUESTION)) { + case IDYES: NHEVENT_KBD('y'); dosave(); break; + case IDNO: NHEVENT_KBD('q'); done(QUIT); break; + case IDCANCEL: break; + } + } + } 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); + + // PostQuitMessage(0); + exit(1); + 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; + + if( GetNHApp()->windowlist[msg_param->wid].type == NHW_MAP ) + mswin_select_map_mode(iflags.wc_map_mode); + + child = GetNHApp()->windowlist[msg_param->wid].win; + if( child ) mswin_layout_main_window(child); + } break; + + } + } + + /* adjust windows to fit main window layout + --------------------------- + | Status | + +-------------------------+ + | | + | | + | MAP | + | | + | | + +-------------------------+ + | Messages | + --------------------------- + */ + void mswin_layout_main_window(HWND changed_child) + { + winid i; + POINT pt; + RECT client_rt, wnd_rect; + SIZE menu_size; + POINT status_org; + SIZE status_size; + POINT msg_org; + SIZE msg_size; + POINT map_org; + SIZE map_size; + HWND wnd_status, wnd_msg; + PNHMainWindow data; + + GetClientRect(GetNHApp()->hMainWnd, &client_rt); + 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; + } + + /* set window positions */ + SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right, client_rt.bottom); + 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; + } + + switch(iflags.wc_align_message) { + case ALIGN_LEFT: + 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; + wnd_rect.left += msg_size.cx; + break; + + case ALIGN_RIGHT: + 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; + wnd_rect.right -= msg_size.cx; + break; + + case ALIGN_TOP: + msg_size.cx = (wnd_rect.right-wnd_rect.left); + msg_org.x = wnd_rect.left; + msg_org.y = wnd_rect.top; + wnd_rect.top += msg_size.cy; + break; + + case ALIGN_BOTTOM: + default: + msg_size.cx = (wnd_rect.right-wnd_rect.left); + msg_org.x = wnd_rect.left; + msg_org.y = wnd_rect.bottom - msg_size.cy; + 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; iwindowlist[i].win && !GetNHApp()->windowlist[i].dead) { + switch( GetNHApp()->windowlist[i].type ) { + case NHW_STATUS: + MoveWindow(GetNHApp()->windowlist[i].win, + status_org.x, + status_org.y, + status_size.cx, + status_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_MESSAGE: + MoveWindow(GetNHApp()->windowlist[i].win, + msg_org.x, + msg_org.y, + msg_size.cx, + msg_size.cy, + TRUE ); + break; + + case NHW_MENU: + mswin_menu_window_size(GetNHApp()->windowlist[i].win, &menu_size); + menu_size.cx = min(menu_size.cx, (client_rt.right-client_rt.left)); + + pt.x = map_org.x + max(0, (int)(map_size.cx-menu_size.cx)); + pt.y = map_org.y; + ClientToScreen(GetNHApp()->hMainWnd, &pt); + MoveWindow(GetNHApp()->windowlist[i].win, + pt.x, + pt.y, + min(menu_size.cx, map_size.cx), + map_size.cy, + TRUE ); + break; + } + ShowWindow(GetNHApp()->windowlist[i].win, SW_SHOW); + } + } + } + + 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); + + // Parse 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_NHMODE: + { + GetNHApp()->regNetHackMode = GetNHApp()->regNetHackMode ? 0 : 1; + mswin_menu_check_intf_mode(); + break; + } + case IDM_CLEARSETTINGS: + { + mswin_destroy_reg(); + /* Notify the user that windows settings will not be saved this time. */ + MessageBox(GetNHApp()->hMainWnd, + "Your Windows Settings will not be stored when you exit this time.", + "NetHack", MB_OK | MB_ICONINFORMATION); + 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_PORTHELP: + display_file(PORT_HELP, TRUE); + 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[BUFSZ]; + RECT main_rt, dlg_rt; + SIZE dlg_sz; + + switch (message) + { + case WM_INITDIALOG: + getversionstring(buf); + SetDlgItemText(hDlg, IDC_ABOUT_VERSION, NH_A2W(buf, wbuf, sizeof(wbuf))); + + SetDlgItemText(hDlg, IDC_ABOUT_COPYRIGHT, + NH_A2W( + COPYRIGHT_BANNER_A "\n" + COPYRIGHT_BANNER_B "\n" + COPYRIGHT_BANNER_C, + wbuf, + BUFSZ + ) ); + + + /* 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; + } + + void mswin_menu_check_intf_mode() + { + HMENU hMenu = GetMenu(GetNHApp()->hMainWnd); + + if (GetNHApp()->regNetHackMode) + CheckMenuItem(hMenu, IDM_NHMODE, MF_CHECKED); + else + CheckMenuItem(hMenu, IDM_NHMODE, MF_UNCHECKED); + + } + + void mswin_select_map_mode(int mode) + { + PNHMainWindow data; + winid map_id; + + map_id = WIN_MAP; + data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA); + + /* override for Rogue level */ + #ifdef REINCARNATION + if( Is_rogue_level(&u.uz) && !IS_MAP_ASCII(mode) ) return; + #endif + + /* set map mode menu mark */ + if( IS_MAP_ASCII(mode) ) { + CheckMenuRadioItem( + GetMenu(GetNHApp()->hMainWnd), + IDM_MAP_TILES, + IDM_MAP_ASCII10X18, + mapmode2menuid( IS_MAP_FIT_TO_SCREEN(mode)? data->mapAcsiiModeSave : mode ), + MF_BYCOMMAND); + } else { + CheckMenuRadioItem( + GetMenu(GetNHApp()->hMainWnd), + IDM_MAP_TILES, + IDM_MAP_ASCII10X18, + mapmode2menuid( MAP_MODE_TILES ), + MF_BYCOMMAND); + } + + /* set fit-to-screen mode mark */ + CheckMenuItem( + GetMenu(GetNHApp()->hMainWnd), + IDM_MAP_FIT_TO_SCREEN, + MF_BYCOMMAND | + (IS_MAP_FIT_TO_SCREEN(mode)? MF_CHECKED : MF_UNCHECKED) + ); + + 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( map_id==WIN_ERR ) + map_id = mswin_winid_from_type(NHW_MAP); + if( map_id!=WIN_ERR ) + mswin_map_mode(mswin_hwnd_from_winid(map_id), 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; + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmain.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,16 ---- + /* 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" + + HWND mswin_init_main_window (void); + void mswin_layout_main_window(HWND changed_child); + void mswin_select_map_mode(int map_mode); + void mswin_menu_check_intf_mode(void); + + #endif /* MSWINMainWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmap.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,954 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "winMS.h" + #include "resource.h" + #include "mhmap.h" + #include "mhmsg.h" + #include "mhinput.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 */ + } 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; + + if( !run_once ) { + register_map_window_class(); + run_once = 1; + } + + ret = CreateWindow( + szNHMapWindowClass, /* registered class name */ + NULL, /* window name */ + WS_CHILD | WS_HSCROLL | WS_VSCROLL | 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 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 = (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO; + data->yScrTile = (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)); + } + + 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)); + } + + 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 = OEM_CHARSET; // character set identifier + lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision + lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision + lgfnt.lfQuality = DEFAULT_QUALITY; // output quality + lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family + _tcscpy(lgfnt.lfFaceName, NHMAP_FONT_NAME); + 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; + } + + /* 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; + + 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: + NHEVENT_MS( + CLICK_1, + max(0, min(COLNO, data->xPos + (LOWORD(lParam)-data->map_orig.x)/data->xScrTile)), + max(0, min(ROWNO, data->yPos + (HIWORD(lParam)-data->map_orig.y)/data->yScrTile)) + ); + return 0; + + case WM_LBUTTONDBLCLK : + NHEVENT_MS( + CLICK_2, + max(0, min(COLNO, data->xPos + (LOWORD(lParam)-data->map_orig.x)/data->xScrTile)), + max(0, min(ROWNO, data->yPos + (HIWORD(lParam)-data->map_orig.y)/data->yScrTile)) + ); + 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) ); + + /* 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; imap[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; imap[i][j] = -1; + } + + data->bAsciiMode = FALSE; + + data->xScrTile = GetNHApp()->mapTile_X; + data->yScrTile = GetNHApp()->mapTile_Y; + + 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 + #ifdef REINCARNATION + || Is_rogue_level(&u.uz) + /* You enter a VERY primitive world! */ + #endif + ) { + HGDIOBJ oldFont; + + oldFont = SelectObject(hDC, data->hMapFont); + SetBkMode(hDC, TRANSPARENT); + + /* draw the map */ + for(i=paint_rt.left; imap[i][j]>=0) { + char ch; + TCHAR wch; + RECT glyph_rect; + int color; + unsigned special; + int mgch; + HBRUSH back_brush; + + nhcoord2display(data, i, j, &glyph_rect); + + #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) + nhglyph2charcolor(data->map[i][j], &ch, &color); + SetTextColor (hDC, nhcolor_to_RGB(color) ); + #else + /* rely on NetHack core helper routine */ + mapglyph(data->map[i][j], &mgch, &color, + &special, i, j); + ch = (char)mgch; + if (((special & MG_PET) && iflags.hilite_pet) || + ((special & MG_DETECT) && iflags.use_inverse)) { + back_brush = CreateSolidBrush(RGB(192, 192, 192)); + FillRect (hDC, &glyph_rect, back_brush); + DeleteObject (back_brush); + SetTextColor( hDC, RGB(0, 0, 0) ); + } else + { + SetTextColor (hDC, nhcolor_to_RGB(color) ); + } + #endif + + DrawText(hDC, + NH_A2W(&ch, &wch, 1), + 1, + &glyph_rect, + DT_CENTER | DT_VCENTER | DT_NOPREFIX + ); + } + 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; imap[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); + + 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); + + + 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 = warnsyms[offset]; + 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)]; + 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)]; + zap_color((offset >> 2)); + } else if ((offset = (g - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ + *ch = showsyms[offset]; + cmap_color(offset); + } else if ((offset = (g - GLYPH_OBJ_OFF)) >= 0) { /* object */ + *ch = oc_syms[(int)objects[offset].oc_class]; + obj_color(offset); + } else if ((offset = (g - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ + *ch = oc_syms[(int)objects[CORPSE].oc_class]; + mon_color(offset); + } else if ((offset = (g - GLYPH_PET_OFF)) >= 0) { /* a pet */ + *ch = monsyms[(int)mons[offset].mlet]; + pet_color(offset); + } else { /* a monster */ + *ch = monsyms[(int)mons[g].mlet]; + 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 + ) + { + HDC hdcMem, hdcBack, hdcObject, hdcSave; + COLORREF cColor; + HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave; + HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld; + + /* Create some DCs to hold temporary data. */ + hdcBack = CreateCompatibleDC(hDC); + hdcObject = CreateCompatibleDC(hDC); + hdcMem = CreateCompatibleDC(hDC); + hdcSave = CreateCompatibleDC(hDC); + + /* this is bitmap for our pet image */ + bmSave = CreateCompatibleBitmap(hDC, s_width, s_height); + + /* Monochrome DC */ + bmAndBack = CreateBitmap(s_width, s_height, 1, 1, NULL); + bmAndObject = CreateBitmap(s_width, s_height, 1, 1, NULL); + + /* resulting bitmap */ + bmAndMem = CreateCompatibleBitmap(hDC, s_width, s_height); + + /* Each DC must select a bitmap object to store pixel data. */ + bmBackOld = SelectObject(hdcBack, bmAndBack); + bmObjectOld = SelectObject(hdcObject, bmAndObject); + bmMemOld = SelectObject(hdcMem, bmAndMem); + bmSaveOld = SelectObject(hdcSave, bmSave); + + /* copy source image because it is going to be overwritten */ + BitBlt(hdcSave, 0, 0, s_width, s_height, sourceDC, s_x, s_y, SRCCOPY); + + /* Set the background color of the source DC to the color. + contained in the parts of the bitmap that should be transparent */ + cColor = SetBkColor(hdcSave, cTransparent); + + /* Create the object mask for the bitmap by performing a BitBlt + from the source bitmap to a monochrome bitmap. */ + BitBlt(hdcObject, 0, 0, s_width, s_height, hdcSave, 0, 0, SRCCOPY); + + /* Set the background color of the source DC back to the original + color. */ + SetBkColor(hdcSave, cColor); + + /* Create the inverse of the object mask. */ + BitBlt(hdcBack, 0, 0, s_width, s_height, hdcObject, 0, 0, NOTSRCCOPY); + + /* Copy background to the resulting image */ + StretchBlt(hdcMem, 0, 0, s_width, s_height, hDC, x, y, width, height, SRCCOPY); + + /* Mask out the places where the source image will be placed. */ + BitBlt(hdcMem, 0, 0, s_width, s_height, hdcObject, 0, 0, SRCAND); + + /* Mask out the transparent colored pixels on the source image. */ + BitBlt(hdcSave, 0, 0, s_width, s_height, hdcBack, 0, 0, SRCAND); + + /* XOR the source image with the beckground. */ + BitBlt(hdcMem, 0, 0, s_width, s_height, hdcSave, 0, 0, SRCPAINT); + + /* blt resulting image to the screen */ + StretchBlt( + hDC, + x, y, width, height, hdcMem, + 0, 0, s_width, s_height, SRCCOPY + ); + + /* cleanup */ + DeleteObject(SelectObject(hdcBack, bmBackOld)); + DeleteObject(SelectObject(hdcObject, bmObjectOld)); + DeleteObject(SelectObject(hdcMem, bmMemOld)); + DeleteObject(SelectObject(hdcSave, bmSaveOld)); + + DeleteDC(hdcMem); + DeleteDC(hdcBack); + DeleteDC(hdcObject); + DeleteDC(hdcSave); + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmap.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,20 ---- + /* 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); + + #define ROGUE_LEVEL_MAP_MODE MAP_MODE_ASCII12x16 + + #define DEF_CLIPAROUND_MARGIN 5 + + #endif /* MSWINMapWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmenu.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,1367 ---- + /* SCCS Id: @(#)mhmenu.c 3.4 2002/03/06 */ + /* Copyright (c) Alex Kompel, 2002 */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "winMS.h" + #include + #include "resource.h" + #include "mhmenu.h" + #include "mhmain.h" + #include "mhmsg.h" + #include "mhfont.h" + + #define MENU_MARGIN 0 + #define NHMENU_STR_SIZE BUFSZ + #define MIN_TABSTOP_SIZE 8 + + 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; + } 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; /* for options menu we use tabstops to align option values */ + } menu; + + struct menu_text { + TCHAR* 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) + + BOOL CALLBACK MenuWndProc(HWND, UINT, WPARAM, LPARAM); + LRESULT CALLBACK NHMenuListWndProc(HWND, UINT, WPARAM, LPARAM); + LRESULT CALLBACK NHMenuTextWndProc(HWND, UINT, WPARAM, LPARAM); + static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); + static BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam); + static BOOL 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 BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch); + + /*-----------------------------------------------------------------------------*/ + 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) + { + MSG msg; + PNHMenuWindow data; + int ret_val; + MENU_ITEM_P *selected = NULL; + int i; + char* ap; + + 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 */ + if( data->type == MENU_TYPE_MENU ) { + char next_char = 'a'; + + data->menu.gacc[0] = '\0'; + ap = data->menu.gacc; + for( i=0; imenu.size; i++) { + if( data->menu.items[i].accelerator!=0 ) { + 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; + } else { + if( next_char > 'z' ) next_char = 'A'; + else if ( next_char > 'Z' ) break; + + data->menu.items[i].accelerator = next_char; + } + + next_char ++; + } + + /* collect group accelerators */ + if( data->how != PICK_NONE ) { + 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); + } + + /* activate the menu window */ + GetNHApp()->hPopupWnd = hWnd; + + mswin_layout_main_window(hWnd); + + /* disable game windows */ + EnableWindow(mswin_hwnd_from_winid(WIN_MAP), FALSE); + EnableWindow(mswin_hwnd_from_winid(WIN_MESSAGE), FALSE); + EnableWindow(mswin_hwnd_from_winid(WIN_STATUS), FALSE); + + /* bring menu window on top */ + SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); + + /* go into message loop */ + while( IsWindow(hWnd) && + !data->done && + GetMessage(&msg, NULL, 0, 0)!=0 ) { + if( !IsDialogMessage(hWnd, &msg) ) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + /* 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; imenu.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; imenu.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; + } + } + } + + /* restore window state */ + EnableWindow(mswin_hwnd_from_winid(WIN_MAP), TRUE); + EnableWindow(mswin_hwnd_from_winid(WIN_MESSAGE), TRUE); + EnableWindow(mswin_hwnd_from_winid(WIN_STATUS), TRUE); + + 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 ); + + return ret_val; + } + /*-----------------------------------------------------------------------------*/ + BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + PNHMenuWindow data; + HWND control; + HDC hdc; + TCHAR title[MAX_LOADSTRING]; + + + data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); + switch (message) + { + case WM_INITDIALOG: + 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); + + /* set font for the text cotrol */ + control = GetDlgItem(hWnd, IDC_MENU_TEXT); + hdc = GetDC(control); + SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE), (LPARAM)0); + ReleaseDC(control, hdc); + + /* subclass edit control */ + editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC); + SetWindowLong(control, GWL_WNDPROC, (LONG)NHMenuTextWndProc); + + /* Even though the dialog has no caption, you can still set the title + which shows on Alt-Tab */ + LoadString(GetNHApp()->hApp, IDS_APP_TITLE, title, MAX_LOADSTRING); + SetWindowText(hWnd, title); + break; + + case WM_MSNH_COMMAND: + onMSNHCommand(hWnd, wParam, lParam); + break; + + case WM_SIZE: + LayoutMenu(hWnd); + return FALSE; + + case WM_CLOSE: + if (program_state.gameover) { + data->result = -1; + data->done = 1; + program_state.stopprint++; + return TRUE; + } else + 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 TRUE; + } else { + data->result = -1; + data->done = 1; + } + return TRUE; + + case IDOK: + data->done = 1; + data->result = 0; + return TRUE; + + case IDC_MENU_TEXT: + switch (HIWORD(wParam)) + { + case EN_SETFOCUS: + HideCaret((HWND)lParam); + return TRUE; + } + } + } 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->iItemmenu.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; + } + } + } break; + + case NM_CLICK: { + LPNMLISTVIEW lpnmitem = (LPNMLISTVIEW) lParam; + if( lpnmitem->iItem==-1 ) return 0; + if( data->how==PICK_ANY ) { + SelectMenuItem( + lpnmitem->hdr.hwndFrom, + data, + lpnmitem->iItem, + NHMENU_IS_SELECTED(data->menu.items[lpnmitem->iItem])? 0 : -1 + ); + } + } break; + + case LVN_ITEMCHANGED: + { + LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam; + if( lpnmlv->iItem==-1 ) return 0; + if( !(lpnmlv->uChanged & LVIF_STATE) ) return 0; + + if( data->how==PICK_ONE || data->how==PICK_ANY ) { + 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 */ + if( data->how==PICK_ONE || data->how==PICK_ANY ) { + 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 ); + } + 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_DESTROY: + if( data ) { + DeleteObject(data->bmpChecked); + DeleteObject(data->bmpCheckedCount); + DeleteObject(data->bmpNotChecked); + if( data->type == MENU_TYPE_TEXT ) { + if( data->text.text ) free(data->text.text); + } + free(data); + SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); + } + return TRUE; + } + return FALSE; + } + /*-----------------------------------------------------------------------------*/ + 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; + TCHAR wbuf[BUFSZ]; + size_t text_size; + + if( data->type!=MENU_TYPE_TEXT ) + SetMenuType(hWnd, MENU_TYPE_TEXT); + + if( !data->text.text ) { + text_size = strlen(msg_data->text) + 4; + data->text.text = (TCHAR*)malloc(text_size*sizeof(data->text.text[0])); + ZeroMemory(data->text.text, text_size*sizeof(data->text.text[0])); + } else { + text_size = _tcslen(data->text.text) + strlen(msg_data->text) + 4; + data->text.text = (TCHAR*)realloc(data->text.text, text_size*sizeof(data->text.text[0])); + } + if( !data->text.text ) break; + + _tcscat(data->text.text, NH_A2W(msg_data->text, wbuf, BUFSZ)); + _tcscat(data->text.text, TEXT("\r\n")); + + text_view = GetDlgItem(hWnd, IDC_MENU_TEXT); + if( !text_view ) panic("cannot get text view window"); + SetWindowText(text_view, data->text.text); + } break; + + case MSNH_MSG_STARTMENU: + 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; + data->menu.tab_stop_size = MIN_TABSTOP_SIZE; + break; + + case MSNH_MSG_ADDMENU: + { + PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam; + char *p, *p1; + int new_item; + + 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; + strncpy(data->menu.items[new_item].str, msg_data->str, NHMENU_STR_SIZE); + data->menu.items[new_item].presel = msg_data->presel; + + /* calculate tabstop size */ + p1 = data->menu.items[new_item].str; + p = strchr(data->menu.items[new_item].str, '\t'); + while( p ) { + data->menu.tab_stop_size = + max( data->menu.tab_stop_size, p - p1 + 1 ); + p1 = p; + p = strchr(p+1, '\t'); + } + + /* 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; + + } + } + /*-----------------------------------------------------------------------------*/ + 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 */ + 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; + + 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; + + 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) - 2*MENU_MARGIN; + + MoveWindow(GetMenuControl(hWnd), pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE ); + MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE ); + MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE ); + } + /*-----------------------------------------------------------------------------*/ + 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; + + 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); + + /* add column to the list view */ + ZeroMemory(&lvcol, sizeof(lvcol)); + lvcol.mask = LVCF_WIDTH | LVCF_TEXT; + lvcol.cx = GetSystemMetrics(SM_CXFULLSCREEN); + lvcol.pszText = NH_A2W(data->menu.prompt, wbuf, BUFSZ); + ListView_InsertColumn(control, 0, &lvcol); + + /* add items to the list view */ + for(i=0; imenu.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); + } + } + /*-----------------------------------------------------------------------------*/ + BOOL 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; + } + /*-----------------------------------------------------------------------------*/ + BOOL 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; + DRAWTEXTPARAMS dtp; + + 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)); + GetTextMetrics(lpdis->hDC, &tm); + + x = lpdis->rcItem.left + 1; + + /* print check mark */ + if( NHMENU_IS_SELECTABLE(*item) ) { + HGDIOBJ saveBmp; + char buf[2]; + + switch(item->count) { + case -1: saveBmp = SelectObject(tileDC, data->bmpChecked); break; + case 0: saveBmp = SelectObject(tileDC, data->bmpNotChecked); break; + default: saveBmp = SelectObject(tileDC, data->bmpCheckedCount); break; + } + + y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; + BitBlt(lpdis->hDC, x, y, TILE_X, TILE_Y, tileDC, 0, 0, SRCCOPY ); + + 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; + SelectObject(tileDC, saveBmp); + } 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 */ + SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom ); + + ZeroMemory(&dtp, sizeof(dtp)); + dtp.cbSize = sizeof(dtp); + dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size); + DrawTextEx(lpdis->hDC, + NH_A2W(item->str, wbuf, BUFSZ), + strlen(item->str), + &drawRect, + DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP, + &dtp + ); + + /* draw focused item */ + if( item->has_focus ) { + RECT client_rt; + + 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; + FillRect(lpdis->hDC, &drawRect, (HBRUSH)GetClassLong(lpdis->hwndItem, GCL_HBRBACKGROUND) ); + + /* 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); + } + + 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; imenu.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; imenu.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; imenu.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; ihow == 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; ihow == 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; imenu.items[i])? 0 : -1 + ); + } + return -2; + } + break; + + case MENU_SEARCH: + if( data->how==PICK_ANY || data->how==PICK_ONE ) { + char buf[BUFSZ]; + + reset_menu_count(hwndList, data); + mswin_getlin("Search for:", buf); + if (!*buf || *buf == '\033') return -2; + for(i=0; imenu.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 + ); + } else if( data->how == PICK_ONE ) { + SelectMenuItem( + hwndList, + data, + i, + -1 + ); + ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); + ListView_EnsureVisible(hwndList, i, FALSE); + break; + } + } + } + } else { + mswin_nhbell(); + } + return -2; + + case ' ': + { + if (GetNHApp()->regNetHackMode) { + /* NetHack mode: Scroll down one page, + ends menu when on last page. */ + SCROLLINFO si; + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE; + GetScrollInfo(hwndList, SB_VERT, &si); + if ((si.nPos + (int)si.nPage) > (si.nMax - si.nMin)) { + /* We're at the bottom: dismiss. */ + data->done = 1; + data->result = 0; + return -2; + } + /* We're not at the bottom: page down. */ + 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; + } else { + /* Windows mode: 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 + ); + } + } + } + } + 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; imenu.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; imenu.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; imenu.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; + TCHAR wbuf[BUFSZ]; + + GetClientRect(hWnd, &rt); + sz->cx = rt.right - rt.left; + sz->cy = rt.bottom - rt.top; + + 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; imenu.size; i++ ) { + DRAWTEXTPARAMS dtp; + RECT drawRect; + + SetRect(&drawRect, 0, 0, 1, 1); + ZeroMemory(&dtp, sizeof(dtp)); + dtp.cbSize = sizeof(dtp); + dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size); + DrawTextEx(hdc, + NH_A2W(data->menu.items[i].str, wbuf, BUFSZ), + strlen(data->menu.items[i].str), + &drawRect, + DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP, + &dtp + ); + + sz->cx = max(sz->cx, + (LONG)(2*TILE_X + (drawRect.right - drawRect.left) + tm.tmAveCharWidth*12 + tm.tmOverhang)); + } + SelectObject(hdc, saveFont); + } else { + /* Calculate the width of the text box. */ + RECT text_rt; + saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE)); + GetTextMetrics(hdc, &tm); + SetRect(&text_rt, 0, 0, sz->cx, sz->cy); + DrawText(hdc, data->text.text, _tcslen(data->text.text), &text_rt, DT_CALCRECT | DT_TOP | DT_LEFT | DT_NOPREFIX); + sz->cx = max(sz->cx, text_rt.right - text_rt.left + 5*tm.tmAveCharWidth + tm.tmOverhang); + SelectObject(hdc, saveFont); + } + sz->cx += GetSystemMetrics(SM_CXVSCROLL) + 2*GetSystemMetrics(SM_CXSIZEFRAME); + + 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; imenu.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; + + bUpdateFocusItem = FALSE; + + switch(message) { + + /* filter keyboard input for the control */ + case WM_KEYDOWN: + case WM_KEYUP: { + MSG msg; + BOOL processed; + + processed = FALSE; + if( PeekMessage(&msg, hWnd, WM_CHAR, WM_CHAR, PM_REMOVE) ) { + if( onListChar(GetParent(hWnd), hWnd, (char)msg.wParam)==-2 ) { + processed = TRUE; + } + } + if( processed ) return 0; + + if( wParam==VK_LEFT || wParam==VK_RIGHT ) + bUpdateFocusItem = TRUE; + } break; + + 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 scrolling without a cursor */ + LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + switch(message) { + + case WM_KEYDOWN: + switch (wParam) + { + /* close on space in Windows mode + page down on space in NetHack mode */ + case VK_SPACE: + { + SCROLLINFO si; + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE; + GetScrollInfo(hWnd, SB_VERT, &si); + /* If nethackmode and not at the end of the list */ + if (GetNHApp()->regNetHackMode && + (si.nPos + (int)si.nPage) <= (si.nMax - si.nMin)) + SendMessage(hWnd, EM_SCROLL, SB_PAGEDOWN, 0); + else + PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0); + return 0; + } + case VK_NEXT: + SendMessage(hWnd, EM_SCROLL, SB_PAGEDOWN, 0); + return 0; + case VK_PRIOR: + SendMessage(hWnd, EM_SCROLL, SB_PAGEUP, 0); + return 0; + case VK_UP: + SendMessage(hWnd, EM_SCROLL, SB_LINEUP, 0); + return 0; + case VK_DOWN: + SendMessage(hWnd, EM_SCROLL, SB_LINEDOWN, 0); + return 0; + + } + break; + + } + + if( editControlWndProc ) + return CallWindowProc(editControlWndProc, hWnd, message, wParam, lParam); + else + return 0; + } + /*-----------------------------------------------------------------------------*/ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmenu.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,18 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #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 */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmsg.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,61 ---- + /* 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 + #define MSNH_MSG_DIED 109 + + 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 *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmsgwnd.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,540 ---- + /* 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 "mhfont.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 + + #define DEFAULT_COLOR_BG_MSG COLOR_WINDOW + #define DEFAULT_COLOR_FG_MSG COLOR_WINDOWTEXT + + 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 */ + } NHMessageWindow, *PNHMessageWindow; + + static TCHAR szMessageWindowClass[] = TEXT("MSNHMessageWndClass"); + LRESULT CALLBACK NHMessageWndProc(HWND, UINT, WPARAM, LPARAM); + static void register_message_window_class(void); + 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 void onPaint(HWND hWnd); + static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); + static HDC prepareDC( HDC hdc ); + + 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_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL; + #else + style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL; + #endif + + ret = CreateWindowEx( + WS_EX_CLIENTEDGE, + 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 = message_bg_brush ? message_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_MSG); + 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 - MSG_VISIBLE_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 = 0; + si.nMax = MSG_LINES; + 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); + + /* update window content */ + InvalidateRect(hWnd, NULL, TRUE); + } + break; + + case MSNH_MSG_CLEAR_WINDOW: + { + MSNHMsgPutstr data; + + /* append an empty line to the message window (send message to itself) */ + data.attr = ATR_NONE; + data.text = " "; + onMSNHCommand(hWnd, (WPARAM)MSNH_MSG_PUTSTR, (LPARAM)&data); + + InvalidateRect(hWnd, NULL, TRUE); + 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(-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 + + 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, message_bg_brush ? message_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MSG)); + OldFg = SetTextColor(hdc, message_fg_brush ? message_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MSG)); + + data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); + + GetClientRect(hWnd, &client_rt); + + if( !IsRectEmpty(&ps.rcPaint) ) { + FirstLine = max (0, data->yPos + ps.rcPaint.top/data->yChar - 1); + LastLine = min (MSG_LINES-1, data->yPos + 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)); + + #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; + } + + /* highligh the last line */ + if( i==MSG_LINES-1 ) { + draw_rt.left = client_rt.left; + draw_rt.right = draw_rt.left + 2*data->xChar; + DrawText(hdc, TEXT("> "), 2, &draw_rt, DT_NOPREFIX ); + + y -= 2; + draw_rt.left = client_rt.left; + draw_rt.right = client_rt.right; + draw_rt.top -= 2; + draw_rt.bottom = client_rt.bottom; + DrawEdge(hdc, &draw_rt, EDGE_SUNKEN, BF_TOP | BF_ADJUST); + DrawEdge(hdc, &draw_rt, EDGE_SUNKEN, BF_BOTTOM | BF_ADJUST); + } + } + } + + 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 = prepareDC( 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); + } + + HDC prepareDC( HDC hdc ) + { + // set font here + return hdc; + } + + + 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; + } + } \ No newline at end of file *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhmsgwnd.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,15 ---- + /* 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); + void mswin_message_window_size (HWND hWnd, LPSIZE sz); + + + #endif /* MSWINMessageWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhrip.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,265 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "winMS.h" + #include "resource.h" + #include "mhrip.h" + #include "mhmsg.h" + #include "mhfont.h" + + #define RIP_WIDTH 400 + #define RIP_HEIGHT 200 + + #define RIP_GRAVE_HEIGHT 120 + #define RIP_GRAVE_WIDTH 115 + #define RIP_GRAVE_X 90 + #define RIP_GRAVE_Y 60 + + #define RIP_OFFSET_X 10 + #define RIP_OFFSET_Y 10 + + PNHWinApp GetNHApp(void); + + typedef struct mswin_nethack_text_window { + HANDLE rip_bmp; + TCHAR* window_text; + TCHAR* rip_text; + } NHRIPWindow, *PNHRIPWindow; + + BOOL CALLBACK NHRIPWndProc(HWND, UINT, WPARAM, LPARAM); + static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); + + HWND mswin_init_RIP_window () { + HWND ret; + PNHRIPWindow data; + + ret = CreateDialog( + GetNHApp()->hApp, + MAKEINTRESOURCE(IDD_NHRIP), + GetNHApp()->hMainWnd, + NHRIPWndProc + ); + if( !ret ) panic("Cannot create rip window"); + + data = (PNHRIPWindow)malloc(sizeof(NHRIPWindow)); + if( !data ) panic("out of memory"); + + ZeroMemory(data, sizeof(NHRIPWindow)); + SetWindowLong(ret, GWL_USERDATA, (LONG)data); + return ret; + } + + void mswin_display_RIP_window (HWND hWnd) + { + MSG msg; + RECT rt; + PNHRIPWindow data; + HWND mapWnd; + RECT riprt; + RECT clientrect; + RECT textrect; + HDC hdc; + HFONT OldFont; + + data = (PNHRIPWindow)GetWindowLong(hWnd, GWL_USERDATA); + + GetNHApp()->hPopupWnd = hWnd; + mapWnd = mswin_hwnd_from_winid(WIN_MAP); + if( !IsWindow(mapWnd) ) mapWnd = GetNHApp()->hMainWnd; + GetWindowRect(mapWnd, &rt); + GetWindowRect(hWnd, &riprt); + GetClientRect (hWnd, &clientrect); + textrect = clientrect; + textrect.top += RIP_OFFSET_Y; + textrect.left += RIP_OFFSET_X; + textrect.right -= RIP_OFFSET_X; + if (data->window_text) + { + hdc = GetDC (hWnd); + OldFont = SelectObject (hdc, mswin_get_font(NHW_TEXT, 0, hdc, FALSE)); + DrawText (hdc, data->window_text, strlen(data->window_text), &textrect, + DT_LEFT | DT_NOPREFIX | DT_CALCRECT); + SelectObject (hdc, OldFont); + ReleaseDC(hWnd, hdc); + } + if (textrect.right - textrect.left > RIP_WIDTH) + clientrect.right = textrect.right + RIP_OFFSET_X - clientrect.right; + else + clientrect.right = textrect.left + 2 * RIP_OFFSET_X + RIP_WIDTH - clientrect.right; + clientrect.bottom = textrect.bottom + RIP_HEIGHT + RIP_OFFSET_Y - clientrect.bottom; + GetWindowRect (GetDlgItem(hWnd, IDOK), &textrect); + textrect.right -= textrect.left; + textrect.bottom -= textrect.top; + clientrect.bottom += textrect.bottom + RIP_OFFSET_Y; + riprt.right -= riprt.left; + riprt.bottom -= riprt.top; + riprt.right += clientrect.right; + riprt.bottom += clientrect.bottom; + rt.left += (rt.right - rt.left - riprt.right) / 2; + rt.top += (rt.bottom - rt.top - riprt.bottom) / 2; + + MoveWindow(hWnd, rt.left, rt.top, riprt.right, riprt.bottom, TRUE); + GetClientRect (hWnd, &clientrect); + MoveWindow (GetDlgItem(hWnd, IDOK), + (clientrect.right - clientrect.left - textrect.right) / 2, + clientrect.bottom - textrect.bottom - RIP_OFFSET_Y, textrect.right, textrect.bottom, TRUE); + ShowWindow(hWnd, SW_SHOW); + + while( IsWindow(hWnd) && + GetMessage(&msg, NULL, 0, 0)!=0 ) { + if( !IsDialogMessage(hWnd, &msg) ) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + GetNHApp()->hPopupWnd = NULL; + } + + BOOL CALLBACK NHRIPWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + HDC hdc; + PNHRIPWindow data; + + data = (PNHRIPWindow)GetWindowLong(hWnd, GWL_USERDATA); + switch (message) + { + case WM_INITDIALOG: + /* set text control font */ + hdc = GetDC(hWnd); + SendMessage(hWnd, WM_SETFONT, + (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0); + ReleaseDC(hWnd, hdc); + + SetFocus(GetDlgItem(hWnd, IDOK)); + return FALSE; + + case WM_MSNH_COMMAND: + onMSNHCommand(hWnd, wParam, lParam); + break; + + case WM_PAINT: + { + int bitmap_offset; + RECT clientrect; + RECT textrect; + HDC hdcBitmap; + HANDLE OldBitmap; + PAINTSTRUCT ps; + HFONT OldFont; + + hdc = BeginPaint (hWnd, &ps); + OldFont = SelectObject (hdc, mswin_get_font(NHW_TEXT, 0, hdc, FALSE)); + hdcBitmap = CreateCompatibleDC(hdc); + SetBkMode (hdc, TRANSPARENT); + GetClientRect (hWnd, &clientrect); + textrect = clientrect; + textrect.top += RIP_OFFSET_Y; + textrect.left += RIP_OFFSET_X; + textrect.right -= RIP_OFFSET_X; + if (data->window_text) + { + DrawText (hdc, data->window_text, strlen(data->window_text), &textrect, + DT_LEFT | DT_NOPREFIX | DT_CALCRECT); + DrawText (hdc, data->window_text, strlen(data->window_text), &textrect, + DT_LEFT | DT_NOPREFIX); + } + OldBitmap = SelectObject(hdcBitmap, GetNHApp()->bmpRip); + SetBkMode (hdc, OPAQUE); + bitmap_offset = (textrect.right - textrect.left - RIP_WIDTH) / 2; + BitBlt (hdc, textrect.left + bitmap_offset, textrect.bottom, RIP_WIDTH, + RIP_HEIGHT, hdcBitmap, 0, 0, SRCCOPY); + SetBkMode (hdc, TRANSPARENT); + if (data->rip_text) + { + textrect.left += RIP_GRAVE_X + bitmap_offset; + textrect.top = textrect.bottom + RIP_GRAVE_Y; + textrect.right = textrect.left + RIP_GRAVE_WIDTH; + textrect.bottom = textrect.top + RIP_GRAVE_HEIGHT; + DrawText (hdc, data->rip_text, strlen(data->rip_text), &textrect, + DT_CENTER | DT_VCENTER | DT_NOPREFIX | DT_WORDBREAK); + } + SelectObject (hdcBitmap, OldBitmap); + SelectObject (hdc, OldFont); + DeleteDC (hdcBitmap); + EndPaint (hWnd, &ps); + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + mswin_window_mark_dead(mswin_winid_from_handle(hWnd)); + if( GetNHApp()->hMainWnd==hWnd ) + GetNHApp()->hMainWnd=NULL; + DestroyWindow(hWnd); + SetFocus(GetNHApp()->hMainWnd); + return TRUE; + } + break; + + case WM_CLOSE: + /* if we get this here, we saved the bones so we can just force a quit */ + + mswin_window_mark_dead(mswin_winid_from_handle(hWnd)); + if( GetNHApp()->hMainWnd==hWnd ) + GetNHApp()->hMainWnd=NULL; + DestroyWindow(hWnd); + SetFocus(GetNHApp()->hMainWnd); + program_state.stopprint++; + return TRUE; + + case WM_DESTROY: + if( data ) { + if( data->window_text ) free(data->window_text); + if( data->rip_text ) free(data->rip_text); + if (data->rip_bmp != NULL) DeleteObject(data->rip_bmp); + free(data); + SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); + } + break; + + } + return FALSE; + } + + void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) + { + PNHRIPWindow data; + static int InRipText = 1; + data = (PNHRIPWindow)GetWindowLong(hWnd, GWL_USERDATA); + switch( wParam ) { + case MSNH_MSG_PUTSTR: { + PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam; + TCHAR wbuf[BUFSZ]; + size_t text_size; + + if( !data->window_text ) { + text_size = strlen(msg_data->text) + 4; + data->window_text = (TCHAR*)malloc(text_size*sizeof(data->window_text[0])); + ZeroMemory(data->window_text, text_size*sizeof(data->window_text[0])); + } else { + text_size = _tcslen(data->window_text) + strlen(msg_data->text) + 4; + data->window_text = (TCHAR*)realloc(data->window_text, text_size*sizeof(data->window_text[0])); + } + if( !data->window_text ) break; + + _tcscat(data->window_text, NH_A2W(msg_data->text, wbuf, BUFSZ)); + _tcscat(data->window_text, TEXT("\r\n")); + break; + } + case MSNH_MSG_DIED: + { + data->rip_text = data->window_text; + data->window_text = NULL; + break; + } + + } + } + + void mswin_finish_rip_text(winid wid) + { + SendMessage (mswin_hwnd_from_winid(wid), WM_MSNH_COMMAND, MSNH_MSG_DIED, 0); + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhrip.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,15 ---- + /* 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" + + void mswin_finish_rip_text(winid wid); + HWND mswin_init_RIP_window (void); + void mswin_display_RIP_window (HWND hwnd); + + #endif /* MSWINRIPWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhsplash.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,169 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "winMS.h" + #include "resource.h" + #include "mhsplash.h" + #include "mhmsg.h" + #include "mhfont.h" + #include "patchlevel.h" + + PNHWinApp GetNHApp(void); + + BOOL CALLBACK NHSplashWndProc(HWND, UINT, WPARAM, LPARAM); + + #define SPLASH_WIDTH 440 + #define SPLASH_HEIGHT 240 + #define SPLASH_VERSION_X 290 + #define SPLASH_VERSION_Y 10 + #define SPLASH_EXTRA_X_BEGIN 15 + #define SPLASH_EXTRA_X_END 415 + #define SPLASH_EXTRA_Y 150 + #define SPLASH_OFFSET_X 10 + #define SPLASH_OFFSET_Y 10 + + extern HFONT version_splash_font; + extern HFONT extrainfo_splash_font; + + void mswin_display_splash_window () + { + MSG msg; + RECT rt; + HWND mapWnd; + RECT splashrt; + RECT clientrt; + RECT controlrt; + HWND hWnd; + + hWnd = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_SPLASH), + GetNHApp()->hMainWnd, NHSplashWndProc); + if( !hWnd ) panic("Cannot create Splash window"); + mswin_init_splashfonts(hWnd); + GetNHApp()->hPopupWnd = hWnd; + mapWnd = mswin_hwnd_from_winid(WIN_MAP); + if( !IsWindow(mapWnd) ) mapWnd = GetNHApp()->hMainWnd; + /* Get control size */ + GetWindowRect (GetDlgItem(hWnd, IDOK), &controlrt); + controlrt.right -= controlrt.left; + controlrt.bottom -= controlrt.top; + /* Get current client area */ + GetClientRect (hWnd, &clientrt); + /* Get window size */ + GetWindowRect(hWnd, &splashrt); + splashrt.right -= splashrt.left; + splashrt.bottom -= splashrt.top; + /* Get difference between requested client area and current value */ + splashrt.right += SPLASH_WIDTH + SPLASH_OFFSET_X * 2 - clientrt.right; + splashrt.bottom += SPLASH_HEIGHT + controlrt.bottom + SPLASH_OFFSET_Y * 3 - clientrt.bottom; + /* Place the window centered */ + GetWindowRect(mapWnd, &rt); + rt.left += (rt.right - rt.left - splashrt.right) / 2; + rt.top += (rt.bottom - rt.top - splashrt.bottom) / 2; + MoveWindow(hWnd, rt.left, rt.top, splashrt.right, splashrt.bottom, TRUE); + /* Place the control */ + GetClientRect (hWnd, &clientrt); + MoveWindow (GetDlgItem(hWnd, IDOK), + (clientrt.right - clientrt.left - controlrt.right) / 2, + clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y, + controlrt.right, controlrt.bottom, TRUE); + ShowWindow(hWnd, SW_SHOW); + + while( IsWindow(hWnd) && + GetMessage(&msg, NULL, 0, 0)!=0 ) { + if( !IsDialogMessage(hWnd, &msg) ) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + GetNHApp()->hPopupWnd = NULL; + mswin_destroy_splashfonts(); + } + + BOOL CALLBACK NHSplashWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + HDC hdc; + switch (message) + { + case WM_INITDIALOG: + /* set text control font */ + hdc = GetDC(hWnd); + hdc = GetDC(hWnd); + SendMessage(hWnd, WM_SETFONT, + (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0); + ReleaseDC(hWnd, hdc); + + ReleaseDC(hWnd, hdc); + + SetFocus(GetDlgItem(hWnd, IDOK)); + return FALSE; + + case WM_PAINT: + { + char VersionString[BUFSZ]; + char InfoString[BUFSZ]; + RECT rt; + HDC hdcBitmap; + HANDLE OldBitmap; + HANDLE OldFont; + PAINTSTRUCT ps; + + hdc = BeginPaint (hWnd, &ps); + /* Show splash graphic */ + + hdcBitmap = CreateCompatibleDC(hdc); + SetBkMode (hdc, OPAQUE); + OldBitmap = SelectObject(hdcBitmap, GetNHApp()->bmpSplash); + BitBlt (hdc, SPLASH_OFFSET_X, SPLASH_OFFSET_Y, SPLASH_WIDTH, + SPLASH_HEIGHT, hdcBitmap, 0, 0, SRCCOPY); + SelectObject (hdcBitmap, OldBitmap); + DeleteDC (hdcBitmap); + + SetBkMode (hdc, TRANSPARENT); + /* Print version number */ + + SetTextColor (hdc, RGB(0, 0, 0)); + rt.right = rt.left = SPLASH_VERSION_X; + rt.bottom = rt.top = SPLASH_VERSION_Y; + Sprintf (VersionString, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, + PATCHLEVEL); + OldFont = SelectObject(hdc, version_splash_font); + DrawText (hdc, VersionString, strlen(VersionString), &rt, + DT_LEFT | DT_NOPREFIX | DT_CALCRECT); + DrawText (hdc, VersionString, strlen(VersionString), &rt, + DT_LEFT | DT_NOPREFIX); + + /* Print copyright banner */ + + SetTextColor (hdc, RGB(255, 255, 255)); + Sprintf (InfoString, "%s\n%s\n%s\n", COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B, + COPYRIGHT_BANNER_C); + SelectObject(hdc, extrainfo_splash_font); + rt.left = SPLASH_EXTRA_X_BEGIN; + rt.right = SPLASH_EXTRA_X_END; + rt.bottom = rt.top = SPLASH_EXTRA_Y; + DrawText (hdc, InfoString, strlen(InfoString), &rt, + DT_LEFT | DT_NOPREFIX | DT_LEFT | DT_VCENTER | DT_CALCRECT); + DrawText (hdc, InfoString, strlen(InfoString), &rt, + DT_LEFT | DT_NOPREFIX | DT_LEFT | DT_VCENTER); + + SelectObject(hdc, OldFont); + EndPaint (hWnd, &ps); + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + mswin_window_mark_dead(mswin_winid_from_handle(hWnd)); + if( GetNHApp()->hMainWnd==hWnd ) + GetNHApp()->hMainWnd=NULL; + DestroyWindow(hWnd); + SetFocus(GetNHApp()->hMainWnd); + return TRUE; + } + break; + } + return FALSE; + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhsplash.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,13 ---- + /* Copyright (C) 2002 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #ifndef MSWINSplashWindow_h + #define MSWINSplashWindow_h + + #include "winMS.h" + #include "config.h" + #include "global.h" + + void mswin_display_splash_window (void); + + #endif /* MSWINSplashWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhstatus.c Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,176 ---- + /* 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" + + #define NHSW_LINES 2 + #define MAXWINDOWTEXT 80 + + typedef struct mswin_nethack_status_window { + int index; + char window_text[NHSW_LINES][MAXWINDOWTEXT]; + } NHStatusWindow, *PNHStatusWindow; + + static TCHAR szStatusWindowClass[] = TEXT("MSNHStatusWndClass"); + LRESULT CALLBACK StatusWndProc(HWND, UINT, WPARAM, LPARAM); + static void register_status_window_class(void); + + #define DEFAULT_COLOR_BG_STATUS COLOR_WINDOW + #define DEFAULT_COLOR_FG_STATUS COLOR_WINDOWTEXT + + 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)); + 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 = status_bg_brush + ? status_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_STATUS); + 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: { + PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam; + strncpy(data->window_text[data->index], msg_data->text, + MAXWINDOWTEXT); + strncat(data->window_text[data->index], "\n", + MAXWINDOWTEXT-strlen(data->window_text[data->index])); + data->index = (data->index+1) % NHSW_LINES; + InvalidateRect(hWnd, NULL, TRUE); + break; + } + case MSNH_MSG_CLEAR_WINDOW: + data->index = 0; + ZeroMemory(data->window_text, sizeof(data->window_text)); + InvalidateRect(hWnd, NULL, TRUE); + break; + } + } break; + + case WM_PAINT: { + int i; + SIZE sz; + HGDIOBJ oldFont; + TCHAR wbuf[BUFSZ]; + 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, status_bg_brush + ? status_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_STATUS)); + OldFg = SetTextColor(hdc, status_fg_brush + ? status_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_STATUS)); + + for(i=0; iwindow_text[i], wbuf, sizeof(wbuf)), strlen(data->window_text[i]), &sz); + NH_A2W(data->window_text[i], wbuf, BUFSZ); + DrawText(hdc, wbuf, strlen(data->window_text[i]), &rt, DT_LEFT | DT_END_ELLIPSIS); + rt.top += sz.cy; + } + + SelectObject(hdc, oldFont); + SetTextColor (hdc, OldFg); + SetBkColor (hdc, OldBg); + 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); + + sz->cy = tm.tmHeight * NHSW_LINES; + + SelectObject(hdc, saveFont); + ReleaseDC(hWnd, hdc); + } + } \ No newline at end of file *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhstatus.h Thu Mar 21 07:37:45 2002 *************** *** 0 **** --- 1,14 ---- + /* 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); + void mswin_status_window_size (HWND hWnd, LPSIZE sz); + + #endif /* MSWINStatusWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhtext.c Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,254 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #include "winMS.h" + #include "resource.h" + #include "mhtext.h" + #include "mhmsg.h" + #include "mhfont.h" + + PNHWinApp GetNHApp(void); + + typedef struct mswin_nethack_text_window { + TCHAR* window_text; + } NHTextWindow, *PNHTextWindow; + + static WNDPROC editControlWndProc = 0; + + BOOL CALLBACK NHTextWndProc(HWND, UINT, WPARAM, LPARAM); + LRESULT CALLBACK NHEditHookWndProc(HWND, UINT, WPARAM, LPARAM); + static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); + static void LayoutText(HWND hwnd); + + HWND mswin_init_text_window () { + HWND ret; + PNHTextWindow data; + + ret = CreateDialog( + GetNHApp()->hApp, + MAKEINTRESOURCE(IDD_NHTEXT), + GetNHApp()->hMainWnd, + NHTextWndProc + ); + if( !ret ) panic("Cannot create text window"); + + data = (PNHTextWindow)malloc(sizeof(NHTextWindow)); + if( !data ) panic("out of memory"); + + ZeroMemory(data, sizeof(NHTextWindow)); + SetWindowLong(ret, GWL_USERDATA, (LONG)data); + return ret; + } + + void mswin_display_text_window (HWND hWnd) + { + MSG msg; + RECT rt; + PNHTextWindow data; + HWND mapWnd; + + data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA); + if( data && data->window_text ) { + HWND control; + control = GetDlgItem(hWnd, IDC_TEXT_CONTROL); + SendMessage(control, EM_FMTLINES, 1, 0 ); + SetWindowText(GetDlgItem(hWnd, IDC_TEXT_CONTROL), data->window_text); + } + + GetNHApp()->hPopupWnd = hWnd; + mapWnd = mswin_hwnd_from_winid(WIN_MAP); + if( !IsWindow(mapWnd) ) mapWnd = GetNHApp()->hMainWnd; + GetWindowRect(mapWnd, &rt); + MoveWindow(hWnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); + ShowWindow(hWnd, SW_SHOW); + + while( IsWindow(hWnd) && + GetMessage(&msg, NULL, 0, 0)!=0 ) { + if( !IsDialogMessage(hWnd, &msg) ) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + GetNHApp()->hPopupWnd = NULL; + } + + BOOL CALLBACK NHTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + HWND control; + HDC hdc; + PNHTextWindow data; + TCHAR title[MAX_LOADSTRING]; + + 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); + + /* subclass edit control */ + editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC); + SetWindowLong(control, GWL_WNDPROC, (LONG)NHEditHookWndProc); + + SetFocus(control); + + /* Even though the dialog has no caption, you can still set the title + which shows on Alt-Tab */ + LoadString(GetNHApp()->hApp, IDS_APP_TITLE, title, MAX_LOADSTRING); + SetWindowText(hWnd, title); + 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: + mswin_window_mark_dead(mswin_winid_from_handle(hWnd)); + if( GetNHApp()->hMainWnd==hWnd ) + GetNHApp()->hMainWnd=NULL; + DestroyWindow(hWnd); + SetFocus(GetNHApp()->hMainWnd); + return TRUE; + case IDC_TEXT_CONTROL: + switch (HIWORD(wParam)) + { + case EN_SETFOCUS: + HideCaret((HWND)lParam); + return TRUE; + } + } + break; + + case WM_DESTROY: + if( data ) { + if( data->window_text ) free(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; + TCHAR wbuf[BUFSZ]; + size_t text_size; + + if( !data->window_text ) { + text_size = strlen(msg_data->text) + 4; + data->window_text = (TCHAR*)malloc(text_size*sizeof(data->window_text[0])); + ZeroMemory(data->window_text, text_size*sizeof(data->window_text[0])); + } else { + text_size = _tcslen(data->window_text) + strlen(msg_data->text) + 4; + data->window_text = (TCHAR*)realloc(data->window_text, text_size*sizeof(data->window_text[0])); + } + if( !data->window_text ) break; + + _tcscat(data->window_text, NH_A2W(msg_data->text, wbuf, BUFSZ)); + _tcscat(data->window_text, TEXT("\r\n")); + break; + } + } + } + + void LayoutText(HWND hWnd) + { + HWND btn_ok; + HWND text; + RECT clrt, rt; + POINT pt_elem, pt_ok; + SIZE sz_elem, sz_ok; + + text = GetDlgItem(hWnd, IDC_TEXT_CONTROL); + btn_ok = GetDlgItem(hWnd, IDOK); + + /* get window coordinates */ + GetClientRect(hWnd, &clrt ); + + /* set window placements */ + GetWindowRect(btn_ok, &rt); + sz_ok.cx = clrt.right - clrt.left; + sz_ok.cy = rt.bottom-rt.top; + pt_ok.x = clrt.left; + pt_ok.y = clrt.bottom - sz_ok.cy; + + 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 ); + MoveWindow(btn_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE ); + } + + /* Edit box hook */ + LRESULT CALLBACK NHEditHookWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + switch(message) { + + case WM_KEYDOWN: + switch (wParam) + { + /* close on space in Windows mode + page down on space in NetHack mode */ + case VK_SPACE: + { + SCROLLINFO si; + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE; + GetScrollInfo(hWnd, SB_VERT, &si); + /* If nethackmode and not at the end of the list */ + if (GetNHApp()->regNetHackMode && + (si.nPos + (int)si.nPage) <= (si.nMax - si.nMin)) + SendMessage(hWnd, EM_SCROLL, SB_PAGEDOWN, 0); + else + PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0); + return 0; + } + case VK_NEXT: + SendMessage(hWnd, EM_SCROLL, SB_PAGEDOWN, 0); + return 0; + case VK_PRIOR: + SendMessage(hWnd, EM_SCROLL, SB_PAGEUP, 0); + return 0; + case VK_UP: + SendMessage(hWnd, EM_SCROLL, SB_LINEUP, 0); + return 0; + case VK_DOWN: + SendMessage(hWnd, EM_SCROLL, SB_LINEDOWN, 0); + return 0; + + } + break; + } + + if( editControlWndProc ) + return CallWindowProc(editControlWndProc, hWnd, message, wParam, lParam); + else + return 0; + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mhtext.h Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,14 ---- + /* 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); + void mswin_display_text_window (HWND hwnd); + + #endif /* MSWINTextWindow_h */ *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mnsel.uu Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,9 ---- + begin 600 mnsel.bmp + M0DWV`````````'8````H````$````!`````!``0``````(`````````````` + M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(`` + M``#_``#_````__\`_P```/\`_P#__P``____```````````````````````` + M________``#_"/____\``/@`C____P``\`@(____``#P#X"/__\``/`/^`C_ + M_P``\`__@(__``#XC__X"/\``/____^`CP``______@/``#_______\``/__ + 5_____P`````````````````````` + ` + end *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mnselcnt.uu Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,9 ---- + begin 600 mnselcnt.bmp + M0DWV`````````'8````H````$````!`````!``0``````(`````````````` + M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(`` + M``#_``#_````__\`_P```/\`_P#__P``____```````````````````````` + M________``#_______\``/_P__\/_P``_P````#_``#_\/__#_\``/_P__\/ + M_P``__#__P__``#_\/__#_\``/\`````_P``__#__P__``#_______\``/__ + 5_____P`````````````````````` + ` + end *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mnunsel.uu Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,9 ---- + begin 600 mnunsel.bmp + M0DWV`````````'8````H````$````!`````!``0``````(`````````````` + M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(`` + M``#_``#_````__\`_P```/\`_P#__P``____```````````````````````` + M________``#_______\``/_______P``________``#_______\``/______ + M_P``________``#_______\``/_______P``________``#_______\``/__ + 5_____P`````````````````````` + ` + end *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/mswproc.c Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,2017 ---- + /* 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 "mhsplash.h" + #include "mhmsg.h" + #include "mhinput.h" + #include "mhaskyn.h" + #include "mhdlg.h" + #include "mhrip.h" + #include "mhmain.h" + #include "mhfont.h" + + #define LLEN 128 + + extern const char *killed_by_prefix[]; + + #ifdef _DEBUG + extern void logDebug(const char *fmt, ...); + #else + void logDebug(const char *fmt, ...) { } + #endif + + static void mswin_main_loop(void); + static BOOL initMapTiles(void); + static void mswin_color_from_string(char *colorstring, HBRUSH* brushptr, COLORREF *colorptr); + static void prompt_for_player_selection(void); + + #define TOTAL_BRUSHES 10 + HBRUSH brush_table[TOTAL_BRUSHES]; + int max_brush = 0; + + HBRUSH menu_bg_brush = NULL; + HBRUSH menu_fg_brush = NULL; + HBRUSH text_bg_brush = NULL; + HBRUSH text_fg_brush = NULL; + HBRUSH status_bg_brush = NULL; + HBRUSH status_fg_brush = NULL; + HBRUSH message_bg_brush = NULL; + HBRUSH message_fg_brush = NULL; + + COLORREF menu_bg_color = RGB(0, 0, 0); + COLORREF menu_fg_color = RGB(0xFF, 0xFF, 0xFF); + COLORREF text_bg_color = RGB(0, 0, 0); + COLORREF text_fg_color = RGB(0xFF, 0xFF, 0xFF); + COLORREF status_bg_color = RGB(0, 0, 0); + COLORREF status_fg_color = RGB(0xFF, 0xFF, 0xFF); + COLORREF message_bg_color = RGB(0, 0, 0); + COLORREF message_fg_color = RGB(0xFF, 0xFF, 0xFF); + + /* 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_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|WC_SPLASH_SCREEN, + mswin_init_nhwindows, + 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, + 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, + }; + + + /* + 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) + { + logDebug("mswin_init_nhwindows()\n"); + + #ifdef _DEBUG + { + /* truncate trace file */ + FILE *dfp = fopen("nhtrace.log", "w"); + fclose(dfp); + } + #endif + mswin_nh_input_init(); + + /* set it to WIN_ERR so we can detect attempts to + use this ID before it is inialized */ + WIN_MAP = WIN_ERR; + + /* Read Windows settings from the reqistry */ + mswin_read_reg(); + /* Set menu check mark for interface mode */ + mswin_menu_check_intf_mode(); + + /* check default values */ + if( iflags.wc_fontsiz_statusNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_status = NHFONT_DEFAULT_SIZE; + + if( iflags.wc_fontsiz_messageNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_message = NHFONT_DEFAULT_SIZE; + + if( iflags.wc_fontsiz_textNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_text = NHFONT_DEFAULT_SIZE; + + if( iflags.wc_fontsiz_menuNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_menu = NHFONT_DEFAULT_SIZE; + + if( iflags.wc_align_message==0 ) iflags.wc_align_message = ALIGN_TOP; + if( iflags.wc_align_status==0 ) iflags.wc_align_status = ALIGN_BOTTOM; + 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 = 4; + + /* 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 + */ + flags.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); + + /* 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 + ); + + mswin_color_from_string(iflags.wc_foregrnd_menu, &menu_fg_brush, &menu_fg_color); + mswin_color_from_string(iflags.wc_foregrnd_message, &message_fg_brush, &message_fg_color); + mswin_color_from_string(iflags.wc_foregrnd_status, &status_fg_brush, &status_fg_color); + mswin_color_from_string(iflags.wc_foregrnd_text, &text_fg_brush, &text_fg_color); + mswin_color_from_string(iflags.wc_backgrnd_menu, &menu_bg_brush, &menu_bg_color); + mswin_color_from_string(iflags.wc_backgrnd_message, &message_bg_brush, &message_bg_color); + mswin_color_from_string(iflags.wc_backgrnd_status, &status_bg_brush, &status_bg_color); + mswin_color_from_string(iflags.wc_backgrnd_text, &text_bg_brush, &text_bg_color); + + if (iflags.wc_splash_screen) mswin_display_splash_window(); + 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) + { + int nRole; + + logDebug("mswin_player_selection()\n"); + + if (iflags.wc_player_selection == VIA_DIALOG) { + /* 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(); + } + } + + 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(); + } + } + + 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; + DWORD box_result; + + 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, prompt, TEXT("NetHack for Windows"), + MB_YESNOCANCEL | MB_DEFBUTTON1); + 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(); + } + } 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()+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(); + while (max_brush) + DeleteObject(brush_table[--max_brush]); + } + + /* 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; iwindowlist[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)) + { + #ifdef REINCARNATION + 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); + } + #endif + + 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 && widwindowlist[wid].win; + } else { + return NULL; + } + } + + winid mswin_winid_from_handle(HWND hWnd) + { + winid i = 0; + + for (i=1; iwindowlist[i].win == hWnd) + return i; + return -1; + } + + winid mswin_winid_from_type(int type) + { + winid i = 0; + + for (i=1; iwindowlist[i].type == type) + return i; + return -1; + } + + void mswin_window_mark_dead(winid wid) + { + if( wid>=0 && widwindowlist[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 (GetNHApp()->windowlist[wid].type == NHW_TEXT) { + /* this type takes care of themself */ + 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 ); + } + } + else + { + // build text to display later in message box + GetNHApp()->saved_text = realloc(GetNHApp()->saved_text, strlen(text) + + strlen(GetNHApp()->saved_text) + 1); + strcat(GetNHApp()->saved_text, text); + } + } + + /* 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 { + HWND hwnd; + char line[LLEN]; + + hwnd = mswin_init_text_window(); + + while (dlb_fgets(line, LLEN, f)) { + MSNHMsgPutstr data; + size_t len; + + len = strlen(line); + if( line[len-1]=='\n' ) line[len-1]='\x0'; + data.attr = 0; + data.text = line; + SendMessage( hwnd, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_PUTSTR, (LPARAM)&data ); + } + (void) dlb_fclose(f); + + mswin_display_text_window(hwnd); + } + } + + /* 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 alises), it loses. + The menu commands and aliases take care not to interfere + with the default object class symbols. + -- If you want this choice to be preselected when the + menu is displayed, set preselected to TRUE. + */ + void 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) + -- 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) + { + logDebug("mswin_print_glyph(%d, %d, %d, %d)\n", wid, x, y, glyph); + + 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"); + 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 (WIN_MESSAGE == WIN_ERR && choices == ynchars) { + char *text = realloc(strdup(GetNHApp()->saved_text), strlen(question) + + strlen(GetNHApp()->saved_text) + 1); + DWORD box_result; + strcat(text, question); + box_result = MessageBox(NULL, + NH_W2A(text, message, sizeof(message)), + TEXT("NetHack for Windows"), + MB_YESNOCANCEL | + ((def == 'y') ? MB_DEFBUTTON1 : + (def == 'n') ? MB_DEFBUTTON2 : MB_DEFBUTTON3)); + free(text); + GetNHApp()->saved_text = strdup(""); + return box_result == IDYES ? 'y' : box_result == IDNO ? 'n' : '\033'; + } + + if (choices) { + char *cb, choicebuf[QBUFSZ]; + Strcpy(choicebuf, choices); + if ((cb = index(choicebuf, '\033')) != 0) { + /* anything beyond is hidden */ + *cb = '\0'; + } + sprintf(message, "%s [%s] ", question, choicebuf); + if (def) sprintf(eos(message), "(%c) ", def); + /* 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); + Strcat(message, " "); + } + + 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); + } + + 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) + -- The tombstone code. If you want the traditional code use + genl_outrip for the value and check the #if in rip.c. + */ + #define STONE_LINE_LEN 16 + void mswin_outrip(winid wid, int how) + { + char buf[BUFSZ]; + + logDebug("mswin_outrip(%d)\n", wid, how); + 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; + } + + /* Put name on stone */ + Sprintf(buf, "%s", plname); + buf[STONE_LINE_LEN] = 0; + putstr(wid, 0, buf); + + /* Put $ on stone */ + #ifndef GOLDOBJ + Sprintf(buf, "%ld Au", u.ugold); + #else + Sprintf(buf, "%ld Au", done_money); + #endif + buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */ + putstr(wid, 0, buf); + + /* Put together death description */ + switch (killer_format) { + default: impossible("bad killer format?"); + case KILLED_BY_AN: + Strcpy(buf, killed_by_prefix[how]); + Strcat(buf, an(killer)); + break; + case KILLED_BY: + Strcpy(buf, killed_by_prefix[how]); + Strcat(buf, killer); + break; + case NO_KILLER_PREFIX: + Strcpy(buf, killer); + break; + } + + /* Put death type on stone */ + putstr(wid, 0, buf); + + /* Put year on stone */ + Sprintf(buf, "%4d", getyear()); + putstr(wid, 0, buf); + mswin_finish_rip_text(wid); + } + + /* 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_menuNHFONT_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_statusNHFONT_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_messageNHFONT_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_textNHFONT_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; + } + + } + + + void mswin_main_loop() + { + MSG msg; + + while( !mswin_have_input() && + GetMessage(&msg, NULL, 0, 0)!=0 ) { + if (GetNHApp()->regNetHackMode || + !TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + + /* clean up and quit */ + void bail(const char *mesg) + { + clearlocks(); + mswin_exit_nhwindows(mesg); + 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 = LoadImage( + GetNHApp()->hApp, + NH_A2W(iflags.wc_tile_file, wbuf, MAX_PATH), + IMAGE_BITMAP, + 0, + 0, + LR_LOADFROMFILE | LR_DEFAULTSIZE + ); + 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_numbmpMapTiles!=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; + } + + #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 + + + /* Reading and writing settings from the registry. */ + #define CATEGORYKEY "Software" + #define COMPANYKEY "NetHack" + #define PRODUCTKEY "NetHack 3.4.0" + #define SETTINGSKEY "Settings" + + /* #define all the subkeys here */ + #define INTFKEY "Interface" + + void + mswin_read_reg() + { + HKEY key; + DWORD size; + char keystring[MAX_PATH]; + + sprintf(keystring, "%s\\%s\\%s\\%s", + CATEGORYKEY, COMPANYKEY, PRODUCTKEY, SETTINGSKEY); + + /* Set the defaults here. The very first time the app is started, nothing is + read from the registry, so these defaults apply. */ + GetNHApp()->saveRegistrySettings = 1; /* Normally, we always save */ + GetNHApp()->regNetHackMode = 0; + + if (RegOpenKeyEx(HKEY_CURRENT_USER, keystring, 0, KEY_READ, &key) + != ERROR_SUCCESS) + return; + + /* Read the keys here. */ + size = sizeof(DWORD); + RegQueryValueEx(key, INTFKEY, 0, NULL, + (unsigned char *)(&(GetNHApp()->regNetHackMode)), &size); + + RegCloseKey(key); + } + + void + mswin_write_reg() + { + HKEY key; + DWORD disposition; + + if (GetNHApp()->saveRegistrySettings) + { + char keystring[MAX_PATH]; + + sprintf(keystring, "%s\\%s\\%s\\%s", + CATEGORYKEY, COMPANYKEY, PRODUCTKEY, SETTINGSKEY); + + if (RegOpenKeyEx(HKEY_CURRENT_USER, keystring, 0, KEY_WRITE, &key) != ERROR_SUCCESS) + { + RegCreateKeyEx(HKEY_CURRENT_USER, keystring, 0, "", + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition); + } + + /* Write the keys here */ + RegSetValueEx(key, INTFKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regNetHackMode)), sizeof(DWORD)); + + RegCloseKey(key); + } + } + + void + mswin_destroy_reg() + { + char keystring[MAX_PATH]; + HKEY key; + DWORD nrsubkeys; + + /* Delete keys one by one, as NT does not delete trees */ + sprintf(keystring, "%s\\%s\\%s\\%s", + CATEGORYKEY, COMPANYKEY, PRODUCTKEY, SETTINGSKEY); + RegDeleteKey(HKEY_CURRENT_USER, keystring); + sprintf(keystring, "%s\\%s\\%s", + CATEGORYKEY, COMPANYKEY, PRODUCTKEY); + RegDeleteKey(HKEY_CURRENT_USER, keystring); + /* The company key will also contain information about newer versions + of nethack (e.g. a subkey called NetHack 4.0), so only delete that + if it's empty now. */ + sprintf(keystring, "%s\\%s", CATEGORYKEY, COMPANYKEY); + /* If we cannot open it, we probably cannot delete it either... Just + go on and see what happens. */ + RegOpenKeyEx(HKEY_CURRENT_USER, keystring, 0, KEY_READ, &key); + nrsubkeys = 0; + RegQueryInfoKey(key, NULL, NULL, NULL, &nrsubkeys, NULL, NULL, NULL, + NULL, NULL, NULL, NULL); + RegCloseKey(key); + if (nrsubkeys == 0) + RegDeleteKey(HKEY_CURRENT_USER, keystring); + + /* Prevent saving on exit */ + GetNHApp()->saveRegistrySettings = 0; + } + + 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 }, + }; + + 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"; + + 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); + brush_table[max_brush++] = *brushptr; + } *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/nethack.dsw Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,215 ---- + Microsoft Developer Studio Workspace File, Format Version 6.00 + # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + + ############################################################################### + + Project: "dgncomp"=.\build\dgncomp.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name dgnstuff + End Project Dependency + }}} + + ############################################################################### + + Project: "dgnstuff"=.\build\dgnstuff.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name makedefs + End Project Dependency + }}} + + ############################################################################### + + Project: "dlb_main"=.\build\dlb_main.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name dgncomp + End Project Dependency + Begin Project Dependency + Project_Dep_Name levcomp + End Project Dependency + Begin Project Dependency + Project_Dep_Name makedefs + End Project Dependency + }}} + + ############################################################################### + + Project: "levcomp"=.\build\levcomp.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name levstuff + End Project Dependency + }}} + + ############################################################################### + + Project: "levstuff"=.\build\levstuff.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name makedefs + End Project Dependency + }}} + + ############################################################################### + + Project: "makedefs"=.\build\makedefs.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + }}} + + ############################################################################### + + Project: "nethackw"=.\build\nethackw.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name dgncomp + End Project Dependency + Begin Project Dependency + Project_Dep_Name dlb_main + End Project Dependency + Begin Project Dependency + Project_Dep_Name levcomp + End Project Dependency + Begin Project Dependency + Project_Dep_Name makedefs + End Project Dependency + Begin Project Dependency + Project_Dep_Name recover + End Project Dependency + Begin Project Dependency + Project_Dep_Name tilemap + End Project Dependency + Begin Project Dependency + Project_Dep_Name tiles + End Project Dependency + Begin Project Dependency + Project_Dep_Name uudecode + End Project Dependency + }}} + + ############################################################################### + + Project: "recover"=.\build\recover.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name makedefs + End Project Dependency + Begin Project Dependency + Project_Dep_Name dlb_main + End Project Dependency + }}} + + ############################################################################### + + Project: "tile2bmp"=.\build\tile2bmp.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + }}} + + ############################################################################### + + Project: "tilemap"=.\build\tilemap.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + }}} + + ############################################################################### + + Project: "tiles"=.\build\tiles.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + Begin Project Dependency + Project_Dep_Name tile2bmp + End Project Dependency + }}} + + ############################################################################### + + Project: "uudecode"=.\build\uudecode.dsp - Package Owner=<4> + + Package=<5> + {{{ + }}} + + Package=<4> + {{{ + }}} + + ############################################################################### + + Global: + + Package=<5> + {{{ + }}} + + Package=<3> + {{{ + }}} + + ############################################################################### + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/nethackw.dsp Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,1108 ---- + # Microsoft Developer Studio Project File - Name="nethackw" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Application" 0x0101 + + CFG=nethackw - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "nethackw.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "nethackw.mak" CFG="nethackw - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "nethackw - Win32 Release" (based on "Win32 (x86) Application") + !MESSAGE "nethackw - Win32 Debug" (based on "Win32 (x86) Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + MTL=midl.exe + RSC=rc.exe + + !IF "$(CFG)" == "nethackw - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /Og /Oy /Ob1 /Gs /Gf /Gy /Oi- /Ot /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c + # ADD CPP /nologo /W3 /GX /Og /Oy /Ob1 /Gs /Gf /Gy /Oi- /Ot /I "..\win\win32" /I "..\include" /I "..\sys\winnt" /I "..\sys\share" /I "..\win\share" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX /Yc /Yu + # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 + # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 + # ADD BASE RSC /l 0x409 /d "NDEBUG" + # ADD RSC /l 0x409 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib /nologo /subsystem:windows /machine:I386 + # Begin Special Build Tool + OutDir=.\Release + SOURCE="$(InputPath)" + PostBuild_Desc=Install exe + PostBuild_Cmds=copy $(OutDir)\nethackw.exe ..\binary \ + copy ..\dat\nhdat ..\binary \ + copy ..\dat\license ..\binary \ + if exist tiles.bmp copy tiles.bmp ..\binary \ + if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt \ + if exist ..\doc\nethack.txt copy ..\doc\nethack.txt ..\binary\NetHack.txt \ + if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt \ + copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh + # End Special Build Tool + + !ELSEIF "$(CFG)" == "nethackw - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\win\win32" /I "..\include" /I "..\sys\winnt" /I "..\sys\share" /I "..\win\share" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # SUBTRACT CPP /YX /Yc /Yu + # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 + # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 + # ADD BASE RSC /l 0x409 /d "_DEBUG" + # ADD RSC /l 0x409 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + # Begin Special Build Tool + OutDir=.\Debug + SOURCE="$(InputPath)" + PostBuild_Desc=Install exe + PostBuild_Cmds=if NOT exist ..\binary\*.* mkdir ..\binary \ + copy $(OutDir)\nethackw.exe ..\binary \ + copy ..\dat\nhdat ..\binary \ + copy ..\dat\license ..\binary \ + if exist tiles.bmp copy tiles.bmp ..\binary \ + if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt \ + if exist ..\doc\nethack.txt copy ..\doc\nethack.txt ..\binary\NetHack.txt \ + if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt \ + copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "nethackw - Win32 Release" + # Name "nethackw - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\src\allmain.c + # End Source File + # Begin Source File + + SOURCE=..\src\alloc.c + # End Source File + # Begin Source File + + SOURCE=..\src\apply.c + # End Source File + # Begin Source File + + SOURCE=..\src\artifact.c + # End Source File + # Begin Source File + + SOURCE=..\src\attrib.c + # End Source File + # Begin Source File + + SOURCE=..\src\ball.c + # End Source File + # Begin Source File + + SOURCE=..\src\bones.c + # End Source File + # Begin Source File + + SOURCE=..\src\botl.c + # End Source File + # Begin Source File + + SOURCE=..\src\cmd.c + # End Source File + # Begin Source File + + SOURCE=..\src\dbridge.c + # End Source File + # Begin Source File + + SOURCE=..\src\decl.c + # End Source File + # Begin Source File + + SOURCE=..\src\detect.c + # End Source File + # Begin Source File + + SOURCE=..\src\dig.c + # End Source File + # Begin Source File + + SOURCE=..\src\display.c + # End Source File + # Begin Source File + + SOURCE=..\src\dlb.c + # End Source File + # Begin Source File + + SOURCE=..\src\do.c + # End Source File + # Begin Source File + + SOURCE=..\src\do_name.c + # End Source File + # Begin Source File + + SOURCE=..\src\do_wear.c + # End Source File + # Begin Source File + + SOURCE=..\src\dog.c + # End Source File + # Begin Source File + + SOURCE=..\src\dogmove.c + # End Source File + # Begin Source File + + SOURCE=..\src\dokick.c + # End Source File + # Begin Source File + + SOURCE=..\src\dothrow.c + # End Source File + # Begin Source File + + SOURCE=..\src\drawing.c + # End Source File + # Begin Source File + + SOURCE=..\src\dungeon.c + # End Source File + # Begin Source File + + SOURCE=..\src\eat.c + # End Source File + # Begin Source File + + SOURCE=..\src\end.c + # End Source File + # Begin Source File + + SOURCE=..\src\engrave.c + # End Source File + # Begin Source File + + SOURCE=..\src\exper.c + # End Source File + # Begin Source File + + SOURCE=..\src\explode.c + # End Source File + # Begin Source File + + SOURCE=..\src\extralev.c + # End Source File + # Begin Source File + + SOURCE=..\src\files.c + # End Source File + # Begin Source File + + SOURCE=..\src\fountain.c + # End Source File + # Begin Source File + + SOURCE=..\win\tty\getline.c + # End Source File + # Begin Source File + + SOURCE=..\src\hack.c + # End Source File + # Begin Source File + + SOURCE=..\src\hacklib.c + # End Source File + # Begin Source File + + SOURCE=..\src\invent.c + # End Source File + # Begin Source File + + SOURCE=..\src\light.c + # End Source File + # Begin Source File + + SOURCE=..\src\lock.c + # End Source File + # Begin Source File + + SOURCE=..\src\mail.c + # End Source File + # Begin Source File + + SOURCE=..\src\makemon.c + # End Source File + # Begin Source File + + SOURCE=..\src\mapglyph.c + # End Source File + # Begin Source File + + SOURCE=..\src\mcastu.c + # End Source File + # Begin Source File + + SOURCE=..\src\mhitm.c + # End Source File + # Begin Source File + + SOURCE=..\src\mhitu.c + # End Source File + # Begin Source File + + SOURCE=..\src\minion.c + # End Source File + # Begin Source File + + SOURCE=..\src\mklev.c + # End Source File + # Begin Source File + + SOURCE=..\src\mkmap.c + # End Source File + # Begin Source File + + SOURCE=..\src\mkmaze.c + # End Source File + # Begin Source File + + SOURCE=..\src\mkobj.c + # End Source File + # Begin Source File + + SOURCE=..\src\mkroom.c + # End Source File + # Begin Source File + + SOURCE=..\src\mon.c + # End Source File + # Begin Source File + + SOURCE=..\src\mondata.c + # End Source File + # Begin Source File + + SOURCE=..\src\monmove.c + # End Source File + # Begin Source File + + SOURCE=..\src\monst.c + # End Source File + # Begin Source File + + SOURCE=..\src\monstr.c + # End Source File + # Begin Source File + + SOURCE=..\src\mplayer.c + # End Source File + # Begin Source File + + SOURCE=..\src\mthrowu.c + # End Source File + # Begin Source File + + SOURCE=..\src\muse.c + # End Source File + # Begin Source File + + SOURCE=..\src\music.c + # End Source File + # Begin Source File + + SOURCE=..\src\o_init.c + # End Source File + # Begin Source File + + SOURCE=..\src\objects.c + # End Source File + # Begin Source File + + SOURCE=..\src\objnam.c + # End Source File + # Begin Source File + + SOURCE=..\src\options.c + # End Source File + # Begin Source File + + SOURCE=..\src\pager.c + # End Source File + # Begin Source File + + SOURCE=..\sys\share\pcmain.c + # End Source File + # Begin Source File + + SOURCE=..\sys\share\pcsys.c + # End Source File + # Begin Source File + + SOURCE=..\sys\share\pcunix.c + # End Source File + # Begin Source File + + SOURCE=..\src\pickup.c + # End Source File + # Begin Source File + + SOURCE=..\src\pline.c + # End Source File + # Begin Source File + + SOURCE=..\src\polyself.c + # End Source File + # Begin Source File + + SOURCE=..\src\potion.c + # End Source File + # Begin Source File + + SOURCE=..\src\pray.c + # End Source File + # Begin Source File + + SOURCE=..\src\priest.c + # End Source File + # Begin Source File + + SOURCE=..\src\quest.c + # End Source File + # Begin Source File + + SOURCE=..\src\questpgr.c + # End Source File + # Begin Source File + + SOURCE=..\sys\share\random.c + # End Source File + # Begin Source File + + SOURCE=..\src\read.c + # End Source File + # Begin Source File + + SOURCE=..\src\rect.c + # End Source File + # Begin Source File + + SOURCE=..\src\region.c + # End Source File + # Begin Source File + + SOURCE=..\src\restore.c + # End Source File + # Begin Source File + + SOURCE=..\src\rip.c + # End Source File + # Begin Source File + + SOURCE=..\src\rnd.c + # End Source File + # Begin Source File + + SOURCE=..\src\role.c + # End Source File + # Begin Source File + + SOURCE=..\src\rumors.c + # End Source File + # Begin Source File + + SOURCE=..\src\save.c + # End Source File + # Begin Source File + + SOURCE=..\src\shk.c + # End Source File + # Begin Source File + + SOURCE=..\src\shknam.c + # End Source File + # Begin Source File + + SOURCE=..\src\sit.c + # End Source File + # Begin Source File + + SOURCE=..\src\sounds.c + # End Source File + # Begin Source File + + SOURCE=..\src\sp_lev.c + # End Source File + # Begin Source File + + SOURCE=..\src\spell.c + # End Source File + # Begin Source File + + SOURCE=..\src\steal.c + # End Source File + # Begin Source File + + SOURCE=..\src\steed.c + # End Source File + # Begin Source File + + SOURCE=..\src\teleport.c + # End Source File + # Begin Source File + + SOURCE=..\src\tile.c + # End Source File + # Begin Source File + + SOURCE=..\src\timeout.c + # End Source File + # Begin Source File + + SOURCE=..\src\topten.c + # End Source File + # Begin Source File + + SOURCE=..\src\track.c + # End Source File + # Begin Source File + + SOURCE=..\src\trap.c + # End Source File + # Begin Source File + + SOURCE=..\src\u_init.c + # End Source File + # Begin Source File + + SOURCE=..\src\uhitm.c + # End Source File + # Begin Source File + + SOURCE=..\src\vault.c + # End Source File + # Begin Source File + + SOURCE=..\src\version.c + # End Source File + # Begin Source File + + SOURCE=..\src\vision.c + # End Source File + # Begin Source File + + SOURCE=..\src\weapon.c + # End Source File + # Begin Source File + + SOURCE=..\src\were.c + # End Source File + # Begin Source File + + SOURCE=..\src\wield.c + # End Source File + # Begin Source File + + SOURCE=..\src\windows.c + # End Source File + # Begin Source File + + SOURCE=..\sys\winnt\winnt.c + # End Source File + # Begin Source File + + SOURCE=..\win\tty\wintty.c + # End Source File + # Begin Source File + + SOURCE=..\src\wizard.c + # End Source File + # Begin Source File + + SOURCE=..\src\worm.c + # End Source File + # Begin Source File + + SOURCE=..\src\worn.c + # End Source File + # Begin Source File + + SOURCE=..\src\write.c + # End Source File + # Begin Source File + + SOURCE=..\src\zap.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\align.h + # End Source File + # Begin Source File + + SOURCE=..\include\amiconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\artifact.h + # End Source File + # Begin Source File + + SOURCE=..\include\artilist.h + # End Source File + # Begin Source File + + SOURCE=..\include\attrib.h + # End Source File + # Begin Source File + + SOURCE=..\include\beconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\bitmfile.h + # End Source File + # Begin Source File + + SOURCE=..\include\color.h + # End Source File + # Begin Source File + + SOURCE=..\include\config.h + # End Source File + # Begin Source File + + SOURCE=..\include\config1.h + # End Source File + # Begin Source File + + SOURCE=..\include\coord.h + # End Source File + # Begin Source File + + SOURCE=..\include\decl.h + # End Source File + # Begin Source File + + SOURCE=..\include\def_os2.h + # End Source File + # Begin Source File + + SOURCE=..\include\dgn_file.h + # End Source File + # Begin Source File + + SOURCE=..\include\display.h + # End Source File + # Begin Source File + + SOURCE=..\include\dlb.h + # End Source File + # Begin Source File + + SOURCE=..\include\dungeon.h + # End Source File + # Begin Source File + + SOURCE=..\include\edog.h + # End Source File + # Begin Source File + + SOURCE=..\include\emin.h + # End Source File + # Begin Source File + + SOURCE=..\include\engrave.h + # End Source File + # Begin Source File + + SOURCE=..\include\epri.h + # End Source File + # Begin Source File + + SOURCE=..\include\eshk.h + # End Source File + # Begin Source File + + SOURCE=..\include\extern.h + # End Source File + # Begin Source File + + SOURCE=..\include\flag.h + # End Source File + # Begin Source File + + SOURCE=..\include\func_tab.h + # End Source File + # Begin Source File + + SOURCE=..\include\gem_rsc.h + # End Source File + # Begin Source File + + SOURCE=..\include\global.h + # End Source File + # Begin Source File + + SOURCE=..\include\hack.h + # End Source File + # Begin Source File + + SOURCE=..\include\lev.h + # End Source File + # Begin Source File + + SOURCE=..\include\load_img.h + # End Source File + # Begin Source File + + SOURCE=..\include\macconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\macpopup.h + # End Source File + # Begin Source File + + SOURCE=..\include\mactty.h + # End Source File + # Begin Source File + + SOURCE=..\include\macwin.h + # End Source File + # Begin Source File + + SOURCE=..\include\mail.h + # End Source File + # Begin Source File + + SOURCE=..\include\mfndpos.h + # End Source File + # Begin Source File + + SOURCE=..\include\micro.h + # End Source File + # Begin Source File + + SOURCE=..\include\mkroom.h + # End Source File + # Begin Source File + + SOURCE=..\include\monattk.h + # End Source File + # Begin Source File + + SOURCE=..\include\mondata.h + # End Source File + # Begin Source File + + SOURCE=..\include\monflag.h + # End Source File + # Begin Source File + + SOURCE=..\include\monst.h + # End Source File + # Begin Source File + + SOURCE=..\include\monsym.h + # End Source File + # Begin Source File + + SOURCE=..\include\mttypriv.h + # End Source File + # Begin Source File + + SOURCE=..\include\nhlan.h + # End Source File + # Begin Source File + + SOURCE=..\include\ntconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\obj.h + # End Source File + # Begin Source File + + SOURCE=..\include\objclass.h + # End Source File + # Begin Source File + + SOURCE=..\include\os2conf.h + # End Source File + # Begin Source File + + SOURCE=..\include\patchlevel.h + # End Source File + # Begin Source File + + SOURCE=..\include\pcconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\permonst.h + # End Source File + # Begin Source File + + SOURCE=..\include\prop.h + # End Source File + # Begin Source File + + SOURCE=..\include\qt_clust.h + # End Source File + # Begin Source File + + SOURCE=..\include\qt_kde0.h + # End Source File + # Begin Source File + + SOURCE=..\include\qt_win.h + # End Source File + # Begin Source File + + SOURCE=..\include\qt_xpms.h + # End Source File + # Begin Source File + + SOURCE=..\include\qtext.h + # End Source File + # Begin Source File + + SOURCE=..\include\quest.h + # End Source File + # Begin Source File + + SOURCE=..\include\rect.h + # End Source File + # Begin Source File + + SOURCE=..\include\region.h + # End Source File + # Begin Source File + + SOURCE=..\include\rm.h + # End Source File + # Begin Source File + + SOURCE=..\include\skills.h + # End Source File + # Begin Source File + + SOURCE=..\include\sp_lev.h + # End Source File + # Begin Source File + + SOURCE=..\include\spell.h + # End Source File + # Begin Source File + + SOURCE=..\include\system.h + # End Source File + # Begin Source File + + SOURCE=..\include\tcap.h + # End Source File + # Begin Source File + + SOURCE=..\include\tile2x11.h + # End Source File + # Begin Source File + + SOURCE=..\include\timeout.h + # End Source File + # Begin Source File + + SOURCE=..\include\tosconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\tradstdc.h + # End Source File + # Begin Source File + + SOURCE=..\include\trampoli.h + # End Source File + # Begin Source File + + SOURCE=..\include\trap.h + # End Source File + # Begin Source File + + SOURCE=..\include\unixconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\vault.h + # End Source File + # Begin Source File + + SOURCE=..\include\vision.h + # End Source File + # Begin Source File + + SOURCE=..\include\vmsconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\winami.h + # End Source File + # Begin Source File + + SOURCE=..\include\wingem.h + # End Source File + # Begin Source File + + SOURCE=..\include\winGnome.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\winhack.h + # End Source File + # Begin Source File + + SOURCE=..\include\winprocs.h + # End Source File + # Begin Source File + + SOURCE=..\include\wintty.h + # End Source File + # Begin Source File + + SOURCE=..\include\wintype.h + # End Source File + # Begin Source File + + SOURCE=..\include\winX.h + # End Source File + # Begin Source File + + SOURCE=..\include\xwindow.h + # End Source File + # Begin Source File + + SOURCE=..\include\xwindowp.h + # End Source File + # Begin Source File + + SOURCE=..\include\you.h + # End Source File + # Begin Source File + + SOURCE=..\include\youprop.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # Begin Source File + + SOURCE=..\win\win32\bitmap1.bmp + # End Source File + # Begin Source File + + SOURCE=..\win\win32\bitmap2.bmp + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mnsel.bmp + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mnunsel.bmp + # End Source File + # Begin Source File + + SOURCE=..\win\win32\NETHACK.ICO + # End Source File + # Begin Source File + + SOURCE=..\win\win32\small.ico + # End Source File + # Begin Source File + + SOURCE=..\win\win32\tiles.bmp + # End Source File + # Begin Source File + + SOURCE=..\win\win32\winhack.ico + # End Source File + # End Group + # Begin Group "wnd" + + # PROP Default_Filter "" + # Begin Source File + + SOURCE=..\win\win32\mhaskyn.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhaskyn.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhdlg.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhdlg.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhfont.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhfont.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhinput.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhinput.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmain.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmain.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmap.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmap.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmenu.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmenu.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmsg.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmsgwnd.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhmsgwnd.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhsplash.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhrip.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhsplash.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhrip.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhstatus.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhstatus.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhtext.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mhtext.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\mswproc.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\resource.h + # End Source File + # Begin Source File + + SOURCE=..\win\win32\winhack.c + # End Source File + # Begin Source File + + SOURCE=..\win\win32\winhack.rc + # End Source File + # Begin Source File + + SOURCE=..\win\win32\winMS.h + # End Source File + # End Group + # Begin Source File + + SOURCE=..\win\win32\ReadMe.txt + # End Source File + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/petmark.uu Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,9 ---- + begin 600 petmark.bmp + M0DWV`````````'8````H````$````!`````!``0``````(`````````````` + M````````````;&Q'````_P```````("``(````"``(``@(```,#`P`#`W,`` + M\,JF``0$!``("`@`#`P,`!$1$0`6%A8`'!P<```````````````````````` + M```````````````````````````````````````````````````````````` + M``````````````````````````````````````````````````````$````` + 5````$1````````$1$0```````!`0 + ` + end *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/recover.dsp Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,146 ---- + # Microsoft Developer Studio Project File - Name="recover" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=recover - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "recover.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "recover.mak" CFG="recover - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "recover - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "recover - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "recover - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sys\winnt" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "NDEBUG" + # ADD RSC /l 0x1009 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # Begin Special Build Tool + OutDir=.\Release + SOURCE="$(InputPath)" + PostBuild_Cmds=copy $(OutDir)\recover.exe ..\binary + # End Special Build Tool + + !ELSEIF "$(CFG)" == "recover - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\include" /I "..\sys\winnt" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "_DEBUG" + # ADD RSC /l 0x1009 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # Begin Special Build Tool + OutDir=.\Debug + SOURCE="$(InputPath)" + PostBuild_Desc=install exe + PostBuild_Cmds=copy $(OutDir)\recover.exe ..\binary + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "recover - Win32 Release" + # Name "recover - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\util\recover.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\config.h + # End Source File + # Begin Source File + + SOURCE=..\include\config1.h + # End Source File + # Begin Source File + + SOURCE=..\include\coord.h + # End Source File + # Begin Source File + + SOURCE=..\include\global.h + # End Source File + # Begin Source File + + SOURCE=..\include\nhlan.h + # End Source File + # Begin Source File + + SOURCE=..\include\ntconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\tradstdc.h + # End Source File + # Begin Source File + + SOURCE=..\sys\winnt\win32api.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/resource.h Thu Mar 21 07:37:46 2002 *************** *** 0 **** --- 1,149 ---- + //{{NO_DEPENDENCIES}} + // Microsoft Developer Studio generated include file. + // Used by winhack.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_NETHACKW 107 + #define IDC_NETHACKW 109 + #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 143 + #define IDB_MENU_SEL_COUNT 144 + #define IDD_NHRIP 145 + #define IDB_SPLASH 146 + #define IDB_RIP 147 + #define IDD_SPLASH 148 + #define IDC_TEXT_VIEW 1000 + #define IDC_TEXT_CONTROL 1000 + #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_ABOUT_COPYRIGHT 1328 + #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_HELP_PORTHELP 32781 + #define IDM_MAP_TILES 32782 + #define IDM_MAP_ASCII4X6 32783 + #define IDM_MAP_ASCII6X8 32784 + #define IDM_MAP_ASCII8X8 32785 + #define IDM_MAP_ASCII16X8 32786 + #define IDM_MAP_ASCII7X12 32787 + #define IDM_MAP_ASCII8X12 32788 + #define IDM_MAP_ASCII16X12 32789 + #define IDM_MAP_ASCII12X16 32790 + #define IDM_MAP_ASCII10X18 32791 + #define IDM_MAP_FIT_TO_SCREEN 32792 + #define IDM_NHMODE 32794 + #define IDM_CLEARSETTINGS 32795 + #define IDC_STATIC -1 + + // Next default values for new objects + // + #ifdef APSTUDIO_INVOKED + #ifndef APSTUDIO_READONLY_SYMBOLS + #define _APS_NEXT_RESOURCE_VALUE 145 + #define _APS_NEXT_COMMAND_VALUE 32796 + #define _APS_NEXT_CONTROL_VALUE 1331 + #define _APS_NEXT_SYMED_VALUE 110 + #endif + #endif *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/rip.uu Thu Mar 21 07:37:47 2002 *************** *** 0 **** --- 1,1805 ---- + begin 600 rip.bmp + M0DVV/`$``````#8$```H````D`$``,@````!``@``````(`X`0`2"P``$@L` + M```!`````0``+C8V`$9!00`Q+R\`(S4U``)'`P`*+A4`'C$P`"LI*0`1-2,` + M&B(B`**FI@`X.CH`:W1U`!0:&0!X?G\`#1(2`!,G'P`*,Q8``3X#`!88&``! + M.@,``C@$`!06%@!-1D8`)20D``H,#``,%14`145%`#=+2P`/,!\`#RX?`#\_ + M/P`]/3T`%1L;``TN&@"#AX@`+2TM`"DI*0![?X``$R\G`#0Q,0!634T`#A@8 + M`+&TM`"2F)@`(28E`(J0D``8'!P`?8*#`&1L;0`?("``EYB;+3AGEYB; + MS\O1P+7"*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``*S`^S\O1P+*U*S`^@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDXEYB;P+*UF=#5EYB;F:?, + MF=#5S\O1J:VO0UICF8"0F=#5S\O1-3]`@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``*S`^P+7"F=#5*S`^+3AG*S`^@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8 + MP+*UU=3>S\O1EYB;N7YBF=#5F=#5P+7"96=IEYB;F:?,F:?,+3AG@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``559;P+*U + MF=#5GZ=P+7"S\O1>GZ=EYB;F:?,S\O1F=#5P+*UF:?, + MP+*UF=#596=I$QDX'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``*S`^F=#5F=#5S\O1S\O1S\O1F=#5%!0V@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@896=IEYB;P+*UEYB;EYB; + M96^<05BD05BDF8"0F=#5F=#5S\O1S\O1>GZ=$QDX@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``*S`^S\O1U=3>F=#5X^KKU=3>P+*U559; + M'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P] + MF8"0EYB;F8"096^<96^<(C&<%!68+3AG(C&S\O1S\O1F=#5*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``'A@8>GZ=EYB;559;0UIC&25@(C&<+3AG)T2E+3AGEYB; + MEYB;?Y?/F:?,EYB;5B@>@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``*S`^F=#5S\O1F=#5EYB;F:?,U=3>SMK=5B@>@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0VEYB;J:VO0UIC+3AG04F- + M(C&<05BD0UIC+3AG'".<(C&<(C&<96=I96^GZ=F:?,0UIC'".<(C&<96^<05BD(C&<+3AG(C&< + M96=I05BD0UIC05BD05BDF:?,EYB;%!0V@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``+3AGEYB;04F-+3AG04F-05BD2%S(05BD05BD96^'A@8@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``-3]`EYB;96^<+3AG+3AG'".<"0F5'2C32%S(96^<'".<(C&< + M*47&*47&"0GS"0GS#Q/-96^<05BD@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``%!0V05BD(C&<'2C3(C&<05BD*47&'2C3#Q/-'".<(C&EYB;05BD&25@(C&<'".<%!68 + M(C&<*47&*47&"0G+'2C3(C&<2%S(*47&'2C3"0G+05BD04F-#@\0@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``*S`^96^<(C&<'2C3*47&(C&<(C&<"0GS + M"0G+(C&<(C&GZ=L)BH96=I*S`^@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``%!0V>GZ=L)BHF:?,5B@>#@\0*S`^'A@8@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P] + M05BD(C&<'2C3*47&(C&<+3AG&25@+3AG"0F5"0ED"0F5%!68"0G+"0G+'".< + M"0ED"0F5&25@+3AG+3AG+3AG'A@8@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^F:?,66^\ + M*47&'".<+3AG"0ED"0G+#Q/-"0G+"0G+'".<+3AG0UICEYB;EYB;5B@>#`P] + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``$QDX+3AG96=IF=#5*S`^*S`^N7YB*S`^ + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``'A@896^<66^\(C&<'".<'".<"0ED"0ED"0ED%QAE'".< + M'".<"0G+'2C3#Q/-"0F5"0G+%!68"0F5"0F5(C&<96=I$QDX@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``#`P]0UICP+7"F:?,2%S('".<+3AG'2C3"0F5"0G+"0G+%!68'".< + M+3AG0UIC96=IEYB;*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``5B@>>GZ=*S`^5B@> + M>GZ=*S`^*S`^96^<'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDX-3]`05BD+3AG"0ED + M+3AG"0ED"0ED"0G+"0G+#Q/-"0G+"0GS"0GS#Q/-'2C3"0F5"0G+"0F5%!68 + M+3AG%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``'A@8EYB;L)BH05BD+3AG%QAE"0F5 + M"0G+'2C3"0GS"0G+"0F5&25@*S`^0UICF8"0559;'A@8*S`^*S`^*S`^#`P] + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``-3]`EYB;559;*S`^N7YB559;0UIC559;%!0V@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``*S`^>GZ=+3AG"0ED"0ED%!68&25@#Q/-'2C3"0GS"0GS"0GS"0GS"0GS + M"0G+"0G+'".<"0F5"0F5%QAE@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0$QDX + M*S`^$QDX*S`^(C&<(C&<"0G+"0G+"0GS"0GS#Q/-"0G+%!68%QAE+3AG05BD + M0UICF8"0F=#5EYB;*S`^%!0V'A@8%!0V@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``*S`^559;EYB;+3AG%!0VGZ=EYB;+3AG%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``559;F=#5+3AG%!0V + M"0ED"0ED%QAE"0F5"0G+"0F5"0GS"0GS'2C3"0GS"0G+#Q/-'".<"0ED'".< + M+3AG$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0V96=I96^<(C&< + M"0F5"0G+#Q/-"0GS"0GS"0GS"0GS%!68"0F5"0F5+3AG"0ED$QDX%QAE05BD + MF:?,EYB;*S`^*S`^*S`^#@\0@(``@(``@(``@(``@(``@(``@(``@(``*S`^ + MP+7"S\O1N7YB$QDX#`P]*S`^559;96=I0UIC'A@8@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``*S`^F8"096=I&25@&25@%QAE'".<"0F5#Q/-"0G+"0GS"0GS"0G+"0G+ + M'2C3"0G+"0G+"0F5'".<04F-%!0V@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``#`P]*S`^04F-05BD(C&<%!68"0G+"0GS'2C3"0GS"0G+"0G+'".< + M"0F5%!68&25@&25@%QAE+3AG%QAE+3AGF8"0>GZ=*S`^@(``@(``@(``@(`` + M@(``@(``@(``@(``#`P]GZ=+3AG*S`^%!0V*S`^$QDX'A@8*S`^*S`^ + M$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``'A@8*S`^GZ=EYB;(C&<(C&<*47&'2C3"0GS#Q/-"0GS"0G+'2C3"0F5'".<%!68'".< + M%QAE"0ED"0ED"0ED%QAE+3AG+3AG*S`^@(``@(``@(``@(``@(``@(``@(`` + M-3]`+3AG&25@(C&<0UIC+3AG%!0V$QDX+3AGEYB;F=#5559;#@\0@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``'A@8EYB;F=#596=I&25@"0ED"0ED(C&<"0F5(C&<"0G+"0F5"0G+ + M"0G+"0G+"0G+"0F5+3AGF8"0*S`^@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``'A@8'A@8*S`^EYB;?Y?/04F-(C&<'2C3"0G+"0G+ + M#Q/-"0F5#Q/-(C&<"0G+"0F5&25@%!68"0ED'".<%!6896^<96^<%!0V@(`` + M@(``@(``@(``@(``@(``559;96=I+3AG0UIC96=I0UIC+3AG+3AG+3AG0UIC + M96^GZ=*S`^@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P] + M*S`^+3AG%QAE+3AG"0F5%!68&25@(C&<%!68'2C3"0G+"0G+%!68'".<(C&< + M*S`^'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``$QDX96^<>GZ=*47&'".<#Q/-"0G+*47&"0G+"0G+ + M"0GS'2C3"0G+"0G+"0F5%!68(C&<,4)F'A@8@(``@(``@(``@(``@(``@(`` + M-3]`559;(C&<0UIC559;&25@+3AG0UIC0UIC0UIC+3AG05BD559;*S`^@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``%!0V0UIC(C&<&25@%QAE&25@'".<0UIC(C&<"0F5 + M'2C3"0G+(C&<(C&<+3AG%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]559;0UIC(C&<'".< + M"0G+'".<"0G+#Q/-"0G+"0GS#Q/-"0G+(C&<'".<"0ED'".<*S`^#`P]@(`` + M@(``@(``@(``@(``'A@8+3AG05BD+3AG+3AG(C&<+3AG(C&<0UIC+3AG%QAE + M'".<(C&GZ=EYB;+3AG"0ED + M%!68'".<(C&<*47&#Q/-"0G+"0G+(C&<2%S(96=I#@\0@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M'A@8EYB;F:?,96=I%!68"0ED"0F5"0G+"0G+'2C3"0GS"0GS"0GS"0G+%!68 + M'".<(C&<+3AG%!0V@(``@(``@(``@(``@(``#`P]+3AG+3AG+3AG05BD+3AG + M+3AG+3AG+3AG&25@+3AG%QAE05BDF=#5F=#5$QDX@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M*S`^P+7"P+*U+3AG&25@+3AG(C&<96^<2%S(#Q/-"0G+(C&<"0F566^\66^\ + M%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8*S`^559;*S`^#@\0 + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``#`P]559;F:?,F:?,+3AG&25@"0ED%QAE'".<"0G+"0GS + M"0G+"0GS*47&"0F5%!68"0F596^<05BD#`P]@(``@(``@(``@(``@(``#`P] + M+3AG(C&<+3AG+3AG+3AG%!68+3AG+3AG'".<"0ED+3AG(C&GZ=$QDX@(``@(``@(``@(``@(``#`P]04F-05BD+3AG+3AG"0ED + M"0ED*S`^&25@"0ED*S`^"0ED"0ED&25@+3AG0UICEYB;EYB;$QDX@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M%!0VS\O1P+7"+3AG+3AG*S`^+3AG05BD"0G+*47&"0G+'".<(C&GZ=(C&<"0ED"0ED"0F5"0F5%!68"0F5"0F5#Q/-'".< + M%!68"0F5'".<(C&<'".<+3AGF:?,EYB;$QDX@(``@(``@(``@(``@(``#@\0 + M96=I96^<%QAE"0ED%!0V"0ED"0ED"0ED%QAE"0ED"0ED#`P]#`P]"0ED&25@ + MF:?,F:?,559;%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``'A@8P+7"F:?,+3AG&25@+3AG0UIC(C&<'2C3"0G+ + M"0F5"0F5%!68F=#5EYB;*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P] + M*S`^559;+3AG*S`^%!0V%!0V#`P]'A@8$QDX*S`^'A@8$QDX5B@>%!0V#`P] + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``5B@>EYB;2%S( + M*47&*47&"0GS#Q/-"0G+(C&<(C&<96^GZ=%!0V@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``%!0V*S`^+3AGF8"0J:VOEYB;96=I>GZ=96=I559;0UIC+3AG96^< + M96^<GZ= + MF:?,5B@>@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M'A@8EYB;P+7">GZ=0UIC(C&<96^<05BD05BD0UIC+3AG&25@%QAE"0ED'".< + M"0F5"0F5%!68"0F5"0F5"0F5#Q/-"0F5"0G+%!68'2C3"0F5'".<+3AG(C&< + M+3AG>GZ=?Y?/EYB;>GZ=66^\F8"0>GZ=P+*UP+7"XO+TF=#596=I&25@"0ED + M"0ED%QAE"0ED%QAE"0ED$QDX%!0V&25@%!0V#`P]"0ED*S`^05BDF:?,EYB; + M$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``559;(C&<%!68"0ED"0F5#Q/-(C&<(C&<'2C3'2C3"0G+'".<66^\96^< + M$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``$QDXEYB;P+*U>GZ=96^<05BD96=I04F-559; + M05BD96=I0UIC96=I0UIC05BD96=I96^<GZ=?V]^'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``'A@8*S`^*S`^0UICEYB;F=#596^< + M+3AG"0ED+3AG&25@+3AG(C&<0UIC(C&<+3AG0UIC-3]`0UIC96=I0UIC96^< + MS\O1J:VO%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8@(``*S`^>GZ=>GZ= + M04F-05BD559;(C&<(C&<&25@&25@%QAE"0F5(C&<96^<+3AG%!0V@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]'A@8'A@8 + M@(``@(``@(``#`P]$QDX*S`^$QDX@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``#`P]'A@8$QDX-3]`EYB;96^<(C&<96=I0UIC + M0UIC96=I0UIC+3AG+3AG+3AG0UIC(C&<%QAE"0F5%QAE(C&<"0F5#Q/-"0F5 + M'".<#Q/-"0F5%!68"0G+"0F5%!6805BD+3AG%QAE&25@&25@%!68(C&<(C&< + M(C&<(C&<+3AG(C&<(C&<+3AG+3AG&25@+3AG"0ED%QAE&25@&25@%QAE"0ED + M%!0V%!0V&25@*S`^$QDX#`P]&25@*S`^05BD96^<*S`^#`P]@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``+3AG>GZ=+3AG%!0V"0ED&25@ + M"0F5'".<*47&05BD+3AG"0ED%QAE&25@05BD04F-#`P]@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]%!0V*S`^-3]`EYB; + MEYB;96^<0UIC04F-+3AG"0F5'".<+3AG'".<"0F5+3AG+3AG&25@+3AG+3AG + M(C&<0UIC+3AG+3AG96=I>GZ=96^<*S`^#`P]@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^ + M>GZ=*S`^%!0V?V]^96^<96=I+3AG+3AG0UIC96^<*S`^'A@8$QDX'".<'".< + M(C&GZ=05BD+3AG$QDX#`P]*S`^+3AGEYB;EYB;%!0V@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB;F8"096=I + M(C&<(C&<+3AG+3AG96=I96=I0UIC+3AG+3AG0UIC+3AG+3AG+3AG+3AG'".< + M'".<"0F5"0F5"0F5"0F5"0G+"0F5'2C3"0G+(C&<"0G+'".<(C&<+3AG&25@ + M%QAE'".<'".<+3AG%!68&25@'".<%!68+3AG"0F5%QAE'".<+3AG'".<+3AG + M+3AG+3AG+3AG+3AG+3AG+3AG0UIC+3AG+3AG-3]`+3AG&25@%QAE%QAE0UIC + MN7YB*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0V + M96=I(C&<"0ED"0ED"0F5%QAE"0F5+3AG+3AG%QAE&25@"0ED&25@+3AG+3AG + M#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M$QDXN7YBF:?,>GZ=96=I(C&<05BD(C&<&25@&25@+3AG%QAE+3AG'".<%!68 + M'".<"0ED"0ED"0ED&25@+3AGF8"0EYB;>GZ=GZ=F8"00UIC*S`^*S`^96=I + M%!0V'A@8#`P]%QAE%!68+3AG?Y?/EYB;0UIC'A@8@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``'A@8*S`^559;EYB;96^<+3AG*S`^%QAE&25@(C&< + MF=#5F:?,+3AG'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0 + M*S`^96^GZ=F8"096=I + M&25@96=I>GZ=*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``'A@8+3AGEYB;P+*UF=#5559;*S`^96=IN7YB + M>GZ=*S`^*S`^*S`^*S`^$QDX````'A@8"0ED'".<%!68+3AG04F-F8"00UIC + M$QDX#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``#`P]%!0V'A@8+3AG96^<>GZ=0UIC%QAE + M"0ED&25@*S`^+3AG*S`^+3AG96=IEYB;0UIC%!0V#`P]@(``@(``@(``@(`` + M@(``@(``@(``#`P]*S`^EYB;F:?,96^<(C&<(C&<+3AG05BD559;0UIC96=I + M0UIC0UIC+3AG&25@(C&<+3AG(C&<'".<+3AG%!68'".<#Q/-"0F5"0G+"0G+ + M'2C3"0G+"0G+"0F5"0G+"0F5%!68'".<+3AG"0ED%QAE&25@%!68'".<'".< + M+3AG(C&<+3AG(C&<+3AG+3AG+3AG0UIC+3AG&25@+3AG+3AG0UIC559;05BD + M0UIC96=I0UIC96=I0UIC96=I0UIC96=I0UIC96=IGZ=*S`^$QDX + M%!0V$QDX#@\0@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``$QDXL)BHF:?,+3AG%!0V&25@%QAE"0F5 + M"0ED+3AG&25@+3AG"0F5"0F5%QAE&25@"0ED0UICEYB;0UIC@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``'A@8$QDX%!0V+3AGF8"005BD(C&<(C&<&25@ + M'".<%!68"0ED'".<%!68"0G+"0F5%!68%QAE(C&<'".<+3AG+3AG%!0V0UIC + M+3AG%!0V$QDX'A@8'A@8#`P]#`P]%!0V@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``-3]`EYB;>GZ=EYB; + MS\O1J:VON7YB0UIC96=I+3AG*S`^*S`^-3]`#`P]````'A@8#`P]#@\0%!0V + M&25@%!68,4)F96^EYB;66^\96^<(C&<%QAE'".< + M0UIC05BD0UIC0UIC+3AG+3AG%QAE+3AG%QAE+3AG'".<%!68%!68"0F5&25@ + M%!68'".<"0G+'2C3%!68"0G+%!68'2C3"0G+(C&<"0F5'".<"0F5+3AG"0F5 + M%QAE'".<%QAE+3AG%!68&25@%!68+3AG+3AG+3AG(C&<+3AG%!68+3AG(C&< + M+3AG(C&<0UIC96=I0UIC559;0UIC0UIC559;0UIC0UIC96=I96=I0UIC96=I + M0UIC96=I@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB;96=I0UIC + M(C&<'".<&25@+3AG%QAE"0F5"0F5&25@"0F5"0F5'".<%!68&25@"0F5*47& + MF:?,F=#5N7YB*S`^GZ=(C&<+3AG%!68+3AG"0F5'".<"0F5(C&<"0G+%!68"0F5 + M"0F5%QAE$QDX(C&<66^\L)BHF:?,>GZ=96=IEYB;EYB;%!0V@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``*S`^P+*U96^<559;0UIC96=I96=I$QDX```` + M#`P]*S`^*S`^*S`^$QDX#@\0````'A@8#@\0````$QDX+3AG+3AG+3AG>GZ= + M96^<*S`^'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``%!0V0UICF:?,GZ=559;$QDX@(``@(`` + M@(``@(``$QDX*S`^(C&<(C&<&25@+3AG96=I05BD559;0UIC0UIC0UIC&25@ + M+3AG"0F5+3AG%QAE&25@'".<'".<"0F5%!68'".<(C&<'2C3%!68"0G+"0G+ + M'2C3"0G+"0F5#Q/-"0F5"0G+"0G+"0F5+3AG%QAE"0ED&25@+3AG'".<'".< + M+3AG%!68'".<&25@+3AG&25@+3AG(C&<&25@(C&<%!68+3AG&25@0UIC559; + M0UIC559;96=I0UIC0UIC0UIC96=I0UIC96^<0UIC0UIC0UIC559;0UIC96=I + M+3AG(C&<96^<>GZ=F8"0*S`^%!0V#@\0$QDX@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``#`P]$QDX+3AG0UIC"0ED%QAE&25@#`P]"0ED + M"0ED"0ED"0G+"0G+"0GS"0G+"0GS'".<"0F504F-EYB;*S`^@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M'A@8$QDX%!0V*S`^>GZ=96^<0UIC(C&<(C&<%!68&25@"0F5'".<%!68"0F5 + M(C&<"0F5"0G+(C&<&25@%!0V#`P]%QAE>GZ=?Y?/*S`^%!0V-3]`F8"0F=#5 + M>GZ='A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``-3]`F:?,96^<GZ=N7YB%!0V@(``@(``#@\096^<>GZ=+3AG+3AG'".<0UIC0UIC0UIC + M96=I0UIC96=I(C&<+3AG%!68&25@+3AG+3AG'".<%!68"0G+"0F5"0G+'".< + M#Q/-"0G+"0F5'2C3"0GS#Q/-"0G+'2C3"0G+'".<%!68'".<%!68&25@"0ED + M&25@"0F5%!68%!68+3AG%QAE'".<+3AG%!68%!68'".<%!68+3AG%!68'".< + M+3AG'".<&25@(C&<+3AG+3AG0UIC0UIC559;96=I96=I0UIC0UIC+3AG+3AG + M0UIC+3AG0UIC+3AG05BD96=I+3AG(C&<(C&<96^<+3AG0UICN7YB*S`^@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^>GZ=96=I"0ED + M&25@$QDX"0ED*S`^"0ED&25@%!68'2C3"0GS#Q/-"0GS#Q/-"0G+(C&<(C&< + M*S`^%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``*S`^EYB;GZ=04F-&25@"0ED#`P]&25@"0ED*S`^ + M"0ED%QAE"0F5(C&<"0G+*47&'2C3(C&GZ=96=IF8"0 + M>GZ=96=I0UIC*S`^0UIC559;+3AG*S`^%!0V#@\0*S`^*S`^%!0V'A@8#`P] + M'A@8#@\0#`P]#`P]+3AG+3AG(C&GZ=%!0V@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``'A@8F8"0>GZ=+3AG0UIC559;+3AG*S`^0UIC*S`^*S`^+3AG + M%!0V$QDX#`P]$QDX*S`^%QAE$QDX*S`^*S`^"0ED"0ED"0ED%!0V"0ED%QAE + M"0ED"0ED&25@+3AG05BD96^<96^<+3AG*S`^+3AG+3AG0UIC0UIC0UIC96=I + M96=I0UIC+3AG'".<%!68'".<%!68"0F5%!68#Q/-"0F5#Q/-%!68#Q/-%!68 + M"0GS#Q/-'".<"0GS"0G+'2C3%!68'2C3%!68'2C3"0F5&25@%!68'".<'".< + M+3AG'".<%QAE'".<+3AG%!68%QAE'".<+3AG+3AG%!68'".<'".<%!68'".< + M+3AG%!68(C&<'".<+3AG+3AG0UIC96=I05BD559;+3AG+3AG0UIC+3AG+3AG + M+3AG+3AG+3AG*S`^0UIC0UIC(C&<0UIC96=I96=I&25@%!68(C&<96=I96=I + M96^GZ=96=I(C&<04F-(C&<+3AG%!68'".<%QAE'".<%!68"0F5"0ED'2C3#Q/- + M"0G+"0GS"0G+'2C3"0F5'".<+3AG?HF\F=#5EYB;96=I+3AG+3AG+3AG*S`^ + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@80UIC + ML)BHF:?,96^<96=I96=I96=I96=I559;-3]`96=I96=I-3]`$QDX*S`^$QDX + M+3AG*S`^#@\0#@\0````````'A@8````*S`^%QAE'".<+3AGF:?,EYB;%!0V + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``*S`^#`P]$QDX$QDX#`P]$QDX*S`^?Y?/EYB;+3AG$QDX*S`^*S`^ + M+3AG+3AG*S`^+3AG*S`^$QDX%!0V%QAE*S`^+3AG0UIC*S`^&25@%QAE*S`^ + M#`P]%!0V&25@%!0V$QDX"0ED&25@%QAE'".<04F-96^<0UIC%QAE&25@-3]` + M0UIC559;+3AG96=I0UIC559;+3AG+3AG%!68&25@%!68%!68&25@'".<"0F5 + M'2C3#Q/-'".<'".<'2C3"0G+"0G+(C&<"0G+%!68"0G+"0G+"0F5"0G+'".< + M%!68'".<"0F5%!68%!68%QAE'".<+3AG%!68'".<'".<"0F5+3AG%!68'".< + M(C&<%!68+3AG'".<&25@'".<'".<(C&<(C&<+3AG(C&<0UIC(C&<0UIC0UIC + M96=I(C&<559;+3AG+3AG+3AG+3AG+3AG+3AG*S`^+3AG+3AG559;0UIC+3AG + M+3AG+3AG96=I0UIC559;0UICF:?,J:VO559;$QDX%!0V5B@>*S`^559;F:?, + MEYB;05BD%QAE"0ED%QAE&25@%QAE"0ED%QAE"0ED"0ED"0ED%!68&25@05BD + M96^<GZ= + M>GZ=*S`^+3AG*S`^'A@8$QDX$QDX%!0V````%!0V````#`P]````$QDX&25@ + M+3AG&25@04F-96=I*S`^#`P]@(``@(``@(``@(``@(``@(``@(``*S`^$QDX + M*S`^*S`^*S`^'A@8*S`^$QDX+3AGEYB;04F-+3AG(C&<+3AG(C&<0UIC+3AG + M(C&<*S`^&25@+3AG*S`^0UIC+3AG"0ED#`P]%QAE*S`^+3AG96=I96^GZ=EYB;559;#`P]'A@8#`P]%!0V#@\0 + M%!0V%!0V*S`^*S`^-3]`*S`^#`P]*S`^$QDX````%!0V#@\0'A@8$QDX'A@8 + M#@\0%!0V````'A@8%QAE+3AG%QAE&25@+3AGEYB;*S`^@(``@(``@(``@(`` + M@(``@(``*S`^P+7"P+*UP+7"P+7"S\O1S\O1P+7"P+*UF:?,>GZ=0UIC(C&< + M'".<+3AG'".<(C&<'".<&25@"0ED+3AG+3AG+3AG*S`^*S`^&25@$QDX+3AG + MEYB;+3AG$QDX*S`^-3]`559;EYB;+3AG$QDX%QAE&25@&25@%!0V"0ED%QAE + M&25@"0ED&25@"0F5%QAE"0ED*S`^%QAE&25@*S`^%QAE&25@+3AG"0ED%QAE + M&25@%!68%!68%!68"0G+'".<#Q/-"0F5(C&<"0G+"0G+#Q/-'".<#Q/-"0GS + M#Q/-'2C3#Q/-"0G+%!68"0G+"0G+"0G+'".<"0F5'".<'".<%!68%!68+3AG + M%!68&25@%!68'".<%!68+3AG%!68%!68"0F5"0F5%!68(C&<"0F5&25@+3AG + M(C&<&25@+3AG'".<+3AG'".<'".<+3AG+3AG+3AG+3AG0UIC96=I0UIC+3AG + M0UIC+3AG+3AG&25@&25@+3AG+3AG*S`^&25@*S`^+3AG+3AG0UIC0UIC+3AG + M559;0UIC0UICGZ=96^<96^<&25@&25@+3AG + M'".<%QAE'".<+3AG%!68"0F5(C&<"0F5'".<#Q/-'".<'".<#Q/-'2C3"0GS + M"0G+'2C3"0GS"0GS"0G+'2C3%QAE$QDX*S`^%!0V%!0V+3AG$QDX@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0 + M559;EYB;66^\05BD%!68&25@+3AG+3AG&25@%QAE%!0V"0ED$QDX*S`^$QDX + M#`P]#@\0'A@8#@\0#`P]'A@8$QDX````'A@8````'A@8#`P]'A@8#@\0"0ED + M%QAE&25@&25@+3AG96^<+3AG'A@8@(``@(``@(``@(``@(``%!0V'A@8*S`^ + M0UICP+*UX.#GU=3>S\O1F:?,?Y?/F=#5F=#5F:?,*47&05BD*47&'".<%!68 + M&25@"0ED%QAE&25@+3AG+3AG0UIC96=IF:?,EYB;+3AG@(``@(``@(``@(`` + M*S`^EYB;96=I"0ED"0ED+3AG+3AG&25@%QAE%QAE&25@&25@%QAE"0ED%QAE + M"0ED%QAE+3AG%!68&25@"0F5&25@+3AG+3AG&25@%QAE+3AG%QAE&25@&25@ + M'".<"0G+'".<%!68"0G+"0G+#Q/-'2C3"0G+#Q/-"0G+#Q/-"0GS#Q/-'2C3 + M"0G+"0G+'2C3"0F5(C&<"0F5'".<%QAE(C&<'".<%!68'".<%!68%!68+3AG + M%!68"0F5%QAE%!68"0F5+3AG"0F5'".<(C&<'2C3(C&<(C&<+3AG(C&<'".< + M%!68+3AG(C&<+3AG(C&<(C&<%!68+3AG+3AG(C&<0UIC(C&<+3AG'".<0UIC + M05BD+3AG+3AG+3AG+3AG+3AG*S`^+3AG&25@%QAE+3AG*S`^&25@+3AG%QAE + M+3AG&25@"0F5+3AG%!68&25@(C&<&25@+3AG&25@&25@"0F5%QAE"0F5&25@ + M+3AG>GZ=0UIC$QDX@(``@(``@(``@(``@(``@(``'A@8*S`^%!0V$QDX'A@8 + M$QDX#`P]#`P]$QDX*S`^EYB;P+7">GZ=96^<96=I05BD559;05BD+3AG%!68 + M+3AG(C&<&25@+3AG%!68%!68(C&<"0G+'".<(C&<'2C3%!68"0G+"0G+"0G+ + M'2C3'2C3'2C3"0GS"0GS"0GS"0GS"0GS'2C3(C&<*47&0UIC+3AG$QDX&25@ + M*S`^96^<*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``$QDX96^<>GZ=05BD(C&<+3AG+3AG%!68"0F5%!68'".<+3AG + M'".<%QAE+3AG"0ED%QAE'A@8$QDX#`P]'A@8#`P]#@\0````%!0V#`P]#@\0 + M$QDX#@\0#@\0%!0V#`P]*S`^+3AG%QAE&25@0UICF:?,EYB;%!0V@(``@(`` + M@(``@(``@(``@(``@(``%!0V96=IS\O1XO+TSMK=66^\*47&2%S(F:?,F=#5 + M*47&'2C305BD'".<%!68&25@"0F5%QAE'".<96^GZ=F8"096=I96=I559;+3AG05BD96^<04F-(C&<(C&< + M'".<(C&<+3AG&25@'".<&25@+3AG%!68'".<'".<'".<+3AG"0F5%!68%!68 + M'".<2%S(*47&"0G+*47&"0GS*47&'2C3"0GS"0GS"0GS"0GS"0G+%!68'".< + M96^@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``'A@8*S`^5B@>*S`^>GZ=?HF\0UIC(C&<'".<'".< + M+3AG'".<+3AG'".<%QAE'".<+3AG'".<+3AG&25@%!0V"0ED#`P]%!0V```` + M%!0V#@\0#@\0````'A@8#`P]'A@8'A@8````$QDX"0ED+3AG&25@+3AG%QAE + MP+*UF:?,*S`^@(``@(``@(``@(``@(``@(``@(``@(``'A@8F8"0S\O1F=#5 + MF:?,2%S(2%S(?Y?/?Y?/'2C3'2C3*47&05BD(C&<(C&<%QAE&25@%QAE96=I + MEYB;EYB;%!0V@(``@(``@(``@(``@(``@(``@(``@(``'A@8F8"0>GZ=+3AG + M&25@+3AG*S`^%!0V%!0V$QDX'A@8#`P]'A@8%!0V$QDX%QAE*S`^%QAE&25@ + M'".<+3AG&25@+3AG'".<%QAE'".<%QAE'".<&25@&25@%QAE"0F5"0F5"0G+ + M"0G+"0G+'2C3"0G+"0G+#Q/-"0GS#Q/-"0G+"0G+'".<"0G+"0G+'2C3%!68 + M"0F5(C&<%!68"0F5"0G+(C&<"0G+%!68%!68&25@%!68'".<"0F5%!68%QAE + M'".<+3AG'".<'".<%!68'".<(C&<05BD(C&<05BD+3AG'".<+3AG+3AG%!68 + M+3AG"0ED'".<%!68+3AG04F-05BD0UIC0UIC96=I96=I0UIC+3AG+3AG+3AG + M+3AG&25@%QAE"0ED%QAE"0ED&25@%!0V&25@+3AG%!68"0F5#Q/-"0F5"0F5 + M&25@(C&<+3AG&25@%QAE'".<"0F5'".<%QAE>GZ=GZ=&25@+3AGEYB;*S`^@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^F:?,F:?,GZ=$QDX@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``$QDX'A@8559;F:?,P+7">GZ=66^\96^<05BD05BD(C&<66^\L)BH + MF8"0$QDX#`P]@(``#`P]%!0V'A@8@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``%!0VGZ=>GZ=GZ=96=I+3AG(C&<96=I(C&<96=I0UIC05BD + M(C&<%!68(C&<+3AG%!68+3AG"0F5'".<+3AG'".<+3AG'".<'".<+3AG%QAE + M'".<(C&<'2C3%!68'2C3(C&<(C&<'2C3#Q/-"0G+"0GS2%S(2%S(*47&"0GS + M"0GS*47&"0GS"0GS"0G+"0F5"0F5%QAE*S`^%QAE(C&<+3AG'A@8%!0V#@\0 + M#`P]'A@8#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^ + MEYB;?Y?/96^<66^\0UIC+3AG(C&<%QAE'".<+3AG&25@%!68%QAE+3AG&25@ + M&25@%QAE+3AG%!68+3AG%!68+3AG'".<%QAE'".<%QAE*S`^#`P]````#@\0 + M#`P]%!0V#@\0'A@8$QDX%QAE$QDX+3AG'".<%QAE(C&<+3AG#`P]@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8*S`^-3]`+3AG$QDX559; + MF:?,F=#5F:?,+3AG+3AG*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``*S`^*S`^+3AG$QDX%!0V$QDX%QAE&25@ + M+3AG+3AG&25@&25@%!68+3AG+3AG%!68%QAE&25@'A@8#@\0%QAE"0ED+3AG + M'".<"0ED"0F5(C&<%!68&25@%!68%!68'".<%!68"0F5"0G+'2C3"0GS"0GS + M"0G+"0GS#Q/-"0G+"0F5'2C3"0G+'2C3"0G+'2C3%!68"0G+"0G+"0G+"0F5 + M"0F5%!68'".<"0F5%!68'".<%!68&25@%QAE"0F5(C&<"0F5'2C3%!68'".< + M(C&<*47&05BD(C&<(C&<(C&<+3AG(C&<(C&<%!68'".<+3AG'2C3%!68'".< + M(C&<"0F5(C&<+3AG(C&<+3AG(C&<'".<'".<+3AG%QAE'".<%QAE&25@%QAE + M&25@+3AG%QAE'".<"0F5#Q/-"0F5%!68"0G+%!68'".<+3AG&25@%!68%QAE + M+3AG'".<&25@+3AG96=I96^<96=I04F-+3AG(C&<559;05BD+3AG+3AG'".< + M%!68+3AG%!68+3AG+3AG+3AG'".<%QAE&25@%!68'".<%!68'".<%!68'".< + M%!68"0F5%!68'".<"0F5%!6805BD#Q/-'".<"0F5'2C3(C&<*47&"0GS"0GS + M'2C366^\2%S(2%S("0GS"0GS"0GS'2C3"0G++3AG%QAE&25@*S`^&25@*S`^ + M0UIC*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``*S`^96=I?Y?/66^\*47&(C&<*47&(C&<+3AG+3AG+3AG"0F5 + M+3AG"0F5'".<'".<+3AG%!68+3AG&25@'".<&25@"0F5%!68&25@%!68+3AG + M'".<"0ED'A@8#@\0#`P]'A@8````#`P]````%QAE$QDX%QAE&25@+3AG"0ED + M+3AG+3AG-3]`#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``*S`^EYB;P+7"EYB;%!0V@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0*S`^*S`^$QDX*S`^ + M&25@#`P]&25@%QAE"0F5%!68'".<(C&<'".<%QAE'".<%QAE&25@&25@+3AG + M#`P]'A@8#`P]&25@"0F5+3AG%!68+3AG"0F5'".<&25@"0F5%!68'".<"0F5 + M+3AG'2C3"0G+#Q/-'2C3"0GS#Q/-"0G+"0G+"0G+#Q/-"0G+#Q/-"0F5"0F5 + M"0G+(C&<"0G+(C&<"0G+(C&<+3AG%!68(C&<%!68%!68'".<%QAE'".<%!68 + M'".<"0G+%!68+3AG'".<05BD(C&<(C&<0UIC+3AG+3AG'".<(C&<'2C3'".< + M+3AG%!68"0F5'".<"0G+%!68'".<'".<(C&<+3AG'".<&25@%!68%!68+3AG + M+3AG'".<%QAE&25@+3AG+3AG%QAE'".<%!68"0F5%!68'2C3"0G+'".<'".< + M+3AG(C&<+3AG'".<&25@"0F5+3AG%!68+3AG+3AG0UIC0UIC'".<%!68&25@ + M+3AG0UIC05BD(C&<+3AG&25@"0F5+3AG&25@%!68+3AG%!68+3AG%!68'".< + M(C&<"0F5+3AG+3AG+3AG'".<(C&<'".<%!68(C&<(C&<(C&<'".<"0F5'2C3 + M*47&05BD"0GS"0GS*47&'2C32%S(66^\*47&*47&"0GS"0G+"0G+%!68&25@ + M"0ED*S`^%QAE"0ED+3AG96^<*S`^@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``$QDXEYB;F=#5(C&<(C&<05BD*47&'2C3 + M'2C3+3AG(C&<%QAE'".<%!68"0F5(C&<"0G+"0G+'".<(C&<+3AG+3AG(C&< + M+3AG&25@+3AG%!68+3AG+3AG%QAE+3AG$QDX%!0V#@\0$QDX'A@8#@\0#`P] + M*S`^&25@*S`^"0ED+3AG&25@(C&<>GZ=*S`^@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8$QDX*S`^'A@8$QDX@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8'A@8$QDX%!0V'A@8 + M*S`^EYB;96=I0UIC%QAE"0ED+3AG%QAE'".<+3AG'".<%QAE+3AG+3AG%!68 + M"0ED'".<+3AG"0F5%QAE'".<%QAE#`P]*S`^+3AG%!68&25@"0F5+3AG"0ED + M%!68&25@'".<+3AG%!68+3AG(C&<%!68(C&<'".<#Q/-'2C3'2C3#Q/-'2C3 + M"0G+"0G+'2C3(C&<"0G+%!68'2C3"0G+'".<%!68'".<"0F5'".<"0G+'2C3 + M'2C3%!68'".<"0F5(C&<'".<%!68'".<"0F5(C&<(C&<05BD96=I+3AG05BD + M(C&<(C&<(C&<(C&<%!68"0F5'".<%!68(C&<"0F5'2C3%!68"0F5'".<%!68 + M+3AG%!68'".<+3AG'".<+3AG(C&<+3AG+3AG+3AG0UIC(C&<(C&<+3AG'".< + M"0F5"0F5'2C3(C&<(C&<%!68'".<%!68&25@+3AG+3AG"0ED&25@"0F5+3AG + M+3AG(C&<+3AG&25@+3AG%!68+3AG+3AG%QAE+3AG'".<%!68+3AG'".<%!68 + M'".<'".<+3AG'".<+3AG"0F5(C&<'".<%!68'".<%!68'".<"0G+"0G+"0G+ + M'2C3*47&#Q/-'2C3"0G+2%S(*47&*47&"0GS"0GS'2C3*47&*47&*47&"0G+ + M"0GS"0G+%!68(C&<0UIC+3AG&25@+3AG"0ED96=IEYB;+3AG@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDXF8"0EYB; + M+3AG%!68(C&<'2C3(C&<"0F5%!68'".<+3AG"0ED&25@"0F5"0G+"0GS"0GS + M*47&(C&<+3AG0UIC+3AG&25@%!68"0F5&25@%!68&25@%!68'".<"0ED%QAE + M#`P]````#`P]````*S`^"0ED"0ED"0ED%QAE&25@"0ED+3AG96^<*S`^@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M$QDXEYB;P+*U>GZ=0UIC'".<(C&<(C&<'".<+3AG"0F5'".<+3AG+3AG+3AG + M+3AG+3AG%!68+3AG'".<+3AG%!68%QAE'".<+3AG"0F5&25@%QAE#`P]#`P] + M&25@+3AG%!68"0F5+3AG%!68'".<%!68"0F5'".<(C&<+3AG(C&<0UIC(C&< + M(C&<"0G+'2C3"0GS"0F5(C&<"0G+"0F5"0G+"0G+'2C3"0F5#Q/-"0F5'".< + M%!68%!68(C&<"0G+%!68(C&<%!68+3AG"0F5"0F5"0F5+3AG'".<%!68*47& + M0UIC559;0UIC(C&<05BD04F-)T2E+3AG(C&<'".<"0G+'".<%!68'".<"0ED + M(C&<"0F5%!68+3AG'".<(C&<"0G+'".<%!68"0F5+3AG+3AG&25@+3AG0UIC + M559;(C&<05BD(C&<(C&<'2C3+3AG(C&<+3AG)T2E+3AG'".<+3AG(C&<%!68 + M%QAE&25@+3AG%!68'".<+3AG+3AG&25@%!68"0F5'".<%!68'".<%!68'".< + M%!68%QAE'".<&25@%!68&25@(C&<%!68"0F5'2C3%!68'".<"0F5%!68(C&< + M05BD#Q/-#Q/-(C&<#Q/-(C&<(C&<"0G+#Q/-'2C3*47&2%S(*47&"0GS"0GS + M"0GS'2C3#Q/-'2C3"0G+'".<%!68'".<04F-P+7"S\O1F:?,96^<+3AG&25@ + M*S`^'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``$QDX96^<96^<+3AG'".<"0F5"0ED"0ED+3AG"0F5'".<"0F5"0F5 + M%!68'".<%!68"0G+#Q/-"0G+(C&<0UIC(C&<+3AG'".<+3AG&25@%QAE%!68 + M'".<+3AG+3AG+3AG'".<*S`^%!0V#@\0%!0V"0ED&25@+3AG%QAE&25@%QAE + M"0ED+3AG04F-$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``$QDX*S`^+3AG-3]`EYB;F=#5?HF\04F-+3AG"0F5&25@+3AG'".< + M%QAE+3AG%!68+3AG(C&<0UIC0UIC'".<'".<%QAE"0F5+3AG'".<'".<%!68 + M'".<%!68&25@%!0V$QDX%QAE'".<"0F5(C&<"0F5&25@'".<%QAE'".<(C&< + M%!68'".<559;0UIC96=I05BD(C&<#Q/-'2C3#Q/-"0G+"0G+(C&<#Q/-'2C3 + M%!68"0G+'".<%!68"0G+'2C3'".<"0F5'2C3'".<'".<%!68'".<(C&<(C&< + M'".<%!68%!68'".<'2C3(C&<05BD+3AG(C&<559;05BD(C&<'".<(C&<(C&< + M#Q/-"0G+%!68'".<%!68"0G++3AG"0F5&25@*47&%!68(C&<%!68&25@(C&< + M(C&<%QAE+3AG(C&<0UIC(C&<)T2E05BD'2C3'".<%!68(C&<(C&<(C&<(C&< + M%!68'".<(C&<&25@+3AG&25@%QAE'".<%QAE+3AG'".<+3AG(C&<+3AG+3AG + M+3AG%!68'".<+3AG+3AG+3AG'".<+3AG%!68'".<%!68(C&<'".<(C&<%!68 + M'".<%!68"0G+(C&<(C&<*47&'2C3'2C3"0G+'".<(C&<'2C3"0G+"0GS*47& + M96^<2%S(*47&*47&'2C3"0GS#Q/-"0G+"0F5%!68+3AG&25@(C&<05BDF:?, + MP+*UP+7"96^<96^<05BD%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``'A@896=I96^<"0ED"0ED%!0V*S`^$QDX + M#`P]"0F5%!68%!68'".<%QAE"0F5&25@"0F5"0ED&25@%!68+3AG+3AG(C&< + M+3AG%QAE"0F5"0F5&25@+3AG'".<%!68&25@"0ED"0ED#`P]#`P]#@\0%!0V + M"0ED"0ED#`P]"0ED%QAE"0ED+3AG+3AG%!0V'A@8@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``'A@8$QDX'A@8*S`^>GZ=L)BH96^<559;+3AG+3AG&25@ + M+3AG&25@%QAE%!68&25@+3AG(C&<&25@+3AG+3AG+3AG+3AG+3AG+3AG+3AG + M'".<"0ED"0F5%!68+3AG&25@%QAE'".<$QDX%QAE&25@+3AG%!68'".<%!68 + M%!68'".<%!68%!68'".<&25@+3AG(C&<04F-0UIC0UIC(C&<+3AG"0G+'2C3 + M#Q/-"0G+"0G+"0G+"0GS#Q/-"0G+(C&<"0F5%!68"0F5#Q/-"0G+#Q/-%!68 + M%!68'".<"0F5"0G+"0F5%!68'".<"0G+%!68(C&<(C&<(C&<'".<(C&<2%S( + M(C&<+3AG(C&<*47&'".<(C&<'".<(C&<"0F5'".<%!68'2C3%!68(C&<'".< + M"0G+'".<'".<(C&<%!68(C&<+3AG%!68'".<(C&<(C&<(C&<"0G+%!68(C&< + M(C&<'".<'".<(C&<+3AG+3AG+3AG+3AG&25@&25@%!68'".<+3AG(C&<'".< + M%!68%!68+3AG+3AG(C&<'".<&25@(C&<'".<%!68'".<"0F5%!68"0F5"0G+ + M(C&<+3AG'".<%!68'".<'2C3#Q/-"0G+(C&<(C&<(C&<(C&<#Q/-'2C3*47& + M*47&#Q/-"0G+"0G+"0GS*47&66^\?Y?/2%S(*47&'2C3"0F5+3AG'".<+3AG + M'".<(C&<96^<GZ=96=I + M%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB;EYB;96^<559;(C&<(C&< + M+3AG'".<%!68+3AG+3AG(C&<0UIC(C&<+3AG&25@(C&<+3AG(C&<%QAE%!68 + M'".<(C&<+3AG&25@'".<%!68+3AG%!68'".<'".<%!68'".<%!68%QAE"0ED + M*S`^%QAE'".<(C&<'".<+3AG"0F5+3AG'".<%QAE%!68%!68'".<+3AG(C&< + M96=I0UIC(C&<+3AG"0G+"0GS'2C3#Q/-"0GS"0G+'2C3"0F5"0G+"0G+'2C3 + M'".<#Q/-"0F5(C&<'".<'".<%!68(C&<"0F5(C&<"0G+'".<%!68'".<"0F5 + M%!68(C&<'".<*47&(C&<(C&<(C&<#Q/-'2C3(C&<(C&<(C&<%!68(C&<"0G+ + M%!68'".<"0G+"0G+(C&<(C&<"0F5+3AG(C&<(C&<&25@(C&<'".<'2C3"0G+ + M#Q/-'2C3"0G+'".<'2C3'2C3%!68(C&<%!68'".<(C&<+3AG'".<%QAE%!68 + M"0ED+3AG%!68'".<+3AG'".<+3AG"0F5+3AG'".<(C&<%!68%!68'".<%!68 + M%!68(C&<'".<%!68'".<"0F5#Q/-05BD(C&<'2C3"0G+'2C3'".<*47&05BD + M'2C3'2C3"0G+"0G+*47&'2C3"0GS"0GS*47&"0GS*47&*47&*47&#Q/-'".< + M"0F5%QAE"0ED'".<(C&<(C&<(C&<+3AG%!0V#@\0@(``@(``'A@8*S`^*S`^ + M#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``#`P]0UIC96^<'".<%!68"0ED*S`^"0F5"0G+'2C3"0G+"0G+"0F5 + M+3AG"0ED$QDX'A@8#`P]"0ED+3AG(C&<%!68'".<+3AG%!68"0ED&25@"0ED + M+3AG+3AG'".<&25@%QAE"0ED+3AG"0ED%QAE%QAE"0ED%QAE#`P]"0ED%!0V + M"0F5+3AG%QAE96^GZ=2%S(*47&"0F5(C&<"0G+"0G+ + M*47&"0G+#Q/-"0GS"0G+"0ED"0ED#`P]"0ED$QDX%QAE'".<(C&<+3AG"0F5 + M"0ED&25@%QAE"0ED%QAE'".<%!68+3AG'".<%QAE"0ED"0ED"0F5&25@&25@ + M%!68&25@%QAE"0ED%QAE&25@&25@$QDX"0ED05BDEYB;*S`^%!0V$QDX*S`^ + M*S`^%!0V#@\0@(``@(``@(``@(``@(``@(``@(``'A@8%!0V$QDX*S`^F8"0 + MF=#5>GZ=96^<96=I05BD+3AG+3AG(C&<+3AG+3AG+3AG+3AG'".<+3AG(C&< + M'".<+3AG+3AG(C&<+3AG%!68'".<'".<+3AG"0ED"0F5+3AG'".<+3AG'".< + M(C&<+3AG"0F5%QAE%!68'".<&25@%!68(C&<"0F5$QDX%!0V&25@0UIC+3AG + M"0F5%!68'".<%!68"0G+%!68'".<%!68%QAE(C&<559;0UIC(C&<#Q/-'2C3 + M'".<"0G+'2C3#Q/-"0G+"0G+"0G+'2C3'2C3"0G+'2C3(C&<"0F5%!68'2C3 + M%!68'2C3"0F5(C&<"0G+*47&"0G+'".<(C&<#Q/-(C&<96^<04F-05BD(C&< + M#Q/-'2C3'2C3"0G+(C&<'".<"0F5'2C3#Q/-"0F5"0F5'".<#Q/-'2C3%!68 + M'".<'".<"0F5+3AG'".<+3AG(C&<'".<'2C3(C&<"0F5"0G+%!68"0F5+3AG + M'".<'".<+3AG%!68+3AG%!68'".<&25@%!68"0ED"0F5(C&<%!68'".<(C&< + M+3AG"0F5%!68'".<%!68'".<%!68'".<"0G+%!68'2C3%!68'2C3"0F5"0G+ + M'2C3'".<#Q/-'".<#Q/-"0G+"0G+"0G+'2C3'2C3"0G+"0GS#Q/-"0G+"0GS + M2%S(66^\2%S(*47&*47&"0G+(C&<"0F5&25@+3AG(C&GZ=F8"0EYB;EYB;P+*UL)BHL)BH*S`^@(``@(``@(``@(``@(``@(``-3]` + MEYB;EYB;?Y?/96^<96=I04F-559;(C&<+3AG(C&<+3AG+3AG0UIC0UIC559; + M(C&<+3AG(C&<0UIC+3AG+3AG+3AG(C&<+3AG+3AG'".<%QAE%!68%!68+3AG + M'".<%!68&25@%!68+3AG%!68"0F5+3AG'".<'".<%!68%!68%!68+3AG%!68 + M"0ED*S`^+3AG(C&<'".<%!68'".<%!68'".<(C&<'".<%!68'".<%!68+3AG + M+3AG96=I+3AG(C&<%!68"0G+#Q/-"0G+"0G+"0G+"0GS"0G+#Q/-"0G+#Q/- + M"0F5'".<%!68'".<"0F5(C&<"0F5%!68%!68"0G+"0F5%!68(C&<04F-05BD + M96=I05BD96^<05BD'2C3%!68#Q/-%!68"0G+"0G+#Q/-%!68"0G+(C&<'".< + M%!68'2C3"0F5%!68&25@%QAE+3AG+3AG(C&<+3AG+3AG&25@+3AG"0ED%!68 + M+3AG'".<%!68&25@"0F5&25@%!68"0F5+3AG'".<'".<%QAE%!68"0F5&25@ + M%!68"0F5(C&<"0F5%!68'".<%!68'".<%!68(C&<(C&<'".<%!68'2C3"0G+ + M(C&<"0F5(C&<"0F5(C&<%!68"0G+#Q/-"0F5"0G+"0G+"0GS"0G+#Q/-"0GS + M"0G+"0G+"0GS"0G+'2C3'2C305BD(C&<%!68+3AG'".<(C&<(C&<'".<+3AG + M05BD559;0UIC*S`^#`P]$QDX*S`^%!0V@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``$QDXEYB;P+7"2%S("0GS"0GS#Q/-'2C3"0GS'2C3"0G+"0GS"0G+ + M"0GS"0GS#Q/-"0G+"0GS'2C3"0F5%!68'".<+3AG'".<%QAE'".<%QAE+3AG + M"0ED%QAE&25@%!68"0F5&25@"0ED"0F5"0ED"0ED&25@"0F5+3AG"0ED%QAE + M#`P]+3AG&25@&25@%QAE96=I?Y?/P+*UF:?,P+7"S\O1F=#5-3]`%!0V#`P] + M#@\0#`P]$QDX#`P]+3AGEYB;EYB;EYB;96^<&25@$QDX&25@+3AG+3AG(C&< + M0UIC+3AG(C&<+3AG0UIC+3AG0UIC(C&<+3AG%!68'".<%QAE'".<&25@'".< + M%!68+3AG'".<'".<&25@%!68'".<%!68'".<(C&<'".<%!68'".<%!68%!68 + M&25@'".<'".<%!68'".<"0ED*S`^+3AG+3AG&25@+3AG'".<%QAE'".<%!68 + M+3AG"0F5+3AG&25@+3AG(C&<+3AG(C&<%!68'".<'".<'2C3"0GS*47&"0G+ + M#Q/-"0G+'".<"0G+'".<%!68+3AG"0F5(C&<"0G+%!68'".<'2C3'".<#Q/- + M"0G+'".<(C&<05BD96^<96^<96^<96=I96^<*47&'2C3'".<"0F5(C&<"0F5 + M"0G+'".<"0G+"0G+"0F5+3AG%!68+3AG"0F5+3AG%!68'".<%QAE&25@&25@ + M+3AG%QAE+3AG'".<"0F5&25@%!68'".<"0F5'2C3%!68'".<%!68'".<%QAE + M%!68&25@'".<'".<%QAE'".<"0G+(C&<'".<%!68'".<%QAE'".<%!68'".< + M%!68"0F5"0G+"0F5"0G+#Q/-"0G+'".<"0G+"0G+"0G+'".<'2C3"0G+*47& + M"0GS#Q/-"0G+'2C3"0GS'2C3#Q/-"0G+"0G+*47&*47&(C&<'".<'".<+3AG + M(C&<'".<'".<%QAE05BD96^<+3AG@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``%!0V-3]`66^\66^\#Q/-"0G+"0G+ + M#Q/-"0G+#Q/-"0G+*47&"0G+"0G+"0GS'2C3"0G+#Q/-"0F5(C&<%!68"0F5 + M+3AG"0F5&25@%QAE'".<+3AG%!68'".<+3AG"0ED%QAE&25@%QAE&25@%QAE + M%QAE"0ED"0ED&25@%QAE&25@"0ED%QAE"0ED&25@&25@(C&<559;05BD0UIC + M96=I+3AG+3AG+3AG+3AG(C&<+3AG+3AG&25@%QAE(C&<(C&<+3AG+3AG+3AG + M+3AG+3AG05BD+3AG0UIC+3AG+3AG0UIC+3AG+3AG(C&<+3AG(C&<&25@'".< + M+3AG'".<%QAE%!68+3AG'".<%!68"0F5+3AG%!68+3AG'".<+3AG"0F5"0F5 + M+3AG+3AG'".<+3AG"0F5+3AG%!68%!68"0F5+3AG%QAE%QAE&25@+3AG%!68 + M'".<(C&<"0F5'".<%!68'".<+3AG%!68'".<+3AG+3AG%!68'".<(C&<'".< + M#Q/-#Q/-"0G+"0G+"0G+"0GS"0GS"0G+#Q/-"0G+'".<"0F5"0G+#Q/-'2C3 + M"0F5(C&<"0F5#Q/-'".<%!68*47&05BDGZ=96^<05BD*47& + M(C&<"0G+%!68'2C3%!68'".<%!68'".<+3AG%!68'".<'".<&25@%!68'".< + M"0F5'".<'2C3%!68%!68%!68'2C3%!68"0G+(C&<"0G+'".<"0G+(C&<"0F5 + M"0F5+3AG%QAE"0F5+3AG"0F5+3AG"0F5%QAE'".<'".<%!68%!68'".<(C&< + M%!68"0G+%!68"0G+'".<%!68'2C3'".<#Q/-'2C3(C&<"0F5#Q/-'2C3#Q/- + M'2C3#Q/-#Q/-"0G+"0G+"0G+"0G+"0GS"0G+*47&*47&'2C3"0G+"0G+#Q/- + M'2C3+3AG+3AG%QAE+3AG+3AG(C&<*47&+3AG96=IEYB;*S`^@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P] + M*S`^66^\F:?,#Q/-'2C3"0G+"0G+'2C3"0G+"0G+"0G+"0G+#Q/-"0G+'2C3 + M"0G+"0F5'2C3'".<%!68&25@%QAE+3AG"0F5%!68'".<"0F5+3AG"0ED'".< + M&25@%!68&25@%QAE"0ED&25@"0ED+3AG%!68"0ED&25@%QAE&25@"0ED%QAE + M$QDX+3AG"0ED&25@%QAE&25@&25@+3AG&25@0UIC&25@+3AG+3AG&25@*S`^ + M*S`^+3AG-3]`*S`^+3AG0UIC559;+3AG+3AG&25@(C&<+3AG'".<+3AG+3AG + M%!68+3AG%!68+3AG%!68%QAE%!68&25@'".<%!68'".<+3AG+3AG"0F5'".< + M"0F5+3AG"0F5+3AG%QAE'".<'".<%!68'".<"0F5'".<%!68'".<%!68"0F5 + M+3AG&25@&25@'".<+3AG%!68'".<%!68+3AG"0G+%!68'".<&25@96=I96^< + M?Y?/(C&<"0F5(C&<(C&<'".<'".<"0GS'2C3"0GS"0G+"0G+#Q/-'2C3"0G+ + M%QAE+3AG(C&<"0F5'".<#Q/-'".<"0G+"0F5'2C3(C&<(C&<96^<96^<05BD + M96=I96^<05BD0UIC0UIC+3AG'".<%!68%!68+3AG&25@%!68+3AG'".<%QAE + M+3AG(C&<(C&<%!68'".<"0G+%!68"0G+"0F5'2C3"0G+'".<"0F5"0F5"0F5 + M"0F5"0G+"0F5"0F5(C&<%!68'".<'".<%!68'".<"0F5"0F5%!68'".<%!68 + M"0F5'".<'".<"0F5'2C3'".<%!68'2C3"0G+(C&<"0G+"0G+"0G+"0G+"0G+ + M"0G+'2C3"0G+"0G+"0G+"0G+"0G+'2C3"0GS'2C3"0GS"0G+'2C304F-05BD + M2%S((C&<(C&<(C&<%!68'".<%QAE&25@+3AG*S`^F:?,S\O12%S(66^\?HF\ + M+3AG#@\0@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``%!0V>GZ=EYB;'2C3#Q/-"0G+#Q/-'2C3"0G+#Q/- + M'2C3"0G+'".<"0G+#Q/-"0F5#Q/-%!68(C&<"0F5+3AG"0F5&25@%!68+3AG + M+3AG"0F5+3AG%!68%QAE+3AG%QAE'".<%QAE%!68&25@%QAE"0ED'".<"0ED + M"0ED&25@%!68#`P]&25@"0ED"0ED"0ED%!0V+3AG"0ED+3AG+3AG+3AG%QAE + M&25@*S`^&25@*S`^+3AG0UIC+3AG+3AG&25@0UIC(C&<+3AG&25@'".<%QAE + M+3AG+3AG%!68'".<'".<%!68+3AG'".<%QAE'".<'".<'".<%!68+3AG&25@ + M%!68%!68'".<%!68+3AG'".<%!68'".<+3AG"0F5+3AG%!68%QAE+3AG%!68 + M+3AG'".<"0F5(C&<'".<%QAE*S`^%QAE+3AG+3AG"0F5+3AG"0F5&25@%!68 + M+3AG&25@"0ED96^GZ=#@\0@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8%!0V+3AG66^\*47& + M'2C3"0G+"0G+'2C3"0GS"0GS#Q/-"0G+"0G+"0G+(C&<'".<'".<"0F5'".< + M%!68"0F5+3AG"0F5'".<%!68+3AG'".<&25@&25@'".<"0ED"0ED&25@%QAE + M&25@'".<%QAE&25@%QAE&25@"0ED&25@%QAE"0ED&25@%!0V&25@%QAE&25@ + M%QAE"0ED&25@%QAE&25@%QAE&25@%QAE%QAE&25@&25@+3AG%QAE+3AG+3AG + M%QAE'".<+3AG%QAE+3AG'".<%!68&25@+3AG%!68'".<%QAE'".<%!68+3AG + M%!68+3AG'".<%!68%!68'".<&25@+3AG'".<%!68'".<(C&<"0F5"0F5%!68 + M'".<'".<'".<&25@'".<"0F5"0F5+3AG"0F5+3AG"0F5+3AG&25@+3AG%QAE + M&25@"0ED"0ED+3AG"0F5&25@%QAE0UIC?Y?/F=#5F=#505BD"0F5"0F5&25@ + M%!68'".<'2C3%!68"0F5%!68(C&<"0F5'".<%!68%QAE&25@+3AG'".<%!68 + M'2C3%!68"0F5'".<(C&<0UIC96=I05BD96=I96=I0UIC0UIC96=I+3AG+3AG + M+3AG%!68'".<%!68%!68'".<"0G+%!68(C&<0UIC96^<05BD96^<(C&<#Q/- + M'".<%!68%!68'2C3"0G+(C&<'".<'".<"0F5"0G+"0F5"0F5+3AG%!68&25@ + M%!68&25@'".<"0F5"0F5'".<"0F5"0G+%!68"0G+(C&<"0G+*47&'2C3"0F5 + M"0G+'2C3"0G+"0G+(C&<"0G+"0G+#Q/-'2C3"0G+"0G+"0G+'2C3"0G+"0G+ + M'2C3"0G+'2C3"0GS#Q/-"0G+#Q/-'".<'".<+3AG%QAE+3AG+3AG+3AG'".< + M(C&<'".<96^<96^<$QDX%!0V$QDX%!0V$QDX%!0V@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``'A@8&25@*47&*47&'2C3#Q/-"0G+#Q/-'2C3"0GS'2C3"0G+'".< + M"0F5"0G+%!68'2C3%!68'2C3'".<"0F5+3AG'".<"0F5'".<%QAE%!68%!68 + M%!68+3AG+3AG"0F5%QAE%QAE+3AG&25@+3AG"0F5"0ED%!0V"0ED&25@"0ED + M%QAE&25@"0ED"0ED&25@%QAE&25@"0ED+3AG"0ED%!0V"0ED"0ED&25@#`P] + M+3AG"0ED"0ED%QAE'".<"0ED"0ED%!68&25@&25@%QAE'".<%QAE"0F5+3AG + M&25@+3AG'".<%!68+3AG'".<%!68(C&<"0F5+3AG%!68(C&<"0F5%!68&25@ + M'".<%!68"0F5(C&<'".<%!68%QAE'".<%!68%!68%!68'".<%!68'".<%!68 + M+3AG&25@(C&<%QAE&25@%!0V$QDX#`P]#`P]*S`^0UICF8"0F=#5S\O1F:?, + M66^\%!68%QAE+3AG"0ED%QAE%!68"0F5"0F5&25@"0F5"0ED%QAE%QAE&25@ + M'".<%!68+3AG"0F5%!68'".<+3AG+3AG+3AG96=I0UIC96=I0UIC0UIC0UIC + M559;96=I05BD(C&<%!68'2C3"0F5"0F5#Q/-'".<"0F5%!68(C&<96^<96^< + MGZ=96=I559;05BDF:?,EYB;$QDX + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDXF8"0 + MF:?,2%S("0G+"0G+#Q/-"0G+'2C3"0G+"0G+"0G+*47&"0G+%!68"0G+%!68 + M'2C3"0G+"0F5'".<"0F5+3AG'".<%QAE%!68'".<'".<%!68%!68+3AG"0F5 + M%QAE'".<&25@%QAE'".<+3AG+3AG"0ED"0ED%QAE%QAE"0ED"0ED"0ED&25@ + M+3AG"0ED%!0V"0ED+3AG"0ED"0ED"0ED&25@"0ED'".<"0ED%QAE"0ED"0ED + M+3AG"0ED"0ED+3AG"0F5"0F5+3AG%QAE%!68+3AG&25@'".<"0F5+3AG'".< + M+3AG'".<%!68%!68%!68"0F5&25@%QAE'".<'".<'".<'".<"0F5+3AG'".< + M%!68'".<'".<(C&<"0F5(C&<%!68'".<"0F5'".<+3AG*S`^#`P]%!0V$QDX + M%!0V$QDX&25@$QDX0UIC2%S(F:?,F:?,04F-%!68"0F5"0F5%!68"0ED%QAE + M"0F5%QAE'".<"0F5%!68"0F5&25@+3AG'".<+3AG%!68+3AG'".<+3AG(C&< + M0UIC0UIC+3AG559;+3AG96=I96=I+3AG0UIC96=I0UIC05BD+3AG%!68"0F5 + M'".<+3AG"0F5"0F5(C&<'".<%!68+3AG+3AG96=I96=I0UIC0UIC+3AG96=I + M+3AG+3AG+3AG(C&<+3AG96=I+3AG0UIC+3AG'".<"0F5'".<"0F5"0F5'".< + M"0F5%!68'".<'".<"0F5"0F5(C&<#Q/-'2C3"0G+'2C3"0F5*47&"0G+#Q/- + M"0G+#Q/-'2C3"0G+"0G+'2C3"0G+*47&"0G+"0G+#Q/-"0G+'2C3#Q/-"0G+ + M%!68#Q/-+3AG)T2E&25@+3AG+3AG+3AG+3AG+3AG+3AG%QAE559;F:?,+3AG + M+3AG>GZ=559;%!0V'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``'A@8+3AG96=IF:?,'2C3"0F5'2C3"0GS#Q/-"0GS'2C3"0GS + M"0G+"0G+'".<"0F5"0G+"0F5(C&<%!68'".<%!68"0F5"0F5&25@+3AG%!68 + M+3AG"0F5(C&<'2C3'".<"0G+(C&<%!68&25@%QAE"0ED"0ED%QAE&25@&25@ + M"0ED&25@&25@%QAE"0ED"0ED"0F5&25@"0ED"0ED"0ED+3AG"0F5%QAE"0ED + M%QAE"0ED"0ED+3AG"0ED"0ED&25@"0F5"0ED&25@+3AG"0F5'".<&25@"0F5 + M+3AG%!68%QAE'".<%!68%!68&25@%!68&25@'".<%!68(C&<%!68%!68(C&< + M%!68#Q/-(C&<"0F5(C&<"0F5+3AG+3AG%!68+3AG&25@"0F5%QAE"0ED$QDX + M#`P]````#`P]#@\0*S`^*S`^+3AGEYB;F:?,05BD(C&<(C&<*47&'".<&25@ + M"0F5"0ED"0ED&25@"0ED&25@"0F5%QAE"0F5&25@%QAE"0ED"0F5%QAE'".< + M'".<+3AG0UIC0UIC96=I+3AG+3AG(C&<,4)F+3AG0UIC+3AG96=I05BD559; + M+3AG+3AG+3AG'".<+3AG"0ED%!68+3AG%!68+3AG'".<+3AG%!68'".<0UIC + M+3AG-3]`96=I96=I0UIC+3AG(C&<+3AG559;2&V"05BD96^<96=I(C&<*47& + M(C&<%!68#Q/-(C&<"0G+(C&<"0G++3AG"0ED"0G+%!68'".<"0G+%!68"0G+ + M'".<"0G+"0G+"0G+'2C3"0G+"0G+"0G+(C&<#Q/-'2C3"0G+"0G+"0G+"0G+ + M'2C3*47&(C&<(C&<(C&<'".<&25@+3AG*S`^%QAE96=IF8"0?Y?/96^<559; + M(C&<&25@+3AG-3]`#@\0'A@8*S`^@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^?Y?/66^\*47&"0G+ + M"0G+'2C3#Q/-"0G+#Q/-"0GS#Q/-"0G+'2C3%!68'".<%!68'".<"0F5+3AG + M&25@+3AG%QAE"0F5'".<#Q/-'2C3"0G+"0G+#Q/-"0G+'".<"0F5+3AG'".< + M+3AG&25@+3AG%QAE#`P]"0ED%QAE"0ED"0ED&25@%QAE"0ED%QAE+3AG"0ED + M&25@"0ED"0ED&25@"0ED&25@%QAE&25@"0ED&25@%QAE"0ED'".<%QAE"0F5 + M%QAE'".<+3AG%!68"0F5+3AG'".<'".<%!68'".<+3AG"0F5'".<%!68'".< + M+3AG"0F5'".<'".<"0F5'".<'".<"0F5'".<%!68"0ED%QAE'".<&25@&25@ + M"0ED#`P]$QDX%!0V````'A@8%!0V*S`^+3AG0UIC96=I0UICF:?,F:?,05BD + M+3AG'".<"0ED%QAE"0F5&25@%!68&25@"0F5"0F5%QAE"0F5'".<"0F5+3AG + M"0ED&25@"0ED+3AG(C&<+3AG(C&<559;0UIC96=I0UIC+3AG+3AG%!68+3AG + M+3AG0UIC0UIC0UIC0UIC+3AG+3AG%!68&25@%!68'".<+3AG%!68'".<+3AG + M%!68%QAE'".<+3AG(C&<(C&<96=I0UIC2&V"96^<05BD05BD(C&<05BD96^< + M2&V"GZ=F:?,F:?, + MF:?,?Y?/2%S(+3AG'".<"0F5"0F5"0F5"0ED&25@"0ED"0ED"0F5%QAE"0ED + M&25@"0F5%QAE%!68"0F5"0ED%!68&25@+3AG+3AG0UIC96=I0UIC0UIC+3AG + M0UIC'".<+3AG%!68%!68'".<(C&<+3AG(C&<(C&<+3AG%!68+3AG"0F5+3AG + M'".<"0F5(C&<"0F5#Q/-'".<#Q/-'".<"0G+"0G+(C&<2%S(66^\96^<>GZ= + M66^\?Y?/66^\>GZ=96^<96^<05BD96^<96^<(C&<05BD#Q/-"0G+#Q/-'".< + M%!68'".<(C&<"0F5#Q/-"0F5'".<#Q/-'".<"0F5'2C3'2C3(C&<'2C3#Q/- + M"0G+"0G+"0G+"0GS"0G+'2C3#Q/-"0G+"0G+'2C3+3AG&25@+3AG%QAE+3AG + M+3AG+3AG%!68+3AG+3AGF:?,EYB;559;$QDX#`P]*S`^>GZ=EYB;'A@8@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``#@\0$QDX96^GZ=96^<#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^?HF\ + M96^<#Q/-'2C3"0G+"0F5"0G+#Q/-'2C3"0G+%!68'".<"0F5'".<%!68&25@ + M'".<"0F5"0ED"0F5(C&<'".<"0G+'2C3?Y?/P+*UF=#5?Y?/96^<96^<+3AG + M&25@*S`^#`P]*S`^"0ED&25@*S`^%QAE&25@"0ED"0ED*S`^"0ED"0ED%QAE + M$QDX%QAE"0ED&25@%QAE"0ED&25@%QAE"0ED"0ED+3AG"0ED"0ED%!68"0ED + M%!68+3AG"0ED%!68'".<"0F5+3AG%!68'".<%!68'".<%QAE'".<"0F5%!68 + M"0F5%!68+3AG%!68'".<"0F5"0ED%QAE#`P]*S`^$QDX#`P]#`P]'A@8'A@8 + M%!0V*S`^96=IF=#5U=3>SMK=U=3>X.#GF=#566^\96^<'".<"0ED"0ED%!68 + M"0ED'".<"0F5"0ED"0ED+3AG&25@"0ED'".<"0ED+3AG"0ED'".<%QAE%!68 + M"0F5"0F5*S`^*S`^-3]`+3AG0UIC0UIC96^<05BD(C&<"0G+'".<"0G+"0G+ + M"0GS'2C3#Q/-#Q/-'2C3#Q/-"0GS'2C3#Q/-"0G+"0GS*47&"0GS"0G+"0GS + M"0G+"0G+*47&"0G+"0GS'2C3"0GS'2C3*47&2%S(66^\?Y?/?Y?/?Y?/96^< + M96^<96^<96^<05BD2%S('".<'".<'".<#Q/-"0F5(C&<&25@"0G+"0G+#Q/- + M'".<"0G+'".<#Q/-'2C3"0G+'2C3"0G+#Q/-'2C3"0G+%!68'2C3"0G+'".< + M04F-0UIC&25@"0ED"0ED%QAE*S`^&25@+3AG05BD96^<96=I(C&<05BD559; + M%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``*S`^?Y?/F:?,(C&<"0F5+3AG"0G+'2C3"0F5"0G+%!68 + M"0F5#Q/-'".<"0F5"0F5%!68%QAE+3AG'".<'".<%!68#Q/-66^\F:?,F:?, + M?Y?/66^\(C&<&25@0UIC*S`^+3AG%!0V$QDX%!0V+3AG"0F5+3AG&25@+3AG + M"0ED+3AG"0ED#`P]&25@"0ED"0ED"0ED&25@"0ED$QDX#`P]"0ED$QDX&25@ + M"0ED%!0V"0ED%!0V&25@"0ED"0ED'".<%!68%QAE'".<%!68"0F5+3AG&25@ + M%!68&25@%!68"0ED&25@&25@+3AG(C&<+3AG%!68"0F5'".<"0ED"0ED#`P] + M#`P]'A@8#`P]%!0V0UICEYB;F:?,EYB;S\O1U=3>X^KKU=3>S\O1>GZ=(C&< + M%QAE"0ED%QAE&25@"0F5"0F5%!68%QAE*S`^&25@&25@"0ED"0F5%QAE"0ED + M"0F5"0F5%QAE"0F5&25@+3AG"0ED%QAE+3AG0UIC*S`^*S`^&25@+3AG&25@ + M(C&<"0G+#Q/-"0G+"0G+'2C3"0G+"0GS"0G+"0G+"0GS"0G+"0G+"0G+'2C3 + M"0G+"0G+%!68"0G+#Q/-'2C3"0G+"0G+"0GS"0G+"0G+"0GS"0GS"0GS(C&< + M(C&<2%S(05BD2%S(0UIC2&V"05BD96^<*47&(C&<#Q/-(C&<'".<%!68'".< + M"0F5"0F5%!68"0G+"0G+"0G+*47&"0G+#Q/-"0G+"0G+*47&"0G+(C&<'".< + M"0G+%!68"0F5%!68&25@%QAE&25@%QAE*S`^*S`^&25@&25@+3AG04F-*S`^ + M+3AG?HF\?Y?/96^<96^<$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^F=#5U=3>2%S(#Q/-"0F5 + M"0G+"0G+#Q/-"0G+'".<"0F5(C&<"0F5(C&<'2C3+3AG%!68'".<%!68%!68 + M(C&<05BD?Y?/F=#5F:?,?Y?/*47&+3AG'".<+3AG+3AG-3]`$QDX#`P]&25@ + M"0ED&25@"0F5%!68#`P]&25@"0ED&25@%QAE%QAE%!0V&25@%QAE"0ED+3AG + M%QAE"0ED+3AG%QAE#`P]"0ED&25@&25@"0ED&25@%!68%QAE'".<"0F5'".< + M+3AG"0F5"0ED%!68%QAE+3AG%!68"0F5'".<#Q/-%!68'".<%!68"0F5'".< + M"0ED%!68&25@%!0V$QDX*S`^&25@*S`^$QDX5B@>P+7"S\O1F:?,F=#5Q,32 + M?Y?/66^\(C&<%QAE&25@$QDX#`P]'A@8#`P]%QAE'".<&25@"0ED&25@%!0V + M%QAE&25@"0ED"0ED&25@%QAE+3AG"0ED+3AG"0F5%QAE'".<&25@&25@"0ED + M&25@"0ED&25@"0ED"0ED"0ED'".<"0F5"0F5%!68"0G+#Q/-'2C3#Q/-"0GS + M*47&"0G+"0GS"0G+"0GS"0G+"0GS'2C3'2C3"0G+'".<"0G+#Q/-'2C3"0G+ + M"0G+*47&#Q/-*47&*47&*47&*47&#Q/-'2C3(C&<*47&*47&'2C3%!68'".< + M'".<(C&<*47&&25@%QAE'".<%!68'2C3#Q/-'2C3%!68"0G+'2C3"0G+'2C3 + M#Q/-"0G+"0F5'".<%QAE'".<+3AG"0ED+3AG%!0V*S`^&25@+3AG"0ED&25@ + M"0ED%QAE+3AG96=I$QDX#@\0*S`^*S`^*S`^*S`^#`P]@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8 + MF8"0EYB;(C&<(C&<'".<(C&<"0G+'2C3%!68"0F5"0F5"0G+'".<"0G+%!68 + M"0F5+3AG'".<+3AG&25@'".<66^\F:?,F=#5?Y?/2%S(*47&+3AG&25@+3AG + M0UIC*S`^%!0V%!0V%!0V"0ED+3AG+3AG&25@%QAE$QDX%QAE+3AG"0ED&25@ + M%QAE"0ED&25@+3AG"0F5&25@+3AG&25@"0ED&25@+3AG%QAE"0F5+3AG&25@ + M+3AG'".<+3AG&25@%!68"0ED"0F5'".<+3AG'".<&25@"0G+"0F5%!68'".< + M(C&<%!68'".<%!68"0F5"0F5"0ED"0ED%!0V"0ED*S`^"0ED*S`^#`P]*S`^ + MP+*UU\O-96=I66^\66^\05BD(C&<"0F5&25@%!0V"0ED*S`^#`P]$QDX"0F5 + M%!68"0F5+3AG&25@*S`^&25@"0ED"0ED%QAE"0F5&25@"0F5"0ED%QAE'".< + M%QAE+3AG"0ED%QAE%QAE"0ED"0ED%QAE*S`^$QDX%QAE"0ED%!68"0ED"0F5 + M'".<#Q/-"0F5'2C3"0F5"0G+'2C3#Q/-'2C3"0G+'2C3#Q/-"0G+"0G+#Q/- + M'2C3%!68"0G+(C&<"0F5#Q/-*47&'2C32%S(2%S(*47&'2C3"0G+'".<#Q/- + M'2C3(C&<(C&<'2C3%!68#Q/-(C&<'".<%!68%QAE"0F5"0F5"0G+"0G+"0G+ + M"0G+'".<#Q/-'".<#Q/-"0F5"0F5(C&<(C&<&25@*S`^"0ED+3AG&25@&25@ + M"0ED%QAE05BD96=I(C&<+3AG&25@(C&GZ=EYB;F=#5?Y?/ + M66^\2%S(+3AG(C&<(C&<0UIC+3AG'A@8&25@$QDX+3AG'".<'".<%QAE$QDX + M*S`^+3AG+3AG+3AG&25@+3AG+3AG&25@%QAE+3AG&25@(C&<%!68+3AG+3AG + M%QAE&25@+3AG+3AG"0ED+3AG&25@%!68+3AG+3AG'".<%QAE+3AG0UIC(C&< + M(C&<%!68'2C3"0F5"0G+"0F5'".<%!68"0F5"0F5%QAE&25@#`P]&25@+3AG + M&25@%QAE'".<*S`^+3AGF=#5S\O1559;+3AG'".<%!68'".<+3AG'".<'".< + M%!68&25@%!0V"0ED"0ED(C&<'".<%QAE+3AG(C&<'".<+3AG&25@"0ED&25@ + M"0ED%QAE'".<+3AG&25@"0F5+3AG"0F5&25@"0ED$QDX%QAE"0ED"0ED"0ED + M"0ED&25@"0F5&25@%QAE"0F5"0F5"0ED"0F5%!68"0F5"0F5"0F5"0F5%!68 + M"0G+"0F5'".<"0F5%!68"0G+'".<"0F5%!68"0F5(C&<2%S(96^<96^<05BD + M*47&%!68"0G+'2C3"0G+"0G+"0G+'".<#Q/-'".<'".<(C&<'".<%!68'".< + M(C&<'".<#Q/-"0G+'".<#Q/-"0F5%!68(C&<(C&<'".<"0F5&25@*S`^"0ED + M&25@%QAE&25@%QAE%QAE#`P]+3AGF:?,P+7"EYB;96^<(C&<96^GZ=*S`^@(``%!0VEYB;EYB;%!0V@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``'A@8>GZ=EYB;#Q/-(C&<"0G+'2C3#Q/-'2C3#Q/-%!68 + M'".<"0F5&25@'".<"0F5"0F5"0F5"0F5"0G+(C&<%QAE%!0V$QDX+3AG(C&< + M*47&&25@2%S(66^\*47&559;+3AG%!0V%!68+3AG%!68&25@"0ED"0ED'".< + M+3AG+3AG*S`^&25@+3AG+3AG+3AG+3AG*S`^+3AG&25@*S`^&25@+3AG+3AG + M&25@+3AG&25@+3AG+3AG05BD0UIC+3AG(C&<"0F5%!68+3AG0UIC(C&<'".< + M%!68"0F5(C&<+3AG+3AG'".<%!68"0ED"0ED%!0V$QDX&25@+3AG+3AG%!68 + M+3AG)T2E%QAE0UICQ,32]OW^F=#596=I*47&2%S(*47&'2C3(C&<'".<(C&< + M%QAE&25@#`P]$QDX&25@"0ED"0ED"0ED+3AG+3AG-3]`+3AG*S`^&25@%QAE + M"0ED%!68&25@%!68+3AG%!68%!68"0F5%QAE%QAE$QDX%QAE&25@"0ED"0ED + M&25@"0ED"0ED#`P]"0ED%!68"0ED"0ED"0ED&25@%QAE"0ED&25@"0F5%QAE + M"0ED&25@"0ED&25@"0ED%QAE'".<&25@%QAE%QAE&25@+3AG+3AG&25@%QAE + M"0ED%!68"0F5"0F5(C&<%!68"0F5%!68(C&<"0F5+3AG&25@&25@+3AG+3AG + M%!68%QAE&25@%QAE&25@%!68+3AG&25@*S`^"0ED+3AG%QAE&25@+3AG>GZ= + MF:?,+3AG+3AG&25@+3AG05BD96=I*S`^@(``@(``@(``'A@8%!0V'A@8@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]2%S(2%S("0G+"0G+#Q/- + M"0G+"0F5'2C3"0F5'".<"0F5#Q/-"0G+%!68"0G+"0F5(C&<"0G+*47&"0G+ + M"0F5&25@%QAE&25@'".<'".<+3AG(C&<2%S(05BD-3]`*S`^+3AG&25@'".< + M&25@"0ED+3AG%QAE+3AG+3AG&25@+3AG*S`^+3AG+3AG+3AG+3AG+3AG%QAE + M+3AG+3AG+3AG0UIC+3AG+3AG0UIC+3AG%QAE&25@+3AG96=I'".<&25@'".< + M(C&<05BD*47&'2C3 + M(C&<*47&+3AG&25@*S`^&25@#`P]%!0V"0ED%QAE"0G+"0F5(C&<"0F5(C&< + M%!68(C&<'".<%QAE"0ED&25@"0ED+3AG"0F5'".<&25@+3AG&25@"0ED&25@ + M"0ED#`P]"0ED*S`^"0ED%QAE"0ED&25@%QAE&25@"0ED+3AG"0ED%QAE"0ED + M"0ED"0ED%QAE"0ED$QDX"0ED#`P]&25@%QAE%QAE&25@%QAE%QAE&25@*S`^ + M+3AG+3AG+3AG"0ED"0ED+3AG"0ED&25@"0ED'".<"0F5+3AG&25@"0ED&25@ + M"0ED+3AG+3AG&25@"0F5&25@&25@"0ED*S`^&25@0UIC(C&<+3AG#`P]"0ED + M&25@*S`^+3AG96=I0UIC*S`^*S`^96^<96^<(C&GZ=96^< + MEYB;EYB;559;@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``'A@8?Y?/F:?,2%S("0G+*47&"0G+(C&<"0F5'".<'".< + M"0F5"0GS'2C3#Q/-"0F5%!68"0ED'".<(C&<"0G+"0GS"0G+#Q/-"0F5'".< + M%!68"0ED&25@%QAE*S`^"0ED"0ED&25@+3AG%!68&25@"0ED+3AG"0ED&25@ + M%QAE*S`^"0ED%QAE'".<%QAE+3AG"0ED&25@+3AG%QAE*S`^"0ED*S`^%QAE + M&25@+3AG%QAE&25@%QAE+3AG+3AG"0ED&25@&25@*S`^%QAE%QAE&25@%QAE + M+3AG"0ED*S`^#`P]#`P]$QDX$QDX$QDX"0ED+3AG'".<+3AG&25@"0F5&25@ + M+3AG05BDF=#5X.#G]OW^X^KKF=#5+3AG$QDX#`P]*S`^#`P]'A@8#@\0$QDX + M$QDX````%QAE*S`^%!0V#`P]%QAE#`P]$QDX'A@8#`P]%!0V#`P]*S`^#`P] + M"0ED"0ED"0ED'".<%!68&25@'".<"0ED&25@&25@*S`^$QDX#`P]*S`^#`P] + M$QDX%QAE$QDX#`P]%!0V"0ED#`P]*S`^"0ED"0ED%!0V#`P]#`P]"0ED*S`^ + M#`P]$QDX#`P]%QAE&25@%QAE"0ED*S`^*S`^&25@&25@%QAE"0F5"0ED&25@ + M"0ED+3AG"0ED*S`^#`P]%!0V$QDX$QDX$QDX#`P]*S`^&25@*S`^$QDX"0ED + M&25@+3AG&25@#`P]%QAEF:?,SMK=F=#5F8"096^<+3AG+3AG(C&F:?,*S`^```````` + M#`P]````#`P]'A@8````%!0V#`P]*S`^*S`^5B@>*S`^'A@8%!0V#`P]'A@8 + M#@\0'A@8$QDX%!0V$QDX"0ED&25@%QAE&25@%QAE&25@%QAE+3AG%!68"0ED + M*S`^%!0V#@\0%!0V#`P]%!0V$QDX%!0V"0ED#@\0$QDX%!0V$QDX#`P]$QDX + M%!0V$QDX%!0V#`P]#@\0#`P]%!0V&25@"0ED%!0V&25@#`P]#`P]%QAE$QDX + M%QAE$QDX&25@%!0V&25@#`P]#`P]%QAE$QDX#`P]*S`^#`P]%!0V*S`^#`P] + M%!0V0UIC+3AG%!0V#`P]*S`^%!0V"0ED*S`^*S`^L)BHU\O-U=3>U\O-S\O1 + MF:?,66^\+3AG+3AG'A@8````````````*S`^F:?,>GZ=05BD>GZ=*S`^@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``*S`^04F-(C&<%!68'".<'".<%!68'".<+3AG'".<(C&<"0G+#Q/-"0G+ + M%!68'".<"0F5"0F5"0F5"0GS"0GS"0G+"0G+%!68%QAE&25@%QAE&25@%QAE + M&25@+3AG"0F5%!68'".<%QAE"0F5"0F5$QDX#`P]#`P]'A@8$QDX%!0V+3AG + M0UIC0UIC%QAE````#`P]````#`P]$QDX%!0V#@\0%!0V````$QDX'A@8'A@8 + M#`P]'A@8#`P]$QDX%!0V````'A@8#`P]%!0V0UIC(C&<0UIC05BD04F-0UIC + M'".<'".<+3AG'".<+3AG'".<+3AG&25@(C&<+3AG96^ + MJ:VO>GZ=*S`^%!0V#@\0'A@8'A@8*S`^'A@8*S`^5B@>*S`^5B@>5B@>HC\G + M5B@>5B@>'A@8*S`^*S`^#`P]#`P]%!0V#`P]"0ED%!0V%QAE'".<%!68+3AG + M(C&<'".<+3AG"0F5%QAE$QDX'A@8%!0V$QDX'A@8#`P]$QDX%!0V$QDX%!0V + M%!0V$QDX#`P]%!0V#@\0#`P]*S`^#`P]$QDX%!0V$QDX%!0V+3AG&25@%!0V + M%!0V#`P]'A@8#`P]$QDX%QAE#`P]%!0V#`P]"0ED*S`^#`P]*S`^$QDX%!0V + M$QDX$QDX#`P]'A@8$QDX*S`^96=IGZ=EYB;96^<*S`^````%!0V#@\0%!0V#@\0'A@8#`P] + M$QDX%!0V#`P]#@\0#`P]*S`^*S`^%!0V*S`^#`P]$QDX#`P]*S`^96=I96^< + M?Y?/66^\F:?,?Y?/96^<05BD(C&<(C&<(C&<(C&<*47&96=I96=IHC\GSVQ$ + MN7YBS\O1U=3>U\O-S\O196=I*S`^*S`^5B@>*S`^'A@8HC\GHC\GLUD\HC\G + MHC\GHC\GLUD\LUD\HC\G5B@>5B@>$QDX+3AG559;&25@*S`^$QDX*S`^$QDX + M"0ED&25@%QAE+3AG'".<%QAE+3AG&25@&25@%QAE$QDX#`P]'A@8%!0V#`P] + M$QDX%!0V$QDX"0ED#`P]$QDX'A@8#`P]*S`^#`P]%!0V$QDX%QAE$QDX'A@8 + M"0ED&25@*S`^%QAE$QDX#`P]%!0V$QDX%!0V*S`^#`P]$QDX#`P]%!0V*S`^ + M%!0V#`P]#`P]%!0V#`P]%!0V*S`^#`P]%!0V$QDX%!0V96^GZ=559; + M*S`^*S`^#`P]%QAE96=IEYB;EYB;EYB;EYB;L)BHF:?,EYB;P+7"EYB;EYB; + MEYB;96^<04F-66^\?Y?/F:?,P+*US\O1F=#5P+7"L)BH0UIC*S`^$QDX'A@8 + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB;L)BH>GZ=+3AG%!0V'A@8 + M#`P]"0ED"0F5(C&<"0F5(C&<"0F5%!68'".<"0G+#Q/-'2C3"0G+'2C3#Q/- + M"0F5"0G+"0G+"0G+"0G+(C&<"0F5&25@"0ED#`P]&25@#`P]%QAE&25@'".< + M%!68&25@"0ED'A@8%!0V#@\0#`P]*S`^*S`^559;P+7"P+*U*S`^#@\0#`P] + M#@\0#`P]$QDX%!0V'A@8#`P]'A@8$QDX'A@8$QDXF8"0>GZ=%QAE'A@8#`P] + M%!0V*S`^$QDX$QDX*S`^*S`^$QDX*S`^0UIC96^<*47&05BDF=#5U=3>S\O1 + MF=#5N7YBLUD\HC\GN7YBSVQ$N7YBSVQ$N7YBLUD\HC\GHC\G*S`^%!0V'A@8 + M5B@>(C&<559;LUD\LUD\HC\GSVQ$LUD\HC\G559;*S`^%!0V0UIC*S`^+3AG + M04F-*S`^"0ED%QAE%QAE#`P]*S`^"0F5&25@"0F5+3AG'".<%QAE%QAE$QDX + M#`P]%!0V$QDX+3AG*S`^%!0V$QDX%!0V*S`^#`P]*S`^#`P]*S`^#`P]$QDX + M#`P]*S`^#`P]$QDX"0ED*S`^"0ED*S`^$QDX%!0V$QDX%!0V$QDX#`P]'A@8 + M#`P]%!0V*S`^$QDX#`P]$QDX'A@8$QDX*S`^$QDX'A@8$QDX*S`^#`P]%!0V + M*S`^>GZ=L)BHEYB;N7YB>GZ=559;$QDX*S`^>GZ=EYB;F:?,EYB;F=#5EYB; + MEYB;P+*UEYB;96^<04F-96^<96^SVQ$SVQ$SVQ$HC\GSVQ$HC\G + MLUD\HC\G'A@8'A@8'A@8+3AG(C&<559;LUD\HC\GHC\GHC\GHC\G559;+3AG + M$QDX*S`^96^<*S`^*S`^96^<*S`^#`P]$QDX*S`^#`P]%!0V"0ED%!68%QAE + M&25@%!68'".<'".<"0ED$QDX%!0V*S`^559;*S`^"0ED#`P]%!0V$QDX#`P] + M*S`^#`P]$QDX#`P]'A@8%!0V$QDX%!0V%!0V+3AG&25@%QAE$QDX#`P]*S`^ + M*S`^#`P]'A@8#`P]#`P]%!0V$QDX%!0V#`P]%!0V%!0V#`P]#`P]"0ED$QDX + M%!0V$QDX%!0V#`P]$QDX0UICEYB;F:?,EYB;EYB;EYB;96=I*S`^559;EYB; + MEYB;J:VOEYB;EYB;EYB;EYB;96^<>GZ=96^<05BD(C&*S`^'A@8@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``5B@>F:?,L)BHEYB;EYB;L)BHEYB;N7YB>GZ= + M?V]^96=I+3AG559;*S`^*S`^$QDX#`P]%!0V%!0V*S`^%!68(C&<66^\05BD + M96^<*47&(C&<"0F5(C&<'2C3"0F5"0F5'2C3%!68(C&<'2C3*47&'2C3'2C3 + M"0F5'2C3"0ED&25@"0ED#`P]%QAE#`P]'".<%!68&25@#`P]$QDX'A@8#@\0 + M'A@8*S`^F:?,EYB;%!0V'A@8*S`^559;$QDX````*S`^96^GZ=+3AG + M````'A@8#`P]-3]`96^<-3]`$QDX+3AG$QDX'A@8-3]`>GZ=N7YB'A@8```` + M#@\0*S`^EYB;66^\(C&<"0F5(C&<2%S(2%S(F:?,N7YBN7YBSVQ$HC\GSVQ$ + M?V]^HC\GLUD\HC\GN7YBHC\G5B@>*S`^*S`^559;04F-HC\GHC\GHC\GHC\G + MLUD\SVQ$559;*S`^+3AG5B@>*S`^#`P]$QDX"0ED&25@*S`^ + M+3AG+3AG%!0V#`P]$QDX"0ED$QDX$QDX%!0V$QDX*S`^$QDX#`P]*S`^$QDX + M$QDX*S`^%!0V*S`^+3AG$QDX#`P]*S`^%!0V%QAE559;N7YBEYB;EYB;EYB; + MN7YBEYB;EYB;EYB;EYB;F:?,EYB;EYB;>GZ=96^<96^<04F-96^<96^'A@8*S`^>GZ=+3AG%QAE + MGZ=05BD'".<"0G+%!68"0GS"0GS'2C32%S( + MN7YBN7YBSVQ$LUD\5B@>5B@>HC\G?V]^SVQ$LUD\5B@>%!0V*S`^05BD05BD + M5B@>*S`^%!0V5B@>5B@>559;?V]^+3AG%QAE+3AGEYB;P+7"-3]`'A@8%!0V + M0UICF:?,EYB;5B@>96=I96^<*S`^"0ED&25@+3AG(C&<+3AG%!68&25@+3AG + M+3AG96=I?V]^0UICGZ=EYB;EYB;EYB;EYB;F8"0EYB;EYB;EYB;EYB;>GZ=96^<04F-(C&<(C&< + M96^LUD\LUD\HC\GHC\G + M*S`^$QDX+3AG(C&<(C&<*S`^````````#`P]5B@>5B@>N7YB(C&<(C&<>GZ= + MP+7"EYB;*S`^*S`^+3AG'A@8EYB;EYB;96=I>GZ=96=I*S`^"0ED%QAE+3AG + M'".<+3AG+3AG'".<%!680UIC96=I96=I96^<96^<96=I+3AG%!0V#`P]+3AG + M96=I#`P]%!0V + M$QDX$QDX#`P]*S`^+3AG96=I*S`^%!0V$QDX$QDX#`P]%!0V*S`^559;?V]^ + M96=I559;+3AG%!0V+3AGN7YBEYB;EYB;EYB;EYB;EYB;EYB;EYB;EYB;F8"0 + M96^<05BD'".<+3AG04F-66^\F=#5S\O1P+7"F=#5P+7"S\O1P+*UF:?,S\O1 + MF=#5P+7"S\O1P+7"S\O1F=#5P+*UP+7"S\O1S\O1S\O1S\O1U\O-U=3>U\O- + MX^KKS\O196=I5B@>0UIC559;559;*S`^@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``$QDX*S`^+3AG*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``*S`^EYB;EYB;>GZ=96^<96=I0UIC*S`^+3AG + M*S`^+3AG+3AG*S`^*S`^+3AG*S`^0UIC-3]`+3AG-3]`&25@+3AG96^GZ=559;$QDX*S`^2%S( + M2%S("0G+"0GS"0G+"0GS"0F5+3AG"0ED#`P]````$QDX'A@8#@\0'A@8#@\0 + M*S`^EYB;*S`^@(``@(``@(``*S`^EYB;96^<05BDEYB;*S`^'A@8*S`^96^< + M?Y?/559;J:VOEYB;$QDX@(``#@\0*S`^F8"0>GZ=*S`^````````+3AGEYB; + M>GZ=(C&<'".<"0G+"0GS"0GS"0GS"0GS"0GS2%S(N7YBN7YBSVQ$SVQ$SVQ$ + M?V]^5B@>%!0V*S`^'A@8+3AG(C&<+3AG&25@'A@8%!0V'A@8#`P]'A@8HC\G + MN7YBP+7"J:VOL)BHP+7"96=I*S`^+3AGL)BHEYB;*S`^$QDX559;>GZ=5B@> + M$QDX&25@"0ED&25@+3AG%QAE&25@+3AG%!68+3AG+3AG0UIC?V]^96=I96=I + MGZ=F8"0>GZ=?V]^96=I96=IF8"0EYB;EYB;N7YB>GZ= + MEYB;96^<96^<96^<05BD559;(C&<96^*S`^ + M*S`^'A@8$QDX*S`^'A@8$QDX'A@8#`P]@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``$QDX'A@8*S`^F8"0F=#5EYB;%!0V@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0V559;F=#5U=3> + MS\O1F:?,?Y?/96=I0UIC05BD0UIC0UIC0UIC+3AG-3]`0UIC*S`^5B@>0UIC + M+3AG-3]`+3AG+3AG2%S(05BD2%S(05BD'".<(C&<"0F5+3AG(C&P+*U96=I*S`^$QDX@(``@(``@(``*S`^*S`^ + M'A@8````*S`^F8"096^<(C&<(C&<#Q/-"0G+"0G+"0GS"0G+"0GS"0F5*47& + MN7YBSVQ$SVQ$N7YBSVQ$SVQ$*S`^*S`^$QDX$QDX%QAE*S`^*S`^'A@8'A@8 + M````````'A@8*S`^N7YBP+*UP+*UP+7"S\O1S\O1S\O1?HF\>GZ=F:?,F:?, + M%!0V````'A@8%!0V````%!0V0UIC%!68"0F5+3AG'".<%!68"0F5&25@&25@ + M%QAE96=IGZ=N7YBEYB;N7YBF8"0N7YB + MEYB;EYB;EYB;F8"096^<559;(C&<'".<(C&<96^<>GZ=?HF\J:VOF=#5L)BH + MP+*UF=#5P+7"P+*UP+7"P+*UF=#5P+*UP+7"F=#5P+7"P+*UP+7"S\O1P+7" + MF=#5P+7"S\O1S\O1P+7"S\O1P+7"S\O1P+7"S\O1S\O1U=3>S\O1U=3>S\O1 + MSMK=X.#GS\O1P+*UP+7"P+7"P+7"P+7"S\O1S\O1S\O1EYB;$QDX@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB;04F-(C&<05BDF:?,EYB; + M%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``%!0VEYB;P+*UF=#5F=#5S\O1?Y?/EYB;>GZ=96^<96^<*S`^+3AG*S`^*S`^$QDX+3AGF:?,S\O1P+7"EYB;P+7"S\O1 + MF=#5P+7"EYB;F8"0>GZ='A@8````````````````$QDX+3AG+3AG&25@%QAE + M%QAE+3AG+3AG%!68%QAE+3AG96=I96^<96=I96=IGZ=96=IN7YB96=I04F-&25@&25@-3]`96=I96^GZ=F8"0N7YBF8"00UIC&25@*S`^0UIC>GZ=EYB;>GZ= + MF8"0EYB;>GZ=EYB;EYB;EYB;N7YB>GZ=96=I0UIC'".<+3AG(C&<04F-?HF\ + MJ:VOP+7"S\O1P+7"F=#5P+7"P+7"P+*UF=#5P+7"P+7"L)BHP+7"F=#5P+7" + MP+*UF=#5P+7"P+*UP+7"S\O1S\O1S\O1S\O1S\O1S\O1S\O1S\O1S\O1S\O1 + MS\O1S\O1S\O1S\O1S\O1U\O-S\O1S\O1U=3>SMK=XO+TX^KKXO+TX^KKXO+T + MX.#GS\O196=I559;*S`^559;-3]`+3AG559;-3]`+3AG*S`^*S`^+3AGEYB; + M66^\96^<2%S(66^\F:?,S\O1F=#5F:?, + MF:?,F:?,F:?,EYB;>GZ=96^<96=I96=I96=I96=I05BD559;96=I?Y?/F=#5 + MEYB;>GZ=>GZ=66^\F8"0EYB;F:?,EYB;0UIC*S`^@(``@(``@(``@(``%!0V + M0UICEYB;2%S(#Q/-"0GS"0GS'2C3&25@*S`^*S`^$QDX%!0V#@\0%!0VF8"0 + M96=I%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0$QDX + M*S`^%!0V@(``@(``@(``@(``@(``@(``@(``#`P]*S`^>GZ=EYB;05BD"0F5 + M"0G+#Q/-"0GS"0GS#Q/-'2C3"0GS(C&<(C&S\O1SMK=P+7"?V]^96=IF8"0P+*U?Y?/F8"0EYB;F:?, + MF=#5EYB;>GZ=96^<66^\EYB;L)BHF=#55B@>$QDX```````````````````` + M%!0V96^<+3AG&25@"0ED'".<'".<'".<"0ED'".<%QAE0UIC?V]^96=I96=I + MF8"096=IF8"0GZ=>GZ=N7YB96=I + M+3AG96=IN7YBF8"0F8"0N7YB>GZ=F8"0>GZ=96^<96^<05BD559;(C&<(C&< + M(C&<*47&F8"0EYB;F:?,L)BHF=#5P+7"L)BHJ:VOL)BHP+*UF:?,P+7"P+*U + MF=#5F=#5L)BHS\O1P+*UP+7"P+7"S\O1F=#5S\O1S\O1S\O1P+7"S\O1S\O1 + MS\O1S\O1S\O1P+*US\O1S\O1S\O1U=3>S\O1S\O1U=3>S\O1SMK=X.#GSMK= + MS\O1X.#GS\O1X.#GSMK=U\O-S\O1S\O1S\O1S\O1SMK=U=3>U\O-U=3>F=#5 + MP+*UF:?,96^<(C&<05BD2%S(66^\?Y?/0UIC%!0V@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``5B@>*S`^5B@>-3]`*S`^96=IP+7"X.#GS\O1F=#5F=#5F:?,F:?,F:?, + MJ:VO0UIC*S`^5B@>*S`^*S`^&25@*S`^*S`^$QDX*S`^-3]`5B@>#@\0@(`` + M@(``@(``@(``@(``@(``@(``+3AGF:?,F:?,*47&"0G+(C&<(C&GZ= + M+3AG$QDX````$QDXEYB;F=#5*S`^@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^ + MEYB;96^<(C&<"0F5"0GS"0GS"0G+"0GS"0GS"0GS"0G+(C&<96^<5B@>5B@> + MSVQ$5B@>5B@>'A@8%!0V,4)FF:?,XO+TX.#GX.#GS\O1P+*UEYB;EYB;F:?, + MU=3>SMK=F=#5EYB;F8"096^<04F-?Y?/F:?,L)BHF=#5P+7"S\O15B@>```` + M````````````````````*S`^96^<%QAE%QAE%!68+3AG+3AG+3AG%!68+3AG + M&25@559;96=I96=I>GZ=96=IGZ=N7YBF8"0N7YBF8"0>GZ= + MF8"0N7YBF8"0F8"096=IF8"0>GZ=N7YB>GZ=EYB;>GZ=F8"096=I(C&<+3AG + M+3AG'".<(C&<96^<96^S\O1S\O1U=3>S\O1SMK=U=3>S\O1X.#GSMK=U=3>XO+TS\O1 + MX.#GXO+TX^KKU\O-J:VO66^\04F-'".<05BD?HF\05BD*S`^*S`^'A@8@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0VEYB;F=#5F=#5 + MF:?,>GZ=EYB;EYB;EYB;L)BH*S`^@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]EYB;?Y?/(C&< + M*47&*47&66^\F=#5F:?,559;````%!0V0UICEYB;EYB;%!0V@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``*S`^$QDX"0ED+3AG04F-F:?,X.#GSMK=F=#5 + MJ:VOL)BH?V]^?V]^N7YBS\O1U\O-U=3>>GZ=?V]^96^<96^GZ=N7YBF8"0EYB;N7YB>GZ=F8"0?V]^ + M96^<96=I(C&<&25@"0F5%!68(C&<559;>GZ=F:?,L)BHL)BHF:?,P+7"L)BH + MF=#5J:VOP+7"EYB;L)BHP+*UP+7"L)BHP+7"F=#5P+*US\O1P+*UF=#5P+7" + MS\O1P+7"P+*UP+7"S\O1S\O1S\O1S\O1S\O1S\O1S\O1P+7"S\O1S\O1S\O1 + MS\O1S\O1S\O1S\O1X.#GS\O1S\O1U\O-S\O1U\O-S\O1U\O-U\O-S\O1X^KK + MU=3>SMK=U\O-X.#GSMK=X^KKU=3>S\O1F:?,96^<05BD(C&<(C&<66^\>GZ= + M*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``$QDX*S`^'A@8%!0V'A@8$QDX'A@8*S`^$QDX@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``%!0V$QDX%QAEEYB;F=#5F=#5S\O1F=#5+3AG*S`^-3]`F8"0559; + M$QDX#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``0UICF8"0?Y?/04F-(C&<%!68'2C3"0GS + M"0GS"0GS"0GS'2C32%S(96^GZ=EYB;>GZ=5B@>5B@>+#-K+3AG96^< + M?V]^N7YBP+7"F=#596=I559;+3AG5B@>*S`^-3]`F8"0F=#5EYB;96^GZ=?V]^96=I>GZ=N7YB96^<>GZ=F8"0>GZ=?V]^N7YBF8"0GZ=96^<96=I05BD96=I04F-+3AG%!68'".<(C&<05BDF8"0EYB;L)BHEYB; + MF=#5EYB;P+*UP+7"F=#5L)BHL)BHF:?,P+*UF:?,P+*UP+7"F=#5P+*UP+7" + ML)BHF=#5P+7"P+*UP+*UP+7"F=#5P+*UP+7"F=#5S\O1P+7"S\O1S\O1S\O1 + MS\O1S\O1S\O1S\O1U=3>S\O1P+7"S\O1S\O1SMK=S\O1U=3>S\O1U=3>SMK= + MU=3>S\O1XO+TU=3>S\O1SMK=U\O-S\O1XO+TU=3>S\O1P+7">GZ=05BD*47& + M05BD2%S(F:?,?Y?/*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8*S`^F8"0S\O1F=#5F:?, + M-3]`F8"0EYB;559;$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB;96^<(C&< + M%!68'2C3"0GS"0GS"0G+"0GS'2C3'2C3(C&```` + M````````*S`^EYB;S\O1S\O1F:?,(C&<&25@%QAE+3AG&25@%!68%QAE'".< + M%QAE96=I96=I96=I?V]^GZ=F8"0>GZ=96^<04F-559;05BD+3AG'".<%!68+3AG'".<0UIC96^U\O-S\O1S\O1S\O1U\O-SMK=U\O-S\O1X^KKX.#GXO+TX.#GU\O-P+7" + MGZ=F8"0>GZ='A@8@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M*S`^96=IF:?,(C&<"0F5"0F5"0GS"0G+"0GS"0GS"0G+#Q/-(C&<0UICF8"0 + M0UIC%!68+3AGEYB;F8"0?V]^96=I04F-SVQ$SVQ$N7YBSMK=X^KKS\O1?V]^ + M+3AG*S`^+3AG>GZ=F:?,S\O1>GZ=>GZ=L)BHEYB;L)BHP+*UL)BHF:?,L)BH + MP+7"P+*UP+7"96=I*S`^*S`^+3AG559;F=#5X.#GXO+TS\O105BD"0ED&25@ + M%!68'".<+3AG'".<+3AG+3AG0UIC96=I96=I96=I96=IGZ=GZ=96=IN7YB96^< + MSMK=S\O1S\O1F:?,>GZ=96=I05BD(C&<*47&EYB;EYB;$QDX@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``#`P]5B@>J:VOU=3>EYB;5B@>%!0V@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``'A@8+3AGEYB;F:?,(C&<'2C3#Q/-"0G+"0GS"0GS"0GS"0G+ + M(C&<(C&<96=I05BD(C&<(C&<'".<05BD2%S(2&V"04F-?V]^N7YBSVQ$SVQ$ + MN7YBU\O-XO+TU=3>F=#5*S`^$QDX96=IS\O1X^KKF=#5P+*UEYB;L)BHF:?, + MP+7"F:?,P+7"EYB;P+*UF=#5F=#5P+*UL)BHF=#5P+*UEYB;?Y?/96^GZ=96=I?V]^96^<96=IF8"0?V]^96^<559;96=I0UIC(C&<'".< + M'".<(C&<"0F5(C&<05BD96^S\O1U\O-U=3> + MS\O1X.#GS\O1S\O1S\O1P+7"?HF\96^<04F-05BD96^<66^\96^<$QDX%!0V + M%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^+3AG + M*S`^$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``*S`^F8"096^<(C&<%!68'2C3"0GS + M"0GS"0GS'2C3#Q/-(C&<(C&<&25@%!68"0G+(C&<(C&<96^<66^\?Y?/F8"0 + MSVQ$N7YBSVQ$N7YB5B@>LUD\XO+T]OW^X^KKF=#5+3AG*S`^>GZ=XO+TX.#G + MU=3>P+7"L)BHF:?,L)BHEYB;EYB;L)BHL)BHF:?,L)BHP+7"P+7"F=#5EYB; + M96^GZ=96=I96^GZ=04F->GZ=96^<$QDX````'A@85B@>%QAE'".<+3AG + M+3AG559;+3AG(C&<%QAE+3AG559;96=I96=I96=I0UIC+3AG%!68&25@&25@ + M+3AG559;96=I96=I?V]^96=I96=I96=I96^<96=I>GZ=N7YBS\O1S\O1S\O1S\O1EYB;96^<(C&< + M'".<(C&<2%S(2%S(96^U\O-P+*UN7YBN7YBN7YBP+7" + MS\O1]OW^]OW^SMK=S\O196^<9EYB;F:?, + ML)BHJ:VOEYB;EYB;EYB;EYB;EYB;96^<(C&<96^EYB;+3AG"0ED%!6805BD0UIC+3AG&25@%QAE+3AG0UIC?V]^05BD+3AG + M+3AG'".<"0F5+3AG%!68-3]`0UIC96=IGZ=F8"0EYB;EYB;EYB;EYB;EYB;EYB;EYB;L)BHL)BHJ:VOL)BHF:?,EYB; + MP+7"EYB;L)BHEYB;EYB;P+*UP+7"F=#5EYB;F=#5F:?,P+7"P+*UP+7"P+*U + MP+7"P+7"F=#5L)BHP+7"P+7"F=#5S\O1S\O1S\O1P+7"S\O1S\O1S\O1P+7" + MP+7"S\O1S\O1S\O1S\O1S\O1S\O1S\O1S\O1S\O1U\O-S\O1S\O1S\O1F=#5 + MF:?,04F-(C&<'".<(C&<*47&>GZ=?Y?/*S`^*S`^$QDX@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``*S`^>GZ=96^<(C&<'2C3"0GS#Q/-"0GS"0GS"0GS + M'2C3%!68'".<"0F5%!68"0F5+3AG%!0V*S`^(C&<66^\F:?,S\O1XO+TS\O1 + M?V]^SVQ$SVQ$S\O1]OW^]OW^]OW^]OW^XO+TU=3>F=#5S\O1U=3>J:VOF:?, + MEYB;EYB;F:?,P+*UF:?,L)BHF:?,L)BHF:?,N7YB0UIC+3AG5B@>>GZ=L)BH + MF=#5559;````'A@8>GZ=EYB;N7YB+3AG"0ED+3AGF:?,EYB;(C&<'".<+3AG + M&25@96=I96=I0UIC+3AG+3AG+3AG%!68+3AG&25@96=I96=I96=I96^<96=I + MGZ=EYB;N7YBEYB;EYB;F8"0EYB;F:?,EYB;F8"0EYB;EYB; + MEYB;P+7"EYB;L)BHJ:VOEYB;F=#5EYB;P+7"F=#5P+7"J:VOL)BHP+7"P+*U + MP+7"J:VOF:?,F:?,P+*UF:?,P+*UF:?,P+*US\O1P+*US\O1P+7"P+7"S\O1 + MP+*UF=#5P+7"P+7"P+*US\O1S\O1P+7"S\O1S\O1S\O1U=3>S\O1S\O1S\O1 + MS\O1U=3>S\O1F8"096=I(C&<(C&<'2C32%S(F:?,+3AG*S`^*S`^'A@8@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8 + M+3AG*S`^@(``@(``@(``@(``@(``@(``@(``*S`^96=IF:?,(C&<"0F5%!68 + M"0GS"0G+"0GS"0GS"0G+"0G+&25@%!68'".<"0F5'".<*S`^&25@+3AG2%S( + M>GZ=F=#5X^KK]OW^S\O196=ISVQ$N7YBP+*UX.#GXO+T]OW^]OW^]OW^X^KK + MX.#GSMK=U=3>P+7"EYB;F8"0?V]^EYB;HH>9N7YBL)BHF8"0EYB;F8"096=I + M+3AG*S`^5B@>96=IEYB;F=#5559;$QDX*S`^L)BHP+*USVQ$*S`^"0ED&25@ + MS\O1F=#505BD%!68&25@%QAE559;96=I(C&<&25@%!68+3AG+3AG%QAE+3AG + M96=I>GZ=96=I96=I?V]^96^<96=I96=I0UIC+3AG+3AG+3AG%!68&25@(C&< + M+3AG'".<'".<%!68'2C396=I96^EYB; + M?HF\05BD%!68'2C3"0GS"0GS"0GS'2C3%!68"0F5'".<%QAE"0ED&25@*S`^ + M+3AG(C&<66^\?Y?/F:?,F:?,F:?,U\O-XO+T]OW^U\O-N7YBSVQ$96=IF=#5 + MX^KKU\O-XO+T]OW^S\O1XO+TX.#GS\O1EYB;>GZ=5B@>*S`^5B@>HC\GLUD\ + M96=I559;*S`^5B@>559;*S`^$QDX%!0V-3]`559;96=I96^%QAE&25@P+7"SMK=66^\+3AG"0F5&25@+3AG+3AG%QAE+3AG + M+3AG+3AG&25@*S`^559;96=I96=IGZ=F8"0EYB;F:?, + ML)BHEYB;EYB;F:?,EYB;EYB;EYB;EYB;EYB;EYB;EYB;L)BHL)BHP+*UEYB; + MF:?,P+*UL)BHEYB;F:?,F:?,F:?,P+7"P+*UF:?,F=#5P+*UF=#5L)BHP+7" + MJ:VOF=#5P+7"F=#5P+7"P+*US\O1F=#5P+7"S\O1P+7"S\O1P+7"S\O1S\O1 + MP+7"U\O-S\O1S\O1P+7"S\O1S\O1P+*UF=#5P+*U96^<05BD'".<(C&<#Q/- + M66^\>GZ=+3AG#`P]'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8EYB;U=3>EYB;*S`^@(`` + M@(``@(``*S`^EYB;96^<05BD%!68"0G+#Q/-"0GS"0GS"0G+%!68'2C3"0G+ + M%QAE*S`^$QDX*S`^0UIC*47&?Y?/S\O1XO+TU=3>J:VOEYB;F=#5X^KKX.#G + MS\O1EYB;>GZ=EYB;?V]^SVQ$N7YBU\O-U=3>N7YBSMK=U\O-*S`^5B@>5B@>5B@>5B@>'A@8#`P]#@\0%!0V$QDX$QDX5B@>*S`^*S`^ + MLUD\LUD\HC\GLUD\N7YBN7YBN7YB+3AG&25@+3AGS\O1X.#G66^\%!68"0ED + M%QAE%QAE'".<'".<%!68'".<%QAE+3AG559;96=IGZ=F8"0EYB; + MF8"0EYB;EYB;EYB;EYB;EYB;P+7"EYB;L)BHEYB;F:?,EYB;EYB;EYB;EYB; + MF:?,EYB;F:?,F=#5L)BHEYB;EYB;F:?,EYB;P+7"P+*UP+*UL)BHP+*UP+7" + MP+*UP+7"F:?,P+*UJ:VOP+7"L)BHP+*UF:?,EYB;P+7"F=#5P+7"P+7"P+*U + MF=#5S\O1F=#5S\O1S\O1S\O1S\O1U=3>S\O1S\O1P+*UEYB;?HF\(C&<(C&< + M(C&<%!68(C&S\O1S\O1 + ML)BHEYB;L)BHS\O1S\O1P+7"96^5B@>HC\G5B@>5B@>5B@>5B@>'A@8%!0V'A@8%!0V + M'A@85B@>96=I559;HC\GLUD\HC\GLUD\HC\GSVQ$N7YBN7YB559;'".<04F- + MF=#5U=3>F:?,+3AG%!68&25@%!68&25@%!68+3AG+3AG"0ED-3]`96=I05BD + M559;96=I+3AG&25@&25@(C&<(C&<0UIC%!68"0F5(C&<"0F5%!68'".<05BD + MF8"0N7YBEYB;F8"0EYB;N7YBEYB;EYB;F8"0EYB;EYB;EYB;EYB;F8"0EYB; + MEYB;EYB;EYB;L)BHEYB;EYB;L)BHEYB;P+7"EYB;EYB;F:?,L)BHEYB;P+*U + MP+7"F:?,P+7"F:?,EYB;L)BHP+7"L)BHP+7"F:?,P+*UP+7"F=#5P+7"P+*U + MP+7"P+*UP+*US\O1S\O1P+7"P+*UP+7"S\O1P+7"S\O1S\O1S\O1P+7"F:?, + MF:?,>GZ=(C&<+3AG&25@*47&2%S(2%S(?Y?/P+7"EYB;'A@8@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``'A@8F=#5]OW^U=3>559;*S`^*S`^>GZ=F:?,04F-'2C3 + M"0G+'2C3"0GS"0GS"0GS"0G+'2C3%!68"0ED#`P]+3AG96=I96^<(C&<*47& + M2%S(96^GZ=P+7" + MU=3>P+*UN7YB?V]^SVQ$SVQ$SVQ$SVQ$LUD\HC\GLUD\LUD\HC\GSVQ$HC\G + MSVQ$HC\GLUD\?V]^HC\GHC\GHC\GHC\GSVQ$N7YBSVQ$N7YBSVQ$?V]^?V]^ + MEYB;EYB;05BD+3AG96^GZ=EYB;L)BHEYB;F8"0F8"0L)BHEYB;F8"0 + MF:?,F8"0EYB;N7YBEYB;L)BHF:?,EYB;EYB;P+7"EYB;F:?,EYB;EYB;F:?, + MEYB;F:?,P+*UEYB;F:?,L)BHEYB;P+*UL)BHF=#5L)BHF=#5J:VOP+7"P+*U + MF:?,P+*UF:?,L)BHF=#5P+7"F=#5P+7"P+7"P+*UP+7"F=#5S\O1L)BHF=#5 + MP+7"F=#5EYB;>GZ=+3AG(C&<%!68(C&<*47&*47&96^9EYB;EYB;EYB;EYB;P+7"EYB;EYB; + ML)BHF:?,96^<96=IS\O1]OW^S\O1LUD\HC\GSVQ$HC\GHC\G5B@>HC\GSVQ$ + MHC\G?V]^F8"0P+*US\O1U\O-U\O-S\O1U\O-N7YBSVQ$SVQ$SVQ$SVQ$N7YB + MSVQ$U\O-J:VO5B@>'A@85B@>*S`^04F-05BD66^\U=3>X^KKQ,32+3AG&25@ + M%!68&25@+3AG(C&<&25@%QAE&25@&25@(C&<&25@%!68+3AG%!68'".<%!68 + M'".<(C&<%!68%QAE0UIC04F-96^GZ=EYB; + ML)BHEYB;F8"0EYB;EYB;L)BHEYB;>GZ=F8"0EYB;EYB;EYB;EYB;EYB;EYB; + MEYB;L)BHEYB;EYB;L)BHEYB;L)BHEYB;P+7"EYB;L)BHF:?,P+7"L)BHP+7" + ML)BHP+7"L)BHP+7"P+*UP+7"P+7"EYB;F=#5L)BHS\O1P+*UP+*US\O1S\O1 + MF=#5P+7"S\O1F=#5EYB;N7YB04F-+3AG%!68"0F5"0G+'2C3?Y?/Q,32F:?, + M0UIC+3AG*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8 + MEYB;S\O1SMK=X.#GU=3>P+7"(C&<"0F5"0G+"0GS"0GS"0GS"0G+#Q/-"0G+ + M&25@+3AG#`P]#`P]#`P](C&<05BD05BD96^9 + ML)BHEYB;EYB;L)BHEYB;L)BHJ:VOF8"00UICEYB;F=#5EYB;5B@>559;SVQ$ + M5B@>'A@8*S`^LUD\?V]^?V]^96=IEYB;F:?,P+7"F=#5S\O1P+7"F=#5?V]^ + MN7YBSVQ$N7YBN7YBSVQ$SVQ$L)BHN7YB$QDX@(``@(``@(``(C&<2%S(96^< + MS\O1]OW^S\O196=I"0ED+3AG+3AG%!68+3AG"0ED"0ED+3AG%!68+3AG(C&< + M+3AG'".<%!68'".<"0F5"0F5+3AG'".<+3AG05BDF8"0>GZ=F8"096^GZ=N7YBEYB;F8"0F8"0F8"0EYB;EYB;EYB;EYB;EYB;F8"0EYB;EYB;EYB; + MF8"0EYB;EYB;EYB;EYB;EYB;EYB;EYB;L)BHF:?,P+*UEYB;L)BHL)BHF=#5 + ML)BHF:?,P+*UF=#5P+7"J:VOF:?,P+7"P+*UF:?,P+7"J:VOP+7"P+7"S\O1 + MP+7"P+7"P+7"F=#5P+7"P+*UP+*UF:?,EYB;96^<+3AG'".<"0ED"0F5'2C3 + M2%S(2%S(66^\F=#5N7YB$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``%!0V96=IS\O1S\O1?Y?/(C&<'".<"0G+'2C3"0G+ + M"0G+#Q/-'".<"0F5%!6805BD+3AG*S`^&25@+3AG>GZ=?HF\F8"0EYB;L)BH + MEYB;F8"0EYB;N7YBEYB;EYB;F8"0EYB;EYB;F:?,L)BHF=#5EYB;96=I0UIC + M0UIC559;0UIC96=I96=I0UIC+3AG+3AG96^X^KKU=3>2%S(&25@%!68"0F5&25@+3AG%!68 + M&25@'".<0UIC+3AG(C&<&25@%!68"0G+'".<%!68'".<(C&<96=I96^GZ=?V]^EYB;F8"0F8"0N7YB + MHH>9EYB;EYB;EYB;EYB;EYB;EYB;F:?,EYB;EYB;F:?,L)BHF:?,L)BHL)BH + MEYB;F:?,P+*UF:?,F:?,L)BHP+*UP+7"L)BHL)BHP+7"J:VOP+7"F=#5L)BH + MP+*UF:?,P+*UP+7"S\O1F=#5F=#5P+*UF:?,L)BHF:?,>GZ=96^<+3AG%!68 + M(C&<#Q/-*47&96^GZ=EYB;EYB;F8"0EYB;EYB;EYB;HH>9F8"0EYB;L)BHEYB;EYB;EYB;F8"0 + MEYB;P+*UF=#5S\O1F:?,GZ=U=3>]OW^S\O1F:?,05BD + M+3AG"0F5+3AG%!68'".<%QAE+3AG(C&<'".<+3AG"0F5'".<"0F5(C&<(C&< + M96=IF8"096=IF8"0F8"0>GZ=F8"0F8"0F8"0EYB;F8"0EYB;F8"0EYB;EYB; + MF8"0>GZ=?V]^EYB;F8"0EYB;EYB;EYB;HH>9EYB;>GZ=EYB;EYB;EYB;EYB; + MEYB;EYB;L)BHF:?,P+7"L)BHL)BHF:?,L)BHP+*UP+7"F:?,L)BHF:?,F:?, + MP+*UF:?,L)BHF=#5P+7"P+7"J:VOP+7"S\O1S\O1P+*UP+7"EYB;05BD96=I + M0UIC05BD96=I"0F5"0G+(C&9EYB;EYB;EYB;EYB; + MEYB;EYB;EYB;EYB;F8"0EYB;F:?,S\O1XO+TS\O1F=#596=I0UIC+3AG+3AG + M(C&<96^GZ= + MU=3>]OW^XO+TF:?,66^\+3AG%!68+3AG%!68'".<%!68'".<(C&<+3AG'".< + M"0F5%!68(C&<05BD96=IGZ=N7YBF8"0EYB; + MF8"0N7YBEYB;F8"0N7YBF8"0N7YBEYB;EYB;EYB;EYB;F8"0EYB;F:?,EYB; + MEYB;EYB;EYB;F:?,EYB;L)BHEYB;EYB;L)BHEYB;L)BHF=#5L)BHF=#5P+7" + MEYB;EYB;L)BHF=#5L)BHF=#5P+7"P+*UL)BHF:?,P+*UEYB;L)BHF=#5EYB; + MF:?,EYB;96^<+3AG'".<%!68+3AG(C&<*47&66^\2%S(F:?,F=#5>GZ='A@8 + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``*S`^96^<*47&#Q/-"0GS#Q/-"0GS"0G+"0F5 + M"0G++3AG04F-96=I05BD96^9EYB;HH>9EYB;L)BH + MEYB;L)BHEYB;F8"0EYB;F8"0EYB;F8"0N7YB>GZ=F:?,J:VOF:?,U=3>S\O1 + MF:?,>GZ=EYB;F=#5F:?,-3]`#`P]$QDX@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``'A@80UIC04F-?HF\S\O1X.#GSMK=S\O1EYB;(C&<+3AG'".<"0F5+3AG + M"0F5%!68'".<"0F5'".<+3AG(C&GZ=N7YBF8"096^< + MN7YB96^GZ=F8"0EYB;F8"0N7YBF8"0>GZ= + MF8"0EYB;L)BHEYB;F8"0EYB;EYB;L)BHL)BHEYB;EYB;F:?,EYB;EYB;F:?, + MEYB;EYB;F:?,L)BHJ:VOP+7"P+*UP+7"F:?,L)BHP+7"EYB;P+7"F:?,L)BH + MP+7"EYB;F8"096=I96=I(C&<+3AG%!68(C&<'".<'2C305BD*47&?Y?/F:?, + MEYB;+3AG*S`^'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``+3AGEYB;2%S(*47& + M"0G+"0G+%!68"0F5+3AG04F-96^<05BD(C&<04F-EYB;F:?,L)BHL)BHEYB; + MEYB;F8"0EYB;EYB;EYB;EYB;EYB;L)BHL)BHEYB;L)BHEYB;96^<(C&<96=I + M96^GZ=U=3>]OW^U=3>-3]`@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``#`P]+3AG(C&<0UIC>GZ=>GZ=>GZ=EYB;?Y?/ + M(C&<+3AG%!68%!68"0F5'".<"0ED+3AG+3AG559;96=IF8"096^GZ= + M?V]^?V]^F8"0?V]^F8"0EYB;F8"0F8"0F:?,F8"0F8"0N7YBF8"0L)BHEYB; + MEYB;EYB;EYB;EYB;EYB;EYB;EYB;EYB;?HF\L)BHEYB;L)BHF:?,L)BHF:?, + MEYB;EYB;EYB;EYB;L)BHL)BHL)BHEYB;L)BHEYB;P+7"J:VOP+7"P+*UP+7" + MP+*US\O1P+*UF8"0>GZ=96^<0UIC(C&<+3AG'".<#Q/-"0F5"0G+'2C32%S( + MF:?,F=#5P+7"0UIC+3AG*S`^'A@8@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``-3]`F=#52%S('2C3*47&'2C3"0F5+3AG'".<+3AG>GZ=559;0UIC96^< + MEYB;EYB;EYB;EYB;HH>9EYB;F8"0EYB;F8"0N7YBF8"0F8"0EYB;96^EYB;S\O1XO+TS\O1 + M559;@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``&25@+3AG+3AG + M05BD0UIC96=I96^<96^<(C&<"0F5'".<"0F5%!68'".<%!680UIC+3AG0UIC + MF8"0GZ=96^GZ=EYB;EYB;EYB;HH>9EYB;HH>9EYB;?HF\L)BHF8"0F8"0EYB;EYB; + MEYB;EYB;L)BHF:?,P+*UEYB;EYB;L)BHF:?,EYB;F:?,F:?,EYB;EYB;EYB; + MEYB;L)BHF:?,EYB;F=#5EYB;L)BHF8"0?V]^(C&<+3AG%!68&25@"0F5(C&< + M'2C3(C&<*47&*47&2%S(EYB;F=#5EYB;%!0V@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``5B@>F:?,EYB;2%S(#Q/-"0G+#Q/-(C&<%QAE + M+3AG(C&<(C&<)T2E04F-96^GZ=96=I(C&<96=I+3AG%!68+3AG%QAE+3AG(C&<96^ + MS\O1F8"0?Y?/P+7"S\O1+3AG@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``#`P]0UIC96^<2&V"96^<05BD05BD(C&<'".<+3AG%!68+3AG'".<+3AG + M+3AG+3AG559;96=I96=I96=I96=IF8"0F8"0N7YBF8"0F8"096^9EYB;HH>9F:?,L)BHP+7"L)BHEYB;EYB;EYB;EYB;EYB; + MEYB;EYB;L)BHEYB;L)BHP+7"P+7"L)BHL)BHL)BHF:?,L)BHJ:VOL)BHEYB; + MEYB;L)BHEYB;F:?,L)BHEYB;EYB;EYB;96^<96^<96=I04F-+3AG+3AG'".< + M"0F5(C&<"0G+'2C3*47&2%S(66^\?HF\0UIC@(``'A@8*S`^$QDX@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0559;F=#5F=#5 + M2%S('2C3"0G+"0F5(C&<*47&'".<%!68&25@+3AG+3AG+3AG+3AG05BD96=I + M(C&<&25@%QAE+3AG+3AG+3AG%QAE'".<%QAE&25@"0ED'".<8WW`F:?,Q,32 + MS\O1U=3>XO+TX.#G]OW^XO+TF:?,96=I96=IP+7"5B@>@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``$QDXF8"0EYB;05BDEYB;?HF\*47&(C&<"0G+ + M'".<"0F5%QAE%QAE%QAE+3AG0UIC559;96=I96=I?V]^96=I96=I?V]^96=I + MN7YBEYB;EYB;N7YB96^GZ=F8"0EYB;L)BHEYB;F8"0EYB;EYB; + ML)BHF8"0EYB;F8"0F8"0EYB;F8"0F8"0EYB;F8"0EYB;EYB;EYB;F=#5EYB; + MP+7"EYB;P+7"F:?,L)BHP+*UEYB;EYB;EYB;96=I(C&<04F-+3AG+3AG+3AG + M'".<%!68'".<(C&<#Q/-"0G+'2C366^\F=#5F:?,96=I&25@5B@>'A@8@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``$QDXEYB;F:?,?HF\*47&#Q/-'".<05BD(C&<'".<%QAE+3AG"0F5 + M%QAE"0ED"0ED%QAE&25@"0ED&25@"0ED%QAE'".<"0F5+3AG(C&<(C&<(C&< + M96^<2%S(96^XO+T]OW^X.#GS\O196^<96^9F8"0F8"096^GZ=N7YBEYB; + MEYB;EYB;>GZ=F8"0F8"0EYB;F8"0N7YBEYB;EYB;F:?,EYB;L)BHEYB;L)BH + MF:?,L)BHP+7"L)BHEYB;EYB;EYB;L)BHEYB;EYB;EYB;F8"0GZ=?HF\F:?,>GZ=*S`^#`P]$QDX559;F:?,X^KKX^KK]OW^ + M]OW^XO+TF:?,F8"0-3]`'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``'A@8F:?,S\O1F:?,2%S(*47&"0GS"0G+"0GS"0G+#Q/-(C&<'".<%!68 + M+3AG0UIC(C&<+3AG+3AG+3AG(C&<559;96=I96=I96=I96=I96=IGZ=F8"0?V]^F8"0F8"0>GZ=F8"0F8"0EYB;F8"0EYB;EYB;EYB;EYB;HH>9 + MEYB;L)BHEYB;F8"0EYB;F8"0F8"0>GZ=N7YB96^<>GZ=F8"096^<96=I96=I + M0UIC+3AG'".<(C&<%!68'".<%!68(C&<"0G+(C&<#Q/-*47&*47&?Y?/F:?, + M?Y?/*S`^$QDX*S`^%!0V#@\0@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8EYB;F:?, + M66^\?Y?/?HF\(C&+3AG@(``@(``@(`` + M#@\0*S`^96=IX.#G]OW^]OW^U=3>?V]^*S`^#`P]@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``'A@8*S`^96=IF=#566^\'2C3"0GS"0GS"0GS + M"0G+"0GS"0GS"0G+'".<'".<(C&<+3AG&25@'".<+3AG%QAE&25@559;+3AG + M(C&<+3AG05BD559;96=I?V]^?V]^>GZ=N7YB96^EYB;F=#5EYB;?Y?/>GZ=96^< + M2%S(2%S(66^\05BD96^GZ=EYB;F:?,F=#5EYB;$QDX@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``*S`^J:VOP+*US\O1F=#5-3]`@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^EYB; + M66^\2%S('2C3*47&"0GS"0GS"0GS"0GS*47&#Q/-'2C3'".<%!68+3AG"0F5 + M%!68"0F5+3AG'".<+3AG+3AG559;+3AG+3AG96=I0UIC96^<96=I96^GZ=96^<96=I0UIC+3AG + M+3AG+3AG+3AG%QAE'".<"0ED%!68"0F5'".<05BD559;'".<'2C3(C&<"0GS + M*47&*47&2%S(2%S(66^\EYB;P+7"EYB;'A@8@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``#`P]'A@8+3AG96^GZ=+3AG*S`^#`P]'A@8 + M*S`^%!0V$QDX$QDX#`P]#@\0#`P]$QDX#`P]$QDX*S`^%!0V%!0V*S`^*S`^ + M%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0V*S`^ + M*S`^%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``%!0V$QDX*S`^?Y?/66^\2%S(*47&"0GS"0G+"0G+"0GS + M*47&*47&"0G+"0G+(C&<"0G+(C&<%!68"0F5%!68(C&<+3AG(C&<+3AG%!68 + M+3AG+3AG(C&<+3AG+3AG(C&<+3AG+3AG+3AG%!68&25@+3AG%QAE%!68+3AG + M+3AG559;+3AG(C&<&25@%!68'".<%!68"0F5%!68"0F5'".<(C&<%!68*47& + M05BD*47&#Q/-"0G+2%S(EYB;F=#5?HF\*S`^$QDX*S`^%!0V$QDX@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\096=I>GZ=96^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0V*S`^*S`^+3AG + MF:?,2%S("0GS"0GS"0GS*47&"0GS"0GS"0GS"0G+"0G+"0G+'".<%!68'".< + M(C&<+3AG'".<%!68'".<'".<+3AG'".<+3AG+3AG+3AG0UIC(C&<'".<%!68 + M&25@%!68"0F5&25@'".<%!68&25@05BD+3AG'".<"0F5%!68"0F5'2C3"0G+ + M"0G+"0GS"0GS"0GS66^\?HF\?Y?/+3AG#`P]&25@*S`^*S`^*S`^'A@8@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0*S`^-3]`+3AG + M>GZ=?HF\66^\P+7"EYB;*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``*S`^EYB;2%S((C&<66^\'2C3"0GS"0GS'2C3"0G+"0GS + M"0GS"0G+#Q/-"0G+#Q/-"0G+#Q/-'2C3%!68"0F5%!68"0F5'".<%!68'".< + M+3AG(C&<+3AG'".<%!68"0F5"0F5(C&<%!68"0F5"0F5(C&<'".<(C&<'".< + M#Q/-'2C3"0GS*47&#Q/-2%S(66^\*47&05BD2%S(>GZ=>GZ=*S`^@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M'A@8*S`^?HF\F:?,96^<66^\?Y?/F:?,559;$QDX@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0$QDX%!0V+3AGF:?,F:?, + M66^\*47&"0GS"0GS'2C3"0GS"0GS"0GS"0GS*47&"0GS"0G+#Q/-"0GS'2C3 + M'2C3"0G+"0G+"0G+(C&<*47&'2C3'2C3"0G+'2C3"0GS"0G+"0G+"0GS"0GS + M*47&"0G+#Q/-*47&"0GS#Q/-'".<*47&96^<96^GZ=P+7"F:?,F=#5 + MF:?,F:?,?Y?/?Y?/F:?,?Y?/P+7"F:?,F=#5EYB;"0ED#`P]@(``#`P]*S`^ + M#`P]$QDX*S`^$QDX%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M$QDXEYB;F:?,96^<2%S(?Y?/F:?,96^<*S`^'A@8@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M#`P]*S`^559;*S`^5B@>+3AG*S`^559;*S`^+3AG-3]`5B@>*S`^5B@>*S`^ + M#@\0@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``#@\00UICL)BHF=#5>GZ=2%S(04F->GZ=5B@>@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``'A@85B@>?Y?/>GZ=66^\>GZ=+3AG + M#`P]'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0>GZ=EYB; + M66^\F:?,?Y?/+3AG@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``'A@8*S`^EYB;F:?,>GZ=F:?,>GZ=%!0V@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``#`P]$QDX%!0V*S`^96^<66^\?HF\?Y?/559;$QDX@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``5B@>EYB;05BD(C&GZ=66^\?Y?/EYB; + M+3AG@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]'A@8@(``*S`^EYB;96^< + M05BD66^\F:?,EYB;*S`^'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^ + MEYB;0UIC+3AG05BD*47&96^S\O1U\O-F=#566^\?Y?/ + M?Y?/-3]`@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``+3AGP+7"XO+T]OW^ + MX.#G]OW^U=3>F:?,S\O1F:?,%!0V@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``-3]`U\O-]OW^]OW^]OW^]OW^SMK=F:?,P+7"EYB;'A@8@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``*S`^F=#5X^KKX.#G]OW^]OW^XO+TP+7"559; + M$QDX#`P]@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]96=IU=3>]OW^ + M]OW^]OW^S\O10UIC#@\0@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``%!0VN7YBF=#5P+*UP+7"EYB;'A@8@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``%!0V%!0V*S`^*S`^%!0V@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````____````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YB```` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YB````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````````N7YBN7YB + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````N7YB````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YB + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YB````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````N7YBN7YB + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````N7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````N7YB````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````N7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````N7YBN7YB````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````` + MN7YBN7YBN7YBN7YB````````````````````````````````````````N7YB + MN7YBN7YBN7YBN7YBN7YBN7YB````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(`````` + M````````N7YBN7YBN7YBN7YB````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``````````````N7YB + MN7YBN7YBN7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````____```` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````` + M````N7YBN7YBN7YBN7YBN7YB````````@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YBN7YB + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YB + MN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``````@(`` + M@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YBN7YBN7YB```````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`````` + M````````N7YBN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````````N7YBN7YB```````````````````````````````````` + M````````````N7YBN7YBN7YBN7YBN7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````@(``@(``````N7YBN7YBN7YBN7YB + MN7YB````````@(``@(``@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YB + M````@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``````````N7YB + MN7YBN7YBN7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````@(``@(``````````N7YBN7YBN7YBN7YB```` + M````@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````N7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YB````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````````````@(``@(`` + M@(``@(``@(``@(``````````````````````N7YBN7YBN7YBN7YBN7YBN7YB + M````````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````````````````N7YBN7YBN7YBN7YBN7YB```````````````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````````N7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB```````` + M````````````````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````````````@(``@(``@(``@(``@(``@(`````````````` + MN7YBN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``````N7YB + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(`````````` + M````````````N7YBN7YBN7YBN7YBN7YBN7YB```````````````````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````````N7YB + MN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YB````````````````````````@(``````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```````````````` + M````@(``@(``````````@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + MN7YBN7YBN7YB````````````````````````@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YBN7YBN7YB + M````````````````````````@(``````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YB````````````````````````````@(``@(``````````@(``@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````````````@(``@(``@(``@(`` + M@(``@(``@(``````````N7YBN7YBN7YBN7YB```````````````````````` + M````@(``@(``````N7YBN7YBN7YBN7YB````````````````````````@(`` + M@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YBN7YBN7YB```````````` + M````````````@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````N7YBN7YBN7YBN7YB````````````````````````@(``@(`` + M@(``@(``````````N7YBN7YBN7YB````````````````@(``````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````````````````````N7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YB````````````````````````````@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````````@(``@(``@(``@(``````````@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YBN7YBN7YB````````````````````````@(``@(`` + M@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````````````````N7YBN7YBN7YBN7YB + MN7YBN7YB````````````````````````````````````@(``@(``@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````````@(``````@(``@(``````N7YBN7YBN7YB```````````` + M````````@(``````````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB + MN7YB````````````````````````@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``````@(``@(``@(``````N7YBN7YBN7YB```````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M```````````````````````````````````````````````````````````` + M````@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(`` + M````````N7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````` + M````````````````````````````````````````````````````````@(`` + M@(``@(``@(``@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(`````````````````````````````````````````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(`````````````````````````````````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M````````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``````N7YBN7YBN7YB```` + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YB````````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YB````````@(``@(``@(``@(``@(``@(`` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````@(``@(``@(``@(``````````N7YB````````@(``@(``@(``@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````@(``@(``@(``@(``````````N7YBN7YB```` + M````````@(``@(``@(``@(``````````````````````````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``````N7YBN7YBN7YB```````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````@(``@(``@(``@(``````````@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(`````` + MN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M````@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YB````````````````@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````````````````N7YBN7YBN7YB````````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YB + MN7YB````````````````@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``````@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``````````N7YBN7YB```````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````````@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````````@(``@(``@(``````````@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M````@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(`````` + M````````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````N7YBN7YBN7YB````````````````@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YB````````````````@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``````@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``````````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``````````````````N7YBN7YBN7YB```` + M````````````````@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``````@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``````````````````````````````````````@(``@(`` + M````N7YBN7YBN7YB````````````````@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````````@(``@(``@(`````````````````` + M````````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````````````````````````````````````@(``@(`` + M````@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(`` + M@(``````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YB````````````````@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````@(``````@(``@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````` + M````````@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M@(``@(``@(``@(``@(``@(``````N7YBN7YB````````@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YB + MN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB + M````````@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````````@(``@(``@(``````````@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(`` + M@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YB````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````N7YBN7YBN7YB````````````````````@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YB````````````````@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````````@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````````@(``@(``@(``@(``@(``@(``````N7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````@(``@(``@(`````````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``````````N7YB + MN7YBN7YB````````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````````@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YB````````````````@(``@(``````N7YBN7YBN7YBN7YBN7YB```````` + M````````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````````@(``@(``@(``````````@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(`` + M````````N7YBN7YBN7YBN7YBN7YB````````@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````````````N7YBN7YBN7YB + MN7YBN7YB````````````````````@(`````````````````````````````` + MN7YBN7YBN7YBN7YB````````````````````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YB````````````@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YB````````````````@(``@(`` + M@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````` + M````@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````@(``````N7YBN7YBN7YBN7YBN7YBN7YBN7YB```````` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M____````````````@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````````` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````````` + M````N7YBN7YBN7YBN7YBN7YB````````````````````@(``@(``````N7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````````````````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``````````@(``@(``@(``````N7YBN7YBN7YB + MN7YBN7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````N7YBN7YBN7YBN7YB````````@(``@(``@(``@(``````````N7YB + MN7YBN7YBN7YBN7YB````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````N7YBN7YBN7YB````````````````````N7YBN7YBN7YBN7YBN7YB + MN7YB````````````````````@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````````@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB```````````````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````` + M````````````````````N7YBN7YBN7YBN7YBN7YB```````````````````` + M@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````````@(``@(``@(`````````````````` + M````N7YBN7YBN7YB````````````````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YBN7YB````````@(`` + M@(``````````N7YBN7YBN7YBN7YB````````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````````````````````````````N7YB + MN7YBN7YBN7YBN7YB````````````````````````````````@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``````````@(`` + M````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YB````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````N7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````````N7YBN7YBN7YBN7YBN7YB```` + M````````````````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YB````````````````@(``@(`` + M@(``````````````````````N7YBN7YB````````````````````````@(`` + M@(``````````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YBN7YB```` + M````````````````````````N7YBN7YBN7YBN7YB```````````````````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````````N7YBN7YBN7YBN7YB```````````````````````````` + M````````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``````````````N7YBN7YBN7YB````````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````````N7YBN7YBN7YBN7YBN7YBN7YB````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````````N7YBN7YB````````````````````@(``@(``@(``@(``@(`````` + M````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YB````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````````````````````````N7YBN7YB + MN7YBN7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``````````@(``@(`````````````````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YB````````````````````````@(``@(``````````N7YBN7YB```` + M````````````````````@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YB```````````` + M````````````````````@(``````````@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``````````N7YB```````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(`````````````````````````````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````````````````````````@(``@(`` + M@(``@(``@(``@(``@(``````````````````````N7YBN7YBN7YBN7YB```` + M````````````````````````````````````````____````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````` + M````````````````````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YB````````````````@(``@(``@(``````````@(``@(`` + M@(``````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````````````````````@(``@(``@(`` + M@(``@(``````````````````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````````````````````````@(``@(``@(``@(``````@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``````````````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````` + M````````````````````````@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````` + MN7YBN7YBN7YBN7YB```````````````````````````````````````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````````````````````````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````` + M````@(``@(``@(``@(``@(``@(``@(``````````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````````````````@(``@(``@(`` + M@(``@(``````````@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````````````````````@(``@(``@(``@(`` + M@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````````````N7YBN7YBN7YBN7YB```````````````````````` + M````````````````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```````````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YBN7YB````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YB````````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YBN7YB````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``````N7YBN7YBN7YB + M````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M````````N7YBN7YBN7YB````````````````@(``@(`````````````````` + M````````````````````@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````N7YBN7YBN7YBN7YB````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``````N7YBN7YBN7YB```````````````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YBN7YB````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``````N7YBN7YBN7YB```` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````````````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(`````` + MN7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``````N7YBN7YBN7YB````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YBN7YB````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``````N7YBN7YBN7YBN7YB```````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB```` + M````````@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``````N7YB + MN7YBN7YB````````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````N7YBN7YBN7YB````````````@(``@(``@(``````````N7YBN7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````N7YBN7YB````````````@(``@(``@(`` + M````````N7YBN7YBN7YB````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``````N7YBN7YBN7YB```````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YB```` + M````````@(``@(``@(``````````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YB```````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB + MN7YB````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````````````````````@(``@(``@(``````````N7YBN7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````````N7YBN7YBN7YB````````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````````@(``@(`` + M@(``````N7YBN7YBN7YB````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YB````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```` + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````````N7YBN7YBN7YBN7YBN7YBN7YB````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````````````````````@(``@(``@(``@(``@(``````N7YBN7YB + M````````````@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(`` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + MN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``````@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YBN7YB````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````````````N7YBN7YBN7YBN7YBN7YB```````````` + M@(``@(``@(``````````````````````@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``````N7YBN7YBN7YB````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````N7YBN7YBN7YB````````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````````````N7YBN7YBN7YBN7YB + MN7YBN7YBN7YB````````````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YBN7YB + MN7YBN7YBN7YBN7YBN7YB````````@(``@(``@(``````````````@(``@(`` + M@(``````````@(``@(``@(``@(``@(``````````N7YBN7YBN7YBN7YB```` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + MN7YBN7YBN7YBN7YBN7YBN7YB```````````````````````````````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YB + MN7YBN7YBN7YBN7YB````````````````````````````````````@(``@(`` + M@(``@(``@(``````@(``@(``````````@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YBN7YBN7YB````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````N7YB + MN7YBN7YB````````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````N7YBN7YBN7YB```````````````````` + M@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````N7YBN7YBN7YBN7YBN7YBN7YB````````````````````````````@(`` + M@(``````````````@(``@(``@(``@(``@(``@(``@(`````````````````` + M````````N7YBN7YBN7YBN7YBN7YBN7YB````````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````` + M````````````````@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````````````N7YBN7YBN7YBN7YBN7YB```````````````````` + M````````@(``@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(`` + M@(``@(``````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB```````````` + M````````@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB```````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``````````````````````````@(``@(``@(``@(``@(``@(``@(`` + M````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YB```````` + M````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````@(``@(``@(``@(``@(``@(``````````````N7YBN7YBN7YBN7YBN7YB + M````````````````````````@(``@(``@(``````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````____````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YBN7YBN7YB + M````````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````N7YBN7YBN7YB + MN7YBN7YB````````````````````````@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(`````````` + M````````````````````````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M````____````````@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + MN7YBN7YBN7YBN7YBN7YB````````````````@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``````````````@(``@(``@(``@(``@(``@(``@(``@(`````````````` + MN7YBN7YBN7YBN7YBN7YB````````````````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````````````````````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``````N7YBN7YB````````````@(``@(``@(`` + M````````````N7YBN7YBN7YBN7YBN7YBN7YB````````````````````@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(`````````````````````````````````` + M````````````N7YBN7YBN7YBN7YBN7YBN7YB```````````````````````` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````` + M````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````N7YBN7YB + MN7YBN7YB````````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB```````` + M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````` + MN7YBN7YBN7YB````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB```````````` + M````````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + MN7YB````````````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``````````````N7YBN7YBN7YBN7YBN7YBN7YBN7YBN7YB + M````````````````````````````@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``````````````N7YBN7YB + MN7YBN7YBN7YB````````````````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`````````````````` + M````````````````````````````````````````@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````````````````````````````````@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``````````````````````````````````````````@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(`` + )@(``@(``@(`` + ` + end *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/tile2bmp.dsp Thu Mar 21 07:37:47 2002 *************** *** 0 **** --- 1,146 ---- + # Microsoft Developer Studio Project File - Name="tile2bmp" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=tile2bmp - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "tile2bmp.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "tile2bmp.mak" CFG="tile2bmp - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "tile2bmp - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "tile2bmp - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "tile2bmp - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sys\winnt" /I "..\win\share" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "NDEBUG" + # ADD RSC /l 0x1009 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\util\tile2bmp.exe" + + !ELSEIF "$(CFG)" == "tile2bmp - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\sys\winnt" /I "..\win\share" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # ADD BASE RSC /l 0x1009 /d "_DEBUG" + # ADD RSC /l 0x1009 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"..\util\tile2bmp.exe" /pdbtype:sept + + !ENDIF + + # Begin Target + + # Name "tile2bmp - Win32 Release" + # Name "tile2bmp - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\src\decl.c + # End Source File + # Begin Source File + + SOURCE=..\src\drawing.c + # End Source File + # Begin Source File + + SOURCE=..\src\monst.c + # End Source File + # Begin Source File + + SOURCE=..\src\objects.c + # End Source File + # Begin Source File + + SOURCE=..\win\share\tile2bmp.c + + !IF "$(CFG)" == "tile2bmp - Win32 Release" + + !ELSEIF "$(CFG)" == "tile2bmp - Win32 Debug" + + # ADD CPP /D "PACKED_FILE" + + !ENDIF + + # End Source File + # Begin Source File + + SOURCE=..\win\share\tiletext.c + + !IF "$(CFG)" == "tile2bmp - Win32 Release" + + !ELSEIF "$(CFG)" == "tile2bmp - Win32 Debug" + + # ADD CPP /Zi + + !ENDIF + + # End Source File + # Begin Source File + + SOURCE=..\win\share\tiletxt.c + # ADD CPP /D "TILETEXT" + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/tilemap.dsp Thu Mar 21 07:37:47 2002 *************** *** 0 **** --- 1,281 ---- + # Microsoft Developer Studio Project File - Name="tilemap" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=tilemap - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "tilemap.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "tilemap.mak" CFG="tilemap - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "tilemap - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "tilemap - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "tilemap - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + # ADD CPP /nologo /W3 /GX /O2 /I "..\include" /I "..\sys\winnt\include" /I "..\win\share" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /c + # SUBTRACT CPP /YX + # ADD BASE RSC /l 0x1009 /d "NDEBUG" + # ADD RSC /l 0x1009 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\util\tilemap.exe" + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=Generating src\tile.c + PostBuild_Cmds=echo chdir ..\src chdir ..\src ..\util\tilemap.exe echo chdir ..\build chdir ..\build + # End Special Build Tool + + !ELSEIF "$(CFG)" == "tilemap - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\include" /I "..\sys\winnt\include" /I "..\win\share" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "WIN32CON" /D "DLB" /D "MSWIN_GRAPHICS" /FD /GZ /c + # ADD BASE RSC /l 0x1009 /d "_DEBUG" + # ADD RSC /l 0x1009 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"..\util\tilemap.exe" /pdbtype:sept + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Desc=Generating src\tile.c + PostBuild_Cmds=echo chdir ..\src chdir ..\src ..\util\tilemap.exe echo chdir ..\build chdir ..\build + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "tilemap - Win32 Release" + # Name "tilemap - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\win\share\tilemap.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # Begin Source File + + SOURCE=..\include\align.h + # End Source File + # Begin Source File + + SOURCE=..\include\attrib.h + # End Source File + # Begin Source File + + SOURCE=..\include\color.h + # End Source File + # Begin Source File + + SOURCE=..\include\config.h + # End Source File + # Begin Source File + + SOURCE=..\include\config1.h + # End Source File + # Begin Source File + + SOURCE=..\include\coord.h + # End Source File + # Begin Source File + + SOURCE=..\include\decl.h + # End Source File + # Begin Source File + + SOURCE=..\include\dgn_comp.h + # End Source File + # Begin Source File + + SOURCE=..\include\dgn_file.h + # End Source File + # Begin Source File + + SOURCE=..\include\display.h + # End Source File + # Begin Source File + + SOURCE=..\include\dungeon.h + # End Source File + # Begin Source File + + SOURCE=..\include\engrave.h + # End Source File + # Begin Source File + + SOURCE=..\include\flag.h + # End Source File + # Begin Source File + + SOURCE=..\include\global.h + # End Source File + # Begin Source File + + SOURCE=..\include\mkroom.h + # End Source File + # Begin Source File + + SOURCE=..\include\monattk.h + # End Source File + # Begin Source File + + SOURCE=..\include\monst.h + # End Source File + # Begin Source File + + SOURCE=..\include\monsym.h + # End Source File + # Begin Source File + + SOURCE=..\include\nhlan.h + # End Source File + # Begin Source File + + SOURCE=..\include\ntconf.h + # End Source File + # Begin Source File + + SOURCE=..\include\obj.h + # End Source File + # Begin Source File + + SOURCE=..\include\objclass.h + # End Source File + # Begin Source File + + SOURCE=..\include\onames.h + # End Source File + # Begin Source File + + SOURCE=..\include\permonst.h + # End Source File + # Begin Source File + + SOURCE=..\include\pm.h + # End Source File + # Begin Source File + + SOURCE=..\include\prop.h + # End Source File + # Begin Source File + + SOURCE=..\include\quest.h + # End Source File + # Begin Source File + + SOURCE=..\include\rect.h + # End Source File + # Begin Source File + + SOURCE=..\include\region.h + # End Source File + # Begin Source File + + SOURCE=..\include\rm.h + # End Source File + # Begin Source File + + SOURCE=..\include\skills.h + # End Source File + # Begin Source File + + SOURCE=..\include\spell.h + # End Source File + # Begin Source File + + SOURCE=..\include\timeout.h + # End Source File + # Begin Source File + + SOURCE=..\include\tradstdc.h + # End Source File + # Begin Source File + + SOURCE=..\include\trampoli.h + # End Source File + # Begin Source File + + SOURCE=..\include\trap.h + # End Source File + # Begin Source File + + SOURCE=..\include\vision.h + # End Source File + # Begin Source File + + SOURCE=..\include\winprocs.h + # End Source File + # Begin Source File + + SOURCE=..\include\wintty.h + # End Source File + # Begin Source File + + SOURCE=..\include\wintype.h + # End Source File + # Begin Source File + + SOURCE=..\include\you.h + # End Source File + # Begin Source File + + SOURCE=..\include\youprop.h + # End Source File + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/tiles.dsp Thu Mar 21 07:37:47 2002 *************** *** 0 **** --- 1,97 ---- + # Microsoft Developer Studio Project File - Name="tiles" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) External Target" 0x0106 + + CFG=tiles - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "tiles.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "tiles.mak" CFG="tiles - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "tiles - Win32 Release" (based on "Win32 (x86) External Target") + !MESSAGE "tiles - Win32 Debug" (based on "Win32 (x86) External Target") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + + !IF "$(CFG)" == "tiles - Win32 Release" + + # PROP BASE Use_MFC + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Cmd_Line "NMAKE /f tiles.mak" + # PROP BASE Rebuild_Opt "/a" + # PROP BASE Target_File "tiles.exe" + # PROP BASE Bsc_Name "tiles.bsc" + # PROP BASE Target_Dir "" + # PROP Use_MFC + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Cmd_Line "nmake /f "tiles.mak"" + # PROP Rebuild_Opt "/a" + # PROP Target_File "..\win\win32\tiles.bmp" + # PROP Bsc_Name "" + # PROP Target_Dir "" + + !ELSEIF "$(CFG)" == "tiles - Win32 Debug" + + # PROP BASE Use_MFC + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Cmd_Line "NMAKE /f tiles.mak" + # PROP BASE Rebuild_Opt "/a" + # PROP BASE Target_File "tiles.exe" + # PROP BASE Bsc_Name "tiles.bsc" + # PROP BASE Target_Dir "" + # PROP Use_MFC + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Cmd_Line "nmake /f "tiles.mak"" + # PROP Rebuild_Opt "/a" + # PROP Target_File "..\win\win32\tiles.bmp" + # PROP Bsc_Name "" + # PROP Target_Dir "" + + !ENDIF + + # Begin Target + + # Name "tiles - Win32 Release" + # Name "tiles - Win32 Debug" + + !IF "$(CFG)" == "tiles - Win32 Release" + + !ELSEIF "$(CFG)" == "tiles - Win32 Debug" + + !ENDIF + + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/tiles.mak Thu Mar 21 07:37:48 2002 *************** *** 0 **** --- 1,21 ---- + default: all + + all: ..\win\win32\tiles.bmp + + clean: + -del ..\src\win\win32\tiles.bmp + -del ..\win\win32\tiles.bmp + + #========================================== + # Building the tiles file tile.bmp + #========================================== + + ..\src\tiles.bmp : ..\win\share\monsters.txt ..\win\share\objects.txt \ + ..\win\share\other.txt + chdir ..\src + ..\util\tile2bmp.exe tiles.bmp + chdir ..\build + + ..\win\win32\tiles.bmp: ..\src\tiles.bmp + @copy ..\src\tiles.bmp ..\win\win32\tiles.bmp + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/uudecode.dsp Thu Mar 21 07:37:48 2002 *************** *** 0 **** --- 1,146 ---- + # Microsoft Developer Studio Project File - Name="uudecode" - Package Owner=<4> + # Microsoft Developer Studio Generated Build File, Format Version 6.00 + # ** DO NOT EDIT ** + + # TARGTYPE "Win32 (x86) Console Application" 0x0103 + + CFG=uudecode - Win32 Debug + !MESSAGE This is not a valid makefile. To build this project using NMAKE, + !MESSAGE use the Export Makefile command and run + !MESSAGE + !MESSAGE NMAKE /f "uudecode.mak". + !MESSAGE + !MESSAGE You can specify a configuration when running NMAKE + !MESSAGE by defining the macro CFG on the command line. For example: + !MESSAGE + !MESSAGE NMAKE /f "uudecode.mak" CFG="uudecode - Win32 Debug" + !MESSAGE + !MESSAGE Possible choices for configuration are: + !MESSAGE + !MESSAGE "uudecode - Win32 Release" (based on "Win32 (x86) Console Application") + !MESSAGE "uudecode - Win32 Debug" (based on "Win32 (x86) Console Application") + !MESSAGE + + # Begin Project + # PROP AllowPerConfigDependencies 0 + # PROP Scc_ProjName "" + # PROP Scc_LocalPath "" + CPP=cl.exe + RSC=rc.exe + + !IF "$(CFG)" == "uudecode - Win32 Release" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 0 + # PROP BASE Output_Dir "Release" + # PROP BASE Intermediate_Dir "Release" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 0 + # PROP Output_Dir "Release" + # PROP Intermediate_Dir "Release" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c + # ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c + # SUBTRACT CPP /YX /Yc /Yu + # ADD BASE RSC /l 0x409 /d "NDEBUG" + # ADD RSC /l 0x409 /d "NDEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + # ADD LINK32 kernel32.lib user32.lib gdi32.lib /nologo /subsystem:console /machine:I386 /out:"..\util\uudecode.exe" + # SUBTRACT LINK32 /nodefaultlib + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Cmds=echo chdir ..\win\win32 chdir ..\win\win32 \ + echo decoding icon (nhico.uu to NetHack.ico) \ + ..\..\util\uudecode.exe ../../sys/winnt/nhico.uu \ + echo decoding mnsel (mnsel.uu to mnsel.bmp) \ + ..\..\util\uudecode.exe mnsel.uu \ + echo decoding mnselcnt (mnselcnt.uu to mnselcnt.bmp) \ + ..\..\util\uudecode.exe mnselcnt.uu \ + echo decoding mnunsel (mnunsel.uu to mnunsel.bmp) \ + ..\..\util\uudecode.exe mnunsel.uu \ + echo decoding petmark (petmark.uu to petmark.bmp) \ + ..\..\util\uudecode.exe petmark.uu \ + echo decoding splash (splash.uu to splash.bmp) \ + ..\..\util\uudecode.exe splash.uu \ + echo decoding tombstone (rip.uu to rip.bmp) \ + ..\..\util\uudecode.exe rip.uu \ + chdir ..\..\binary + + # End Special Build Tool + + !ELSEIF "$(CFG)" == "uudecode - Win32 Debug" + + # PROP BASE Use_MFC 0 + # PROP BASE Use_Debug_Libraries 1 + # PROP BASE Output_Dir "Debug" + # PROP BASE Intermediate_Dir "Debug" + # PROP BASE Target_Dir "" + # PROP Use_MFC 0 + # PROP Use_Debug_Libraries 1 + # PROP Output_Dir "Debug" + # PROP Intermediate_Dir "Debug" + # PROP Ignore_Export_Lib 0 + # PROP Target_Dir "" + # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c + # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c + # SUBTRACT CPP /YX /Yc /Yu + # ADD BASE RSC /l 0x409 /d "_DEBUG" + # ADD RSC /l 0x409 /d "_DEBUG" + BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + # ADD LINK32 kernel32.lib user32.lib gdi32.lib /nologo /subsystem:console /debug /machine:I386 /out:"..\util\uudecode.exe" /pdbtype:sept + # SUBTRACT LINK32 /nodefaultlib + # Begin Special Build Tool + SOURCE="$(InputPath)" + PostBuild_Cmds=echo chdir ..\win\win32 chdir ..\win\win32 \ + echo decoding icon (nhico.uu to NetHack.ico) \ + ..\..\util\uudecode.exe ../../sys/winnt/nhico.uu \ + echo decoding mnsel (mnsel.uu to mnsel.bmp) \ + ..\..\util\uudecode.exe mnsel.uu \ + echo decoding mnselcnt (mnselcnt.uu to mnselcnt.bmp) \ + ..\..\util\uudecode.exe mnselcnt.uu \ + echo decoding mnunsel (mnunsel.uu to mnunsel.bmp) \ + ..\..\util\uudecode.exe mnunsel.uu \ + echo decoding petmark (petmark.uu to petmark.bmp) \ + ..\..\util\uudecode.exe petmark.uu \ + echo decoding splash (splash.uu to splash.bmp) \ + ..\..\util\uudecode.exe splash.uu \ + echo decoding tombstone (rip.uu to rip.bmp) \ + ..\..\util\uudecode.exe rip.uu \ + chdir ..\..\binary + + # End Special Build Tool + + !ENDIF + + # Begin Target + + # Name "uudecode - Win32 Release" + # Name "uudecode - Win32 Debug" + # Begin Group "Source Files" + + # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + # Begin Source File + + SOURCE=..\sys\share\uudecode.c + # End Source File + # End Group + # Begin Group "Header Files" + + # PROP Default_Filter "h;hpp;hxx;hm;inl" + # End Group + # Begin Group "Resource Files" + + # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + # End Group + # End Target + # End Project *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/winhack.c Thu Mar 21 07:37:48 2002 *************** *** 0 **** --- 1,287 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + // winhack.cpp : Defines the entry point for the application. + // + + #include + #include "winMS.h" + #include "hack.h" + #include "dlb.h" + #include "resource.h" + #include "mhmain.h" + #include "mhmap.h" + + #ifndef __BORLANDC__ + #include + #else /* Borland redefines "boolean" in shlwapi.h so just use the little bit we need */ + typedef struct _DLLVERSIONINFO + { + DWORD cbSize; + DWORD dwMajorVersion; // Major version + DWORD dwMinorVersion; // Minor version + DWORD dwBuildNumber; // Build number + DWORD dwPlatformID; // DLLVER_PLATFORM_* + } DLLVERSIONINFO; + + // + // The caller should always GetProcAddress("DllGetVersion"), not + // implicitly link to it. + // + + typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *); + + #endif + + #ifdef OVL0 + #define SHARED_DCL + #else + #define SHARED_DCL extern + #endif + + /* Minimal common control library version + Version _WIN_32IE Platform/IE + ======= ========= =========== + 4.00 0x0200 Microsoft(r) Windows 95/Windows NT 4.0 + 4.70 0x0300 Microsoft(r) Internet Explorer 3.x + 4.71 0x0400 Microsoft(r) Internet Explorer 4.0 + 4.72 0x0401 Microsoft(r) Internet Explorer 4.01 + ...and probably going on infinitely... + */ + #define MIN_COMCTLMAJOR 4 + #define MIN_COMCTLMINOR 71 + #define INSTALL_NOTES "http://www.nethack.org/v340/ports/download-win.html#cc" + /*#define COMCTL_URL "http://www.microsoft.com/msdownload/ieplatform/ie/comctrlx86.asp"*/ + + extern void FDECL(nethack_exit,(int)); + static TCHAR* _get_cmd_arg(TCHAR* pCmdLine); + static HRESULT GetComCtlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); + + + // Global Variables: + NHWinApp _nethack_app; + + #ifdef __BORLANDC__ + #define _stricmp(s1,s2) stricmp(s1,s2) + #define _strdup(s1) strdup(s1) + #endif + + // Foward declarations of functions included in this code module: + BOOL InitInstance(HINSTANCE, int); + + extern void FDECL(pcmain, (int,char **)); + static void __cdecl mswin_moveloop(void *); + + #define MAX_CMDLINE_PARAM 255 + + int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) + { + INITCOMMONCONTROLSEX InitCtrls; + int argc; + char* argv[MAX_CMDLINE_PARAM]; + size_t len; + TCHAR *p; + TCHAR wbuf[BUFSZ]; + char buf[BUFSZ]; + DWORD major, minor; + + + /* 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.hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NETHACKW); + _nethack_app.hMainWnd = NULL; + _nethack_app.hPopupWnd = 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.bmpRip = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_RIP)); + if ( _nethack_app.bmpRip == NULL ) panic("cannot load rip bitmap"); + _nethack_app.bmpSplash = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SPLASH)); + if ( _nethack_app.bmpSplash == NULL ) panic("cannot load splash 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.saved_text = strdup(""); + + // init controls + if (FAILED(GetComCtlVersion(&major, &minor))) + { + char buf[TBUFSZ]; + Sprintf(buf, "Cannot load common control library.\n%s\n%s", + "For further information, refer to the installation notes at", + INSTALL_NOTES); + panic(buf); + } + if (major < MIN_COMCTLMAJOR + || (major == MIN_COMCTLMAJOR && minor < MIN_COMCTLMINOR)) + { + char buf[TBUFSZ]; + Sprintf(buf, "Common control library is outdated.\n%s %d.%d\n%s\n%s", + "NetHack requires at least version ", + MIN_COMCTLMAJOR, MIN_COMCTLMINOR, + "For further information, refer to the installation notes at", + INSTALL_NOTES); + panic(buf); + } + ZeroMemory(&InitCtrls, sizeof(InitCtrls)); + InitCtrls.dwSize = sizeof(InitCtrls); + InitCtrls.dwICC = ICC_LISTVIEW_CLASSES; + InitCommonControlsEx(&InitCtrls); + + // Perform application initialization: + if (!InitInstance (hInstance, nCmdShow)) + { + return FALSE; + } + + /* get command line parameters */ + p = _get_cmd_arg(GetCommandLine()); + p = _get_cmd_arg(NULL); /* skip first paramter - command name */ + for( argc = 1; p && argc0 ) { + 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)); + + pcmain(argc,argv); + + moveloop(); + + return 0; + } + + + // + // FUNCTION: InitInstance(HANDLE, int) + // + // PURPOSE: Creates main window + // + // COMMENTS: + // + // In this function, we create and display the main program window. + // + BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) + { + HWND hWnd; + + hWnd = mswin_init_main_window(); + if (!hWnd) + { + return FALSE; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + _nethack_app.hMainWnd = hWnd; + + return TRUE; + } + + PNHWinApp GetNHApp() + { + return &_nethack_app; + } + + 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; + } + + /* Get the version of the Common Control library on this machine. + Copied from the Microsoft SDK + */ + HRESULT GetComCtlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) + { + HINSTANCE hComCtl; + HRESULT hr = S_OK; + DLLGETVERSIONPROC pDllGetVersion; + + if(IsBadWritePtr(pdwMajor, sizeof(DWORD)) || + IsBadWritePtr(pdwMinor, sizeof(DWORD))) + return E_INVALIDARG; + //load the DLL + hComCtl = LoadLibrary(TEXT("comctl32.dll")); + if (!hComCtl) return E_FAIL; + + /* + You must get this function explicitly because earlier versions of the DLL + don't implement this function. That makes the lack of implementation of the + function a version marker in itself. + */ + pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hComCtl, TEXT("DllGetVersion")); + if(pDllGetVersion) { + DLLVERSIONINFO dvi; + ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + hr = (*pDllGetVersion)(&dvi); + if(SUCCEEDED(hr)) { + *pdwMajor = dvi.dwMajorVersion; + *pdwMinor = dvi.dwMinorVersion; + } else { + hr = E_FAIL; + } + } else { + /* + If GetProcAddress failed, then the DLL is a version previous to the one + shipped with IE 3.x. + */ + *pdwMajor = 4; + *pdwMinor = 0; + } + FreeLibrary(hComCtl); + return hr; + } + + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/winhack.h Thu Mar 21 07:37:48 2002 *************** *** 0 **** --- 1,18 ---- + /* SCCS Id: @(#)winhack.h 3.4 2002/03/06 */ + /* Copyright (c) Alex Kompel, 2002 */ + /* NetHack may be freely redistributed. See license for details. */ + + + #if !defined(AFX_WINHACK_H__6397C328_BAF8_460C_9465_F12C596C5732__INCLUDED_) + #define AFX_WINHACK_H__6397C328_BAF8_460C_9465_F12C596C5732__INCLUDED_ + + #if _MSC_VER > 1000 + #pragma once + #endif // _MSC_VER > 1000 + + #define STRICT + #include + #include "resource.h" + + + #endif // !defined(AFX_WINHACK_H__6397C328_BAF8_460C_9465_F12C596C5732__INCLUDED_) *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/winhack.rc Thu Mar 21 07:37:48 2002 *************** *** 0 **** --- 1,332 ---- + //Microsoft Developer Studio generated resource script. + // + #include "resource.h" + + #define APSTUDIO_READONLY_SYMBOLS + ///////////////////////////////////////////////////////////////////////////// + // + // Generated from the TEXTINCLUDE 2 resource. + // + #if defined(__BORLANDC__) + LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US + #endif + #define APSTUDIO_HIDDEN_SYMBOLS + #include "windows.h" + #undef APSTUDIO_HIDDEN_SYMBOLS + #include "resource.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_NETHACKW ICON DISCARDABLE "NETHACK.ICO" + + ///////////////////////////////////////////////////////////////////////////// + // + // Menu + // + + IDC_NETHACKW 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 "Windows &Settings" + BEGIN + MENUITEM "NetHack Mode", IDM_NHMODE + MENUITEM SEPARATOR + MENUITEM "&Clear All Settings", IDM_CLEARSETTINGS + 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 + MENUITEM "NetHack for &Windows help", IDM_HELP_PORTHELP + END + END + + + ///////////////////////////////////////////////////////////////////////////// + // + // Accelerator + // + + IDC_NETHACKW ACCELERATORS MOVEABLE PURE + BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT + END + + + ///////////////////////////////////////////////////////////////////////////// + // + // Dialog + // + + IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75 + STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU + CAPTION "About" + FONT 8, "System" + BEGIN + LTEXT "NetHack",IDC_ABOUT_VERSION,10,10,170,15,SS_NOPREFIX + LTEXT "Copyright",IDC_ABOUT_COPYRIGHT,10,30,210,40 + DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP + END + + IDD_NHTEXT DIALOGEX 0, 0, 172, 178 + STYLE DS_SETFOREGROUND | WS_POPUP | WS_THICKFRAME + EXSTYLE WS_EX_STATICEDGE + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "OK",IDOK,54,163,50,14 + EDITTEXT IDC_TEXT_CONTROL,0,0,170,160,ES_MULTILINE | + ES_OEMCONVERT | ES_READONLY | WS_VSCROLL | WS_HSCROLL + END + + IDD_MENU DIALOGEX 0, 0, 187, 153 + STYLE WS_POPUP | WS_CLIPSIBLINGS | WS_THICKFRAME + EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT + PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT + LISTBOX IDC_MENU_LIST,10,10,170,55,LBS_SORT | WS_TABSTOP + EDITTEXT IDC_MENU_TEXT,10,70,170,60,ES_MULTILINE | ES_OEMCONVERT | + ES_READONLY | WS_VSCROLL | WS_HSCROLL + END + + IDD_GETLIN DIALOG DISCARDABLE 0, 0, 131, 29 + STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU + CAPTION "Question?" + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "OK",IDOK,0,15,65,14 + PUSHBUTTON "Cancel",IDCANCEL,65,15,65,14 + EDITTEXT IDC_GETLIN_EDIT,0,0,130,13,ES_AUTOHSCROLL + END + + IDD_EXTCMD DIALOG DISCARDABLE 0, 0, 137, 117 + STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU + CAPTION "Extended Commands" + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "OK",IDOK,80,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,80,24,50,14 + LISTBOX IDC_EXTCMD_LIST,7,7,65,103,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + END + + IDD_PLAYER_SELECTOR DIALOG DISCARDABLE 0, 0, 152, 169 + STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU + CAPTION "What are you?" + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "Play",IDOK,7,148,66,14 + PUSHBUTTON "Quit",IDCANCEL,79,148,66,14 + LTEXT "Name:",IDC_STATIC,7,8,25,10 + EDITTEXT IDC_PLSEL_NAME,40,7,105,12,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_TABSTOP + GROUPBOX "Role",IDC_STATIC,7,21,138,30 + CONTROL "Random",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,14,34,40,10 + COMBOBOX IDC_PLSEL_ROLE_LIST,63,33,75,50,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + GROUPBOX "Race",IDC_STATIC,7,51,138,30 + CONTROL "Random",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,14,63,40,10 + COMBOBOX IDC_PLSEL_RACE_LIST,63,62,75,45,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + GROUPBOX "Gender",IDC_STATIC,7,81,138,30 + CONTROL "Random",IDC_PLSEL_GENDER_RANDOM,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,93,40,10 + COMBOBOX IDC_PLSEL_GENDER_LIST,63,92,75,40,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + GROUPBOX "Alignment",IDC_STATIC,7,111,138,30 + CONTROL "Random",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,13,123,40,10 + COMBOBOX IDC_PLSEL_ALIGN_LIST,63,122,75,45,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + END + + IDD_NHRIP DIALOGEX 0, 0, 281, 209 + STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU + CAPTION "Here lies..." + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "OK",IDOK,82,188,50,14 + END + + IDD_SPLASH DIALOGEX 0, 0, 281, 209 + STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU + CAPTION "Welcome to NetHack" + FONT 8, "MS Sans Serif" + BEGIN + DEFPUSHBUTTON "OK",IDOK,82,188,50,14 + END + + + #ifdef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // TEXTINCLUDE + // + + 2 TEXTINCLUDE DISCARDABLE + BEGIN + "#if defined(__BORLANDC__)\r\n" + "LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US\r\n" + "#endif\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""resource.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 "tiles.bmp" + IDB_MENU_SEL BITMAP DISCARDABLE "mnsel.bmp" + IDB_MENU_UNSEL BITMAP DISCARDABLE "mnunsel.bmp" + IDB_PETMARK BITMAP DISCARDABLE "petmark.bmp" + IDB_MENU_SEL_COUNT BITMAP DISCARDABLE "mnselcnt.bmp" + IDB_RIP BITMAP DISCARDABLE "rip.bmp" + IDB_SPLASH BITMAP DISCARDABLE "splash.bmp" + + ///////////////////////////////////////////////////////////////////////////// + // + // DESIGNINFO + // + + #ifdef APSTUDIO_INVOKED + GUIDELINES DESIGNINFO DISCARDABLE + BEGIN + IDD_NHTEXT, DIALOG + BEGIN + BOTTOMMARGIN, 177 + END + + IDD_MENU, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 146 + END + + IDD_GETLIN, DIALOG + BEGIN + BOTTOMMARGIN, 22 + END + + IDD_EXTCMD, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 130 + TOPMARGIN, 7 + BOTTOMMARGIN, 110 + END + + IDD_PLAYER_SELECTOR, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 145 + TOPMARGIN, 7 + BOTTOMMARGIN, 162 + END + + IDD_NHRIP, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 274 + TOPMARGIN, 7 + BOTTOMMARGIN, 202 + END + END + #endif // APSTUDIO_INVOKED + + + ///////////////////////////////////////////////////////////////////////////// + // + // String Table + // + + STRINGTABLE DISCARDABLE + BEGIN + IDS_APP_TITLE "NetHack for Windows - Graphical Interface" + IDC_NETHACKW "NETHACKW" + END + + #endif // English (U.S.) resources + ///////////////////////////////////////////////////////////////////////////// + + + + #ifndef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // Generated from the TEXTINCLUDE 3 resource. + // + + + ///////////////////////////////////////////////////////////////////////////// + #endif // not APSTUDIO_INVOKED + *** /dev/null Sat Jan 19 09:25:02 2002 --- nethack-3.4.0/win/win32/winMS.h Thu Mar 21 07:37:48 2002 *************** *** 0 **** --- 1,187 ---- + /* Copyright (C) 2001 by Alex Kompel */ + /* NetHack may be freely redistributed. See license for details. */ + + #ifndef WINMS_H + #define WINMS_H + + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include "hack.h" + + /* Create an array to keep track of the various windows */ + + #ifndef MAXWINDOWS + #define MAXWINDOWS 15 + #endif + + #define NHW_RIP 32 + + #ifndef TILE_X + #define TILE_X 16 + #endif + #define TILE_Y 16 + + #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_SIZE_MIN 3 + #define NHFONT_SIZE_MAX 20 + + #define MAX_LOADSTRING 100 + + typedef struct mswin_nhwindow_data { + HWND win; + int type; + int dead; + } MSNHWinData, *PMSNHWinData; + + typedef struct mswin_nhwindow_app { + HINSTANCE hApp; + HWND hMainWnd; + HACCEL hAccelTable; + HWND hPopupWnd; /* current popup window */ + + MSNHWinData windowlist[MAXWINDOWS]; + + HBITMAP bmpTiles; + HBITMAP bmpPetMark; + HBITMAP bmpMapTiles; /* custom tiles bitmap */ + HBITMAP bmpRip; + HBITMAP bmpSplash; + int mapTile_X; /* tile width */ + int mapTile_Y; /* tile 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 */ + + char* saved_text; + + DWORD saveRegistrySettings; /* Flag if we should save this time */ + DWORD regNetHackMode; /* NetHack mode means no Windows keys in some places */ + } NHWinApp, *PNHWinApp; + + #define E extern + + E PNHWinApp GetNHApp(void); + 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); + 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); + 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_read_reg(void); + void mswin_destroy_reg(void); + void mswin_write_reg(void); + + extern HBRUSH menu_bg_brush; + extern HBRUSH menu_fg_brush; + extern HBRUSH text_bg_brush; + extern HBRUSH text_fg_brush; + extern HBRUSH status_bg_brush; + extern HBRUSH status_fg_brush; + extern HBRUSH message_bg_brush; + extern HBRUSH message_fg_brush; + + extern COLORREF menu_bg_color; + extern COLORREF menu_fg_color; + extern COLORREF text_bg_color; + extern COLORREF text_fg_color; + extern COLORREF status_bg_color; + extern COLORREF status_fg_color; + extern COLORREF message_bg_color; + extern COLORREF message_fg_color; + + + #define SYSCLR_TO_BRUSH(x) ((HBRUSH)((x) + 1)) + + /* unicode stuff */ + #ifdef UNICODE + #define NH_W2A(w, a, cb) ( WideCharToMultiByte( \ + CP_ACP, \ + 0, \ + (w), \ + -1, \ + (a), \ + (cb), \ + NULL, \ + NULL), (a) ) + + #define NH_A2W(a, w, cb) ( MultiByteToWideChar( \ + CP_ACP, \ + 0, \ + (a), \ + -1, \ + (w), \ + (cb)), (w) ) + #else + #define NH_W2A(w, a, cb) (strncpy((a), (w), (cb))) + + #define NH_A2W(a, w, cb) (strncpy((w), (a), (cb))) + #endif + + #endif /* WINmswin_H */ *** nethack-3.3.1/Files Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/Files Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! This is a listing of all files in a full NetHack 3.3 distribution, organized in their standard manner on a UNIX system. It indicates which files are necessary for which versions, so that you can tell which files may be deleted from or not transferred to your system if you wish. --- 1,4 ---- ! This is a listing of all files in a full NetHack 3.4 distribution, organized in their standard manner on a UNIX system. It indicates which files are necessary for which versions, so that you can tell which files may be deleted from or not transferred to your system if you wish. *************** *** 22,29 **** doc: (files for all versions) Guidebook.mn Guidebook.tex Guidebook.txt dgn_comp.6 dgn_comp.txt ! dlb.6 dlb.txt lev_comp.6 lev_comp.txt nethack.6 ! nethack.txt recover.6 recover.txt tmac.n window.doc include: (files for all versions) --- 22,32 ---- doc: (files for all versions) Guidebook.mn Guidebook.tex Guidebook.txt dgn_comp.6 dgn_comp.txt ! dlb.6 dlb.txt fixes22.0 fixes31.1 fixes31.2 ! fixes31.3 fixes32.0 fixes32.1 fixes32.2 fixes32.3 ! fixes33.0 fixes33.1 fixes34.0 lev_comp.6 lev_comp.txt ! nethack.6 nethack.txt recover.6 recover.txt tmac.n ! window.doc include: (files for all versions) *************** *** 47,53 **** (files for X versions) tile2x11.h winX.h xwindow.h xwindowp.h (files for Qt versions) ! qt_clust.h qt_kde0.h qt_win.h qt_xpms.h (files for Gem versions) bitmfile.h gem_rsc.h load_img.h wingem.h (file for GNOME versions) --- 50,56 ---- (files for X versions) tile2x11.h winX.h xwindow.h xwindowp.h (files for Qt versions) ! qt_clust.h qt_kde0.h qt_win.h qt_xpms.h qttableview.h (files for Gem versions) bitmfile.h gem_rsc.h load_img.h wingem.h (file for GNOME versions) *************** *** 64,105 **** 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 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 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 sys/amiga: (files for Amiga versions) ! Build.ami HackWB.uu Install.ami Makefile.ami NHinfo.uu ! NetHack.cnf NewGame.uu amidos.c amidos.p amifont.uu ! amifont8.uu amigst.c amii.hlp amilib.c amimenu.c ! amirip.c amisnd.c amistack.c amitty.c amiwbench.c ! amiwind.c amiwind.p ask.uu char.c charwin.uu ! clipwin.c clipwin.uu colors.uu colorwin.c cvtsnd.c ! dflticon.uu dispmap.s grave16.xpm hackwb.hlp ifchange ! mkdmake randwin.c randwin.uu scroll.uu string.uu ! txt2iff.c wb.c wbcli.c wbdata.c wbdefs.h ! wbgads.c wbprotos.h wbstruct.h wbwin.c wbwin.uu winami.c winami.p winchar.c windefs.h winext.h winfuncs.c winkey.c winmenu.c winproto.h winreq.c winstr.c xpm2iff.c - sys/amiga/splitter: - (more files for Amiga versions) - amiout.h arg.c arg.h loader.c multi.c - multi.h split.doc split.h splitter.c - sys/atari: (files for Atari version) Install.tos atarifnt.uue nethack.mnu setup.g tos.c --- 67,99 ---- 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 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 sys/amiga: (files for Amiga versions) ! Build.ami Install.ami Makefile.ami Makefile.agc NetHack.cnf ! amidos.c amidos.p amifont.uu amifont8.uu amigst.c ! amii.hlp amimenu.c amirip.c amisnd.c amistack.c ! amitty.c amiwind.c amiwind.p clipwin.c colorwin.c ! cvtsnd.c grave16.xpm ifchange mkdmake txt2iff.c winami.c winami.p winchar.c windefs.h winext.h winfuncs.c winkey.c winmenu.c winproto.h winreq.c winstr.c xpm2iff.c sys/atari: (files for Atari version) Install.tos atarifnt.uue nethack.mnu setup.g tos.c *************** *** 117,128 **** macsnd.c mactopl.c mactty.c macunix.c macwin.c mgetline.c mmodal.c mrecover.c mrecover.hqx mttymain.c - sys/mac/old: - (files for old Think and MPW C compilers) - DCproj.hqx Install.mpw Install.thk LCproj.hqx MDproj.hqx - NHmake.hqx NHproj.hqx NetHack.r macsegs mhdump.c - mpwhack.h mstring.c - sys/msdos: (files for MSDOS version) Install.dos Makefile.BC Makefile.GCC Makefile.MSC Makefile.SC --- 111,116 ---- *************** *** 133,144 **** (files for running MSDOS binary under Windows) nhico.uu nhpif.uu - sys/msdos/old: - (files for old MSC compiler) - MakeMSC.src MakeMSC.utl Makefile.dat README.old exesmurf.c - exesmurf.doc maintovl.doc ovlmgr.asm ovlmgr.doc ovlmgr.uu - schema.old trampoli.c - sys/os2: (files for OS/2 version) Install.os2 Makefile.os2 nhpmico.uu os2.c --- 121,126 ---- *************** *** 158,163 **** --- 140,147 ---- nhlan.c (Berkeley random number file, which may be included in any version) random.c + (Berkeley uudecode file, which may be used in build process of any version) + uudecode.c (file for VMS version) tclib.c (file for MSDOS, OS/2, and VMS versions) *************** *** 175,182 **** sys/unix: (files for UNIX versions) Install.unx Makefile.dat Makefile.doc Makefile.src Makefile.top ! Makefile.utl depend.awk nethack.sh setup.sh unixmain.c ! unixunix.c (files for replacement cpp, apparently only needed by some UNIX systems) cpp1.shr cpp2.shr cpp3.shr (file for sound driver for 386 UNIX) --- 159,166 ---- sys/unix: (files for UNIX versions) Install.unx Makefile.dat Makefile.doc Makefile.src Makefile.top ! Makefile.utl README.linux depend.awk nethack.sh setup.sh ! unixmain.c unixunix.c unixres.c (files for replacement cpp, apparently only needed by some UNIX systems) cpp1.shr cpp2.shr cpp3.shr (file for sound driver for 386 UNIX) *************** *** 190,199 **** vmsmisc.c vmstty.c vmsunix.c sys/winnt: ! (files for Windows NT and Windows'95 version) ! Install.nt Makefile.nt mapimail.c nethack.def nhico.uu ! nhsetup.bat ntsound.c nttty.c win32api.h winnt.c ! winnt.cnf util: (files for all versions) --- 174,183 ---- vmsmisc.c vmstty.c vmsunix.c sys/winnt: ! (files for Windows 9x, NT and Windows2000 version) ! console.rc defaults.nh Install.nt Makefile.bcc Makefile.gcc ! Makefile.msc mapimail.c nethack.def nhico.uu nhsetup.bat ! ntsound.c nttty.c porthelp win32api.h winnt.c util: (files for all versions) *************** *** 204,211 **** win/Qt: (files for the Qt X11 widget library) ! Install.Qt knethack.lnk knh-mini.xpm knh.xpm qt_clust.cpp ! qt_win.cpp tileedit.cpp tileedit.h win/X11: (files for X versions) --- 188,195 ---- win/Qt: (files for the Qt X11 widget library) ! Install.Qt knethack.lnk knh-mini.xpm knh.xpm nhsplash.xpm ! qt_clust.cpp qt_win.cpp qttableview.cpp tileedit.cpp tileedit.h win/X11: (files for X versions) *************** *** 217,224 **** win/gem: (files for GEM versions) ! Install.gem bitmfile.c gem_rsc.uu gem_rso.uu load_img.c ! tile2img.c title.uu wingem.c wingem1.c win/gnome: (files for GNOME versions) --- 201,209 ---- win/gem: (files for GEM versions) ! Install.gem bitmfile.c gem_rsc.uu gem_rso.uu gr_rect.c ! gr_rect.h load_img.c tile2img.c title.uu wingem.c ! wingem1.c xpm2img.c win/gnome: (files for GNOME versions) *************** *** 232,246 **** win/share: (files for versions using optional tiles) gifread.c monsters.txt objects.txt other.txt ppmwrite.c ! thintile.c tile.doc tile.h tilemap.c tiletext.c win/tty: (files for tty versions) getline.c termcap.c topl.c wintty.c win/win32: ! (files for NT and Windows'9x Win32 version) ! tile2bmp.c --- 217,242 ---- win/share: (files for versions using optional tiles) gifread.c monsters.txt objects.txt other.txt ppmwrite.c ! thintile.c tile.doc tile.h tile2bmp.c tilemap.c ! tiletext.c win/tty: (files for tty versions) getline.c termcap.c topl.c wintty.c win/win32: ! (files for Windows 9x, NT, Windows 2000, and Windows XP version) ! dgncomp.dsp dgnstuff.dsp dgnstuff.mak dlb_main.dsp levcomp.dsp ! levstuff.dsp levstuff.mak makedefs.dsp mhaskyn.c mhaskyn.h ! mhdlg.c mhdlg.h mhfont.c mhfont.h mhinput.c ! mhinput.h mhmain.c mhmain.h mhmap.c mhmap.h ! mhmenu.c mhmenu.h mhmsg.h mhmsgwnd.c mhmsgwnd.h ! mhrip.c mhrip.h mhsplash.h mhsplash.c mhstatus.c ! mhstatus.h mhtext.c mhtext.h mnsel.uu mnselcnt.uu ! mnunsel.uu mswproc.c nethack.dsw nethackw.dsp petmark.uu ! recover.dsp resource.h rip.uu splash.uu tile2bmp.dsp ! tilemap.dsp tiles.dsp tiles.mak uudecode.dsp winhack.c ! winhack.h winhack.rc winMS.h *************** *** 289,295 **** (file optionally generated by tilemap at compile time) tile.c (files generated by 'moc' for Qt interface at compile time) ! qt_kde0.moc qt_win.moc NOTE: If your binaries were compiled with the data librarian (DLB) option, your playground will not contain all of the files listed here. All --- 285,291 ---- (file optionally generated by tilemap at compile time) tile.c (files generated by 'moc' for Qt interface at compile time) ! qt_kde0.moc qt_win.moc qttableview.moc NOTE: If your binaries were compiled with the data librarian (DLB) option, your playground will not contain all of the files listed here. All *** nethack-3.3.1/Porting Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/Porting Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! NetHack Porting Guidelines v 3.3 99-11-29 1.0 Introduction --- 1,4 ---- ! NetHack Porting Guidelines v 3.4 1999-11-29 1.0 Introduction *** nethack-3.3.1/README Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/README Thu Mar 21 07:37:36 2002 *************** *** 1,16 **** ! NetHack 3.3.1 -- General information ! NetHack 3.3.1 is an enhancement to the dungeon exploration game NetHack. It is a distant descendent of Rogue and Hack, and a direct descendent of ! NetHack 3.2 and 3.3.0. This version is primarily a bug fix release. ! Here is a brief overview of new additions and changes in the game. ! To give more would be cheating, wouldn't it? ! ! o Many, many bug fixes and minor tweaks ! o New warning system that is more pleasant than the old one ! o The Amiga and Atari ports are resurrected ! o The Gnome toolkit interface is now offered as an experimental option - - - - - - - - - - - --- 1,50 ---- ! NetHack 3.4.0 -- General information ! NetHack 3.4.0 is an enhancement to the dungeon exploration game NetHack. It is a distant descendent of Rogue and Hack, and a direct descendent of ! NetHack 3.3. ! There are a great number of bug fixes in this release, as well as ! many changes and surprises beyond what you see listed below. ! Here is a brief overview of some new additions and changes in the game. ! ! o Many, many bug fixes and tweaks to the core code and to several ports ! o Enhanced config file processing and player selection prompts for some ports ! o Stamina affects ability to throw heavy things ! o Objects merge in containers ! o Wish for "nothing", and genocide "none" to preserve your conduct ! o Several small refinements to race/role separation ! o Config file BOULDER option to specify the symbol for displaying boulders ! o New travel command which is particularly helpful for mouse navigation on ! handheld computers ! o more feedback about skill advancement from #enhance command ! o End-of-game disclose options can be individually tuned to your liking ! o Mac: command-key shortcuts in the player selection dialog ! o Amiga: screenmode requester ! o Win32: new graphical interface contributed by Alex Kompel ! ! We've also included variations of enhancements contributed by members ! of the NetHack community at large. Among them: ! ! o Scott Bigham's new T-shirt messages and his option to turn off ! resistance display effects ! o Malcolm Ryan's option for "autodig" ! o Jay Tilton's full-screen message window display via control-P ! o Dylan O'Donnell's patch for optionally starting with no pet ! o Tom Friedetzky's blessed/uncursed/cursed selection patch for menustyle:full ! o Jason Short's additonal lens uses ! o Kelly Bailey's Gnomish Mines changes ! o Ken Arnold's patch to display prices in your inventory ! ! Carried forward ! o The Gnome toolkit interface is still considered an experimental option. ! We have not enhanced the port ourselves, and so far we have not received ! any contributions doing so from the NetHack community. ! ! A fuller list of changes for this release can be found in the file ! doc/fixes34.0 in the source distribution. The text in there was written ! for the development team's own use and is provided "as is", so please do ! not ask us to further explain the entries in that file. - - - - - - - - - - - *************** *** 35,65 **** h. A 'sys/share/sounds' subsubdirectory, which contains sound files shared by some OSs. i. A 'sys/amiga' subdirectory, which contains files specific to AmigaDOS. ! j. A 'sys/amiga/splitter' subsubdirectory, which contains files ! for the Amiga splitter program. k. A 'sys/atari' subdirectory, which contains files specific to TOS. l. A 'sys/be' subdirectory, which contains files specific to Be OS. m. A 'sys/mac' subdirectory, which contains files specific to MacOS. ! n. A 'sys/mac/old' subdirectory which contains files used by ! compilers that haven't been tested/used in a while. ! o. A 'sys/msdos' subdirectory, which contains files specific to MS-DOS. ! p. A 'sys/msdos/old' subsubdirectory, which contains files for old ! MS-DOS compilers (no longer officially supported). ! q. A 'sys/os2' subdirectory, which contains files specific to OS/2. ! r. A 'sys/unix' subdirectory, which contains files specific to UNIX. ! s. A 'sys/vms' subdirectory, which contains files specific to VMS. ! t. A 'sys/winnt' subdirectory, which contains files specific to Windows NT. ! u. A 'win' directory, which contains subdirectories for files that are windowing-system specific (but not operating-system specific). ! v. A 'win/share' subdirectory, which contains files shared by some windowing systems. ! w. A 'win/Qt' subdirectory, which contains files specific to Qt. ! x. A 'win/X11' subdirectory, which contains files specific to X11. ! y. A 'win/gem' subdirectory, which contains files specific to GEM. ! z. A 'win/gnome' subdirectory, which contains files specific to GNOME. ! A. A 'win/tty' subdirectory, which contains files specific to ttys. ! B. A 'win/win32' subdirectory, which contains files specific to the ! Windows NT Win32 API. The names of these directories should not be changed unless you are ready to go through the makefiles and the makedefs program and change --- 69,94 ---- h. A 'sys/share/sounds' subsubdirectory, which contains sound files shared by some OSs. i. A 'sys/amiga' subdirectory, which contains files specific to AmigaDOS. ! j. A 'sys/amiga/ship' subsubdirectory k. A 'sys/atari' subdirectory, which contains files specific to TOS. l. A 'sys/be' subdirectory, which contains files specific to Be OS. m. A 'sys/mac' subdirectory, which contains files specific to MacOS. ! n. A 'sys/msdos' subdirectory, which contains files specific to MS-DOS. ! o. A 'sys/os2' subdirectory, which contains files specific to OS/2. ! p. A 'sys/unix' subdirectory, which contains files specific to UNIX. ! q. A 'sys/vms' subdirectory, which contains files specific to VMS. ! r. A 'sys/winnt' subdirectory, which contains files specific to Windows NT. ! s. A 'win' directory, which contains subdirectories for files that are windowing-system specific (but not operating-system specific). ! t. A 'win/share' subdirectory, which contains files shared by some windowing systems. ! u. A 'win/Qt' subdirectory, which contains files specific to Qt. ! v. A 'win/X11' subdirectory, which contains files specific to X11. ! w. A 'win/gem' subdirectory, which contains files specific to GEM. ! x. A 'win/gnome' subdirectory, which contains files specific to GNOME. ! y. A 'win/tty' subdirectory, which contains files specific to ttys. ! z. A 'win/win32' subdirectory, which contains files specific to the ! Windows Win32 API. The names of these directories should not be changed unless you are ready to go through the makefiles and the makedefs program and change *************** *** 78,84 **** to compile and run on your particular system. It is worth mentioning that the default configuration is SysV/Sun/Solaris2.x (simply because the code was housed on such a system). It is also worth mentioning ! here that NetHack 3.3 is a huge program. If you intend to run it on a small machine, you'll have to make hard choices among the options available in config.h. --- 107,113 ---- to compile and run on your particular system. It is worth mentioning that the default configuration is SysV/Sun/Solaris2.x (simply because the code was housed on such a system). It is also worth mentioning ! here that NetHack 3.4 is a huge program. If you intend to run it on a small machine, you'll have to make hard choices among the options available in config.h. *************** *** 88,94 **** for particular windowing environments. Reading them, and the man pages, should answer most of your questions. ! At the time of this release, NetHack 3.3 is known to run/compile on: Apple Macintosh running MacOS 7.5 or higher, LinuxPPC, BeOS 4.0 Atari ST/TT/Falcon running TOS (or MultiTOS) with GCC --- 117,123 ---- for particular windowing environments. Reading them, and the man pages, should answer most of your questions. ! At the time of this release, NetHack 3.4 is known to run/compile on: Apple Macintosh running MacOS 7.5 or higher, LinuxPPC, BeOS 4.0 Atari ST/TT/Falcon running TOS (or MultiTOS) with GCC *************** *** 97,114 **** DEC Alpha/VMS (aka OpenVMS AXP), running V1.x through V7.0 DEC VAX/VMS, running V4.6 through V7.0 HP 9000s700 running HP-UX 10.x, 11.x - IBM PC compatibles running MS-DOS with Microsoft C, Borland C++ 3.1, or - DJGPP. It is recommended to have at least an 80386 processor. IBM PS/2 and AT compatibles running OS/2 - 2.0 and up with GCC emx ! Intel 80386 or greater (or clone) and DEC Alpha desktop machines ! running Windows NT Intel 80386 or greater (or clone) boxes running Linux, BSDI, or ! Windows 95,98,2000 Intel Pentium or better (or clone) running BeOS 4.5 Sun SPARC based machine running SunOS 4.x, Solaris 2.x, or Solaris 7 Previous versions of NetHack were tested on the following systems, ! and we expect that NetHack 3.3 will work on them as well: AT&T 3B1 running System V (3.51) AT&T 3B2/600 & 3B2/622 running System V R3.2.1 --- 126,140 ---- DEC Alpha/VMS (aka OpenVMS AXP), running V1.x through V7.0 DEC VAX/VMS, running V4.6 through V7.0 HP 9000s700 running HP-UX 10.x, 11.x IBM PS/2 and AT compatibles running OS/2 - 2.0 and up with GCC emx ! Intel 80386 or greater (or clone) boxes running MS-DOS with DPMI. Intel 80386 or greater (or clone) boxes running Linux, BSDI, or ! Windows 95/98/NT/2000 Intel Pentium or better (or clone) running BeOS 4.5 Sun SPARC based machine running SunOS 4.x, Solaris 2.x, or Solaris 7 Previous versions of NetHack were tested on the following systems, ! and we expect that NetHack 3.4 will work on them as well: AT&T 3B1 running System V (3.51) AT&T 3B2/600 & 3B2/622 running System V R3.2.1 *************** *** 139,156 **** Unless otherwise mentioned, the compiler used was the OS-vendor's C compiler. - The Atari and Amiga ports are struggling to stay supported due to a - lack of people with machines and time. - With the demise of Windows NT on the DEC Alpha, no attempt has been ! made to build NetHack 3.3.1 on that platform. A build for Intel 80286 machines and DOS "real mode" overlaid versions ! has been produced for 3.3.1, with a marginal attempt at tuning it for ! suitable performance. If someone has access to real-mode compiler and ! lots of spare time on their hands, you may be able to enhance the ! performance even further. We don't know how well it runs on a real ! 80286 since we no longer have access to one. - - - - - - - - - - - --- 165,184 ---- Unless otherwise mentioned, the compiler used was the OS-vendor's C compiler. With the demise of Windows NT on the DEC Alpha, no attempt has been ! made to build NetHack 3.4.0 on that platform. ! ! No attempt has been made to build or run NetHack 3.4.0 on Windows Me ! or Windows XP at this point. It may work, but then again it may not. A build for Intel 80286 machines and DOS "real mode" overlaid versions ! has not been produced for 3.4.0. Nobody on the porting team has ! the time or the software to attempt the necessary tuning that will allow ! it to achieve the balance of having just the right amount of available ! memory, and still have acceptable performance. The sources necessary ! to do so are still included in the source distribution, so if someone ! has access to a real-mode compiler and lots of spare time on their hands, ! you may be able to get things working. Of course you do so at your own risk. - - - - - - - - - - - *************** *** 178,197 **** o Don't bother to ask when the next version will be out. You will not get a reply. Alternatively, you may fill out the bug report form on our web ! page at www.nethack.org. Patches especially should be directed to this address. If you've changed something to get NetHack to run on your system, it's likely that others have done it by making slightly different modifications. By routing your patches through the development team, we should be able to avoid making everyone else choose among variant patches claiming to do the same thing, to keep most of ! the copies of 3.3 synchronized by means of official patches, and to maintain the painfully-created file organization. (This process has been working since the time when everyone just posted their own patches to 2.3. At that time, there were no archived bug-fixes to give to people who got 2.3 after its initial release, so the same bugs kept being discovered by new batches of people.) We have been successful in preventing this from happening since the 3.0 ! release. Please cooperate to keep this from happening to 3.3. It is inevitable that we will reject some proposed additions of new features either because they do not fit our conception of the game, or because they --- 206,225 ---- o Don't bother to ask when the next version will be out. You will not get a reply. Alternatively, you may fill out the bug report form on our web ! page at http://www.nethack.org/. Patches especially should be directed to this address. If you've changed something to get NetHack to run on your system, it's likely that others have done it by making slightly different modifications. By routing your patches through the development team, we should be able to avoid making everyone else choose among variant patches claiming to do the same thing, to keep most of ! the copies of 3.4 synchronized by means of official patches, and to maintain the painfully-created file organization. (This process has been working since the time when everyone just posted their own patches to 2.3. At that time, there were no archived bug-fixes to give to people who got 2.3 after its initial release, so the same bugs kept being discovered by new batches of people.) We have been successful in preventing this from happening since the 3.0 ! release. Please cooperate to keep this from happening to 3.4. It is inevitable that we will reject some proposed additions of new features either because they do not fit our conception of the game, or because they *************** *** 200,206 **** marketplace decide their worth. All of this amounts to the following: If you decide to apply a free-lanced ! patch to your 3.3 code, you are on your own. In our own patches, we will assume that your code is synchronized with ours. -- Good luck, and happy Hacking -- --- 228,234 ---- marketplace decide their worth. All of this amounts to the following: If you decide to apply a free-lanced ! patch to your 3.4 code, you are on your own. In our own patches, we will assume that your code is synchronized with ours. -- Good luck, and happy Hacking -- *** nethack-3.3.1/dat/Arch.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Arch.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Arch.des 3.3 97/01/31 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Arch.des 3.4 1997/01/31 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. *************** *** 145,151 **** # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(25,04,28,07),lit,"temple" ! REGION:(25,09,28,11),unlit,"ordinary" REGION:(25,13,28,16),lit,"temple" REGION:(30,04,30,16),lit,"ordinary" REGION:(32,04,32,16),unlit,"ordinary" --- 145,151 ---- # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(25,04,28,07),lit,"temple" ! REGION:(25,09,28,11),unlit,"temple" REGION:(25,13,28,16),lit,"temple" REGION:(30,04,30,16),lit,"ordinary" REGION:(32,04,32,16),unlit,"ordinary" *************** *** 199,204 **** --- 199,209 ---- OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random + # Treasure? + ENGRAVING:random,engrave,"X marks the spot." + ENGRAVING:random,engrave,"X marks the spot." + ENGRAVING:random,engrave,"X marks the spot." + ENGRAVING:random,engrave,"X marks the spot." # Random traps TRAP:"spiked pit",(24,02) TRAP:"spiked pit",(37,00) *************** *** 255,262 **** # # The "goal" level for the quest. # ! # Here you meet Minion of Huhetol your nemesis monster. You have to ! # defeat Minion of Huhetol in combat to gain the artifact you have # been assigned to retrieve. # --- 260,267 ---- # # The "goal" level for the quest. # ! # Here you meet Minion of Huhetotl your nemesis monster. You have to ! # defeat Minion of Huhetotl in combat to gain the artifact you have # been assigned to retrieve. # *************** *** 313,319 **** STAIR:(38,10),up # Non diggable walls NON_DIGGABLE:(00,00,75,19) ! # The altar of Set. Unattended. ALTAR:(50,14),chaos,altar # Objects OBJECT:'(',"crystal ball",(50,14),blessed,5,"The Orb of Detection" --- 318,324 ---- STAIR:(38,10),up # Non diggable walls NON_DIGGABLE:(00,00,75,19) ! # The altar of Huhetotl. Unattended. ALTAR:(50,14),chaos,altar # Objects OBJECT:'(',"crystal ball",(50,14),blessed,5,"The Orb of Detection" *** nethack-3.3.1/dat/Barb.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Barb.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Barb.des 3.3 91/12/22 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Barb.des 3.4 1991/12/22 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/bigroom.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/bigroom.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)bigroom.des 3.3 90/04/15 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1990 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)bigroom.des 3.4 1990/04/15 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1990 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/castle.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/castle.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)castle.des 3.3 95/11/19 # Copyright (c) 1989 by Jean-Christophe Collet # NetHack may be freely redistributed. See license for details. # --- 1,4 ---- ! # SCCS Id: @(#)castle.des 3.4 1995/11/19 # Copyright (c) 1989 by Jean-Christophe Collet # NetHack may be freely redistributed. See license for details. # *** nethack-3.3.1/dat/Caveman.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Caveman.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Caveman.des 3.3 95/10/07 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Caveman.des 3.4 1995/10/07 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/cmdhelp Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/cmdhelp Thu Mar 21 07:37:35 2002 *************** *** 30,36 **** F Followed by direction, fight a monster (even if you don't sense it) g Followed by direction, move until you are near something G Followed by direction, same as control-direction ! h Go west 1 space H Go west until you are on top of something ^H Go west until you are near something i Show your inventory --- 30,36 ---- F Followed by direction, fight a monster (even if you don't sense it) g Followed by direction, move until you are near something G Followed by direction, same as control-direction ! h Go west 1 space (if number_pad is on, display help message) H Go west until you are on top of something ^H Go west until you are near something i Show your inventory *************** *** 82,87 **** --- 82,88 ---- & Tell what a command does ! Do a shell escape (only if defined) \ Show what object types have been discovered + _ Travel via a shortest-path algorithm to a point on the map . Rest one move while doing nothing Rest one move while doing nothing (if rest_on_space option is on) : Look at what is on the floor *************** *** 97,103 **** $ Count your gold + List known spells # Perform an extended command ! M-2 Toggle two-weapon combat M-a Adjust inventory letters M-c Talk to someone M-d Dip an object into something --- 98,105 ---- $ Count your gold + List known spells # Perform an extended command ! M-? Display extended command help (if the platform allows this) ! M-2 Toggle two-weapon combat (unless number_pad is enabled) M-a Adjust inventory letters M-c Talk to someone M-d Dip an object into something *** nethack-3.3.1/dat/data.base Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/data.base Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)data.base 3.3 1999/11/28 # Copyright (c) 1994, 1995, 1996 by the NetHack Development Team # Copyright (c) 1994 by Boudewijn Wayers # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)data.base 3.4 2001/09/01 # Copyright (c) 1994, 1995, 1996 by the NetHack Development Team # Copyright (c) 1994 by Boudewijn Wayers # NetHack may be freely redistributed. See license for details. *************** *** 183,188 **** --- 183,194 ---- and disciples have advanced so far as to be able to say when. [ The Devil's Dictionary, by Ambrose Bierce ] + archeologist + Archeology is the search for fact, not truth. [...] + So forget any ideas you've got about lost cities, exotic travel, + and digging up the world. We do not follow maps to buried + treasure, and X never, ever, marks the spot. + [ Indiana Jones and the Last Crusade ] archon Archons are the predominant inhabitants of the heavens. However unusual their appearance, they are not generally *************** *** 901,906 **** --- 907,913 ---- loyalty to man and gentleness with children, it is the world's most popular domestic animal. It can easily be trained to perform various tasks. + ~trap*door *door doorway Through me you pass into the city of woe: *************** *** 914,919 **** --- 921,939 ---- All hope abandon ye who enter here. [ The Inferno, from The Divine Comedy of Dante Alighieri, translated by H.F. Cary ] + doppelganger + Xander: Let go! I have to kill the demon bot! + Xander Double (grabbing the gun): Anya, get out of the way. + Buffy: Xander! + Xander Double: That's all right, Buffy. I have him. + Xander: No, Buffy, I'm me. Help me! + Anya: My gun, he's got my gun. + Riley: You own a gun? + Buffy: Xander, gun holding Xander, give it to me. + Anya: Buffy, which one's real? + Xander: I am. + Xander Double: No, _I_ am. + [ Buffy the Vampire Slayer, Episode 5.03, "The Replacement" ] *dragon *xoth In the West the dragon was the natural enemy of man. Although *************** *** 942,947 **** --- 962,968 ---- being who ever joined in the fierce, mad, intoxicating revel of the Dum-Dum. [ Tarzan of the Apes, by Edgar Rice Burroughs ] + ~dwarf ??m* dwarf* Dwarfs have faces like men (ugly men, with wrinkled, leathery skins), but are generally either flat-footed, duck-footed, or *************** *** 1007,1013 **** A Elbereth Gilthoniel, silivren penna miriel o menel aglar elenath! ! Na-chaered palen-diriel o galadhremmin ennorath, Fanuilos, le linnathon nef aear, si nef aearon! --- 1028,1034 ---- A Elbereth Gilthoniel, silivren penna miriel o menel aglar elenath! ! Na-chaered palan-diriel o galadhremmin ennorath, Fanuilos, le linnathon nef aear, si nef aearon! *************** *** 1339,1345 **** of his hat but forgot to doff it. 'What is the trouble, Alaraba?' said Ramon Alonzo. 'White magic. Run!' said the gnome .. ! [ The Charwoman's Shadow, by Lord Dunsany ] goblin Now goblins are cruel, wicked, and bad-hearted. They make no beautiful things, but they make many clever ones. They --- 1360,1381 ---- of his hat but forgot to doff it. 'What is the trouble, Alaraba?' said Ramon Alonzo. 'White magic. Run!' said the gnome .. ! [ The Charwoman's Shadow, by Lord Dunsany ] ! ! "Muggles have garden gnomes, too, you know," Harry told Ron as ! they crossed the lawn. ! "Yeah, I've seen those things they think are gnomes," said Ron, ! bent double with his head in a peony bush, "like fat little ! Santa Clauses with fishing rods..." ! There was a violent scuffling noise, the peony bush shuddered, ! and Ron straightened up. "This is a gnome," he said grimly. ! "Geroff me! Gerroff me!" squealed the gnome. ! It was certainly nothing like Santa Claus. It was small and ! leathery looking, with a large, knobby, bald head exactly like ! a potato. Ron held it at arm's length as it kicked out at him ! with its horny little feet; he grasped it around the ankles ! and turned it upside down. ! [ Harry Potter and the Chamber of Secrets, by J. K. Rowling ] goblin Now goblins are cruel, wicked, and bad-hearted. They make no beautiful things, but they make many clever ones. They *************** *** 1703,1708 **** --- 1739,1746 ---- chieftain guard healer + grand master + master kaen monk ninja nurse *************** *** 1724,1729 **** --- 1762,1777 ---- resent the intrusion of such beasts. They are capable of using weapons and magic, and it is even rumored that the Wizard of Yendor is a member of this species. + hunter + What of the hunting, hunter bold? + Brother, the watch was long and cold. + What of the quarry ye went to kill? + Brother, he crops in the jungle still. + Where is the power that made your pride? + Brother, it ebbs from my flank and side. + Where is the haste that ye hurry by? + Brother, I go to my lair to die. + [ The Jungle Book, by Rudyard Kipling ] ice devil Ice devils are large semi-insectoid creatures, who are equally at home in the fires of Hell and the cold of Limbo, *************** *** 2587,2592 **** --- 2635,2649 ---- 1. Valley between Duesseldorf and Elberfeld in Germany, where an ancient skull of a prehistoric ancestor to modern man was found. 2. Human(oid) of the race mentioned above. + neferet + neferet the green + Neferet the Green holds office in her hidden tower, only + reachable by magical means, where she teaches her apprentices + the enigmatic skills of occultism. Despite her many years, she + continues to investigate new spells, especially those involving + translocation. It is further rumored that when she was an + apprentice herself, she accidentally turned her skin green, and + has kept it that way ever since. newt (kinds of) small animal, like a lizard, which spends most of its time in the water. *************** *** 2864,2869 **** --- 2921,2935 ---- it to kill and devour it, though in any other way they move but exceeding slow. [ the Bestiary of Xygag ] + piranha + They live in "schools." Many times they will wait for prey + to come to the shallow water of the river. Then the large + group of piranhas will attack. These large groups are able + to kill large animals... Their lower teeth fit perfectly + into the spaces of their upper teeth, creating a tremendous + vice-like bite... Piranhas are attracted to any disturbance + in the water. + [ http://www.animalsoftherainforest.com ] pit spiked pit Amid the thought of the fiery destruction that impended, the *************** *** 2885,2891 **** This is an ancient artifact made of an unknown material. It is rectangular in shape, very thin, and inscribed with unreadable ancient runes. When carried, it grants the one ! who carries it ESP, and reduces all physical damage done to the carrier by half. It also protects from magic missile attacks. Finally, its power is such that when invoked, it can charge other objects. --- 2951,2957 ---- This is an ancient artifact made of an unknown material. It is rectangular in shape, very thin, and inscribed with unreadable ancient runes. When carried, it grants the one ! who carries it ESP, and reduces all spell induced damage done to the carrier by half. It also protects from magic missile attacks. Finally, its power is such that when invoked, it can charge other objects. *************** *** 3015,3020 **** --- 3081,3095 ---- he had to leave his empire. ... But all the legends of Quetzalcoatl unanimously agree that he promised to come again. [ Gods, Graves, and Scholars, by C. W. Ceram ] + quit* + Maltar: [...] I remembered a little saying I learned my first + day at the academy. + Natalie: Yeah, yeah, I know. Winners never quit and quitters + never win. + Maltar: What? No! Winners never quit and quitters should be + cast into the flaming pit of death. + [ Snow Day, directed by Chris Koch, + written by Will McRobb and Chris Viscardi ] raijin raiden The god of thunder. *************** *** 3253,3259 **** As Scorpius rises in the east, Orion sets in the west. [ 365 Starry Nights, by Chet Raymo ] *scroll ! scroll of * And I was gazing on the surges prone, With many a scalding tear and many a groan, When at my feet emerg'd an old man's hand, --- 3328,3334 ---- As Scorpius rises in the east, Orion sets in the west. [ 365 Starry Nights, by Chet Raymo ] *scroll ! scroll * And I was gazing on the surges prone, With many a scalding tear and many a groan, When at my feet emerg'd an old man's hand, *************** *** 3287,3294 **** --- 3362,3393 ---- seas - which deals with the monster Kung Kung trying to seize power from Yao, the fourth emperor. [ Spectrum Atlas van de Mythologie ] + shark + As the shark moved, its dark top reflected virtually no + light. The denticles on its skin muted the whoosh of its + movements as the shark rose, driven by the power of the + great tail sweeping from side to side, like a scythe. + The fish exploded upward. + Charles Bruder felt a slight vacuum tug in the motion of + the sea, noted it as a passing current, the pull of a wave, + the tickle of undertow. He could not have heard the faint + sucking rush of water not far beneath him. He couldn't + have seen or heard what was hurtling from the murk at + astonishing speed, jaws unhinging, widening, for the + enormous first bite. It was the classic attack + that no other creature in nature could make -- a bomb from + the depths. + [ Close to Shore, by Michael Capuzzo ] shito A Japanese stabbing knife. + shrieker + With a single, savage thrust of her spear, the warrior-woman + impaled the fungus, silencing it. However, it was too late: + the alarm had been raised[...] + Suddenly, a large, dark shape rose from the abyss before them, + its fetid bulk looming overhead...The monster was some kind of + great dark worm, but that was about all they were sure of. + [ The Adventurers, Epic IV, by Thomas A. Miller ] skeleton A skeleton is a magically animated undead creature. Unlike shades, only a humanoid creature can be used to create a *************** *** 3730,3735 **** --- 3829,3835 ---- Poems are made by fools like me, But only God can make a tree. [ Trees - Joyce Kilmer ] + tripe tripe ration If you start from scratch, cooking tripe is a long-drawn-out affair. Fresh whole tripe calls for a minimum of 12 hours of *************** *** 3978,3989 **** flat on his back upon a cold stone with his hands on his breast. [ The Fellowship of the Ring, by J.R.R. Tolkien ] - wizard of balance - The Wizard of Balance holds office in his hidden tower, only - reachable by magical means, where he teaches his apprentices - the enigmatic skills of occultism. He considers himself a - guardian of the equilibrium of the universe, and goes out of - his way to promote stability. wizard of yendor No one knows how old this mighty wizard is, or from whence he came. It is known that, having lived a span far greater than --- 4078,4083 ---- *** nethack-3.3.1/dat/dungeon.def Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/dungeon.def Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)dungeon.def 3.3 96/03/10 # Copyright (c) 1990-95 by M. Stephenson # NetHack may be freely redistributed. See license for details. # --- 1,4 ---- ! # SCCS Id: @(#)dungeon.def 3.4 1996/03/10 # Copyright (c) 1990-95 by M. Stephenson # NetHack may be freely redistributed. See license for details. # *************** *** 70,80 **** DUNGEON: "The Gnomish Mines" "M" (8, 2) ALIGNMENT: lawful DESCRIPTION: mazelike ! # LEVEL: "minetown" "T" @ (3, 2) ! RNDLEVEL: "minetn" "T" @ (3, 2) 2 LEVELDESC: town ! # LEVEL: "mine_end" "E" @ (-1, 0) ! RNDLEVEL: "minend" "E" @ (-1, 0) 2 # # The Questdungeon --- 70,78 ---- DUNGEON: "The Gnomish Mines" "M" (8, 2) ALIGNMENT: lawful DESCRIPTION: mazelike ! RNDLEVEL: "minetn" "T" @ (3, 2) 7 LEVELDESC: town ! RNDLEVEL: "minend" "E" @ (-1, 0) 3 # # The Questdungeon *** nethack-3.3.1/dat/endgame.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/endgame.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)endgame.des 3.3 96/11/09 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, # and Timo Hakulinen --- 1,4 ---- ! # SCCS Id: @(#)endgame.des 3.4 2002/01/19 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992,1993 by Izchak Miller, David Cohrs, # and Timo Hakulinen *************** *** 158,165 **** AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAACCAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ENDMAP ! TELEPORT_REGION:(09,16,09,16),(0,0,0,0) ! PORTAL:(30,0,75,19),(00,00,09,16),"fire" REGION:(00,00,75,19),lit,"ordinary" MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile --- 158,170 ---- AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAACCAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ENDMAP ! # Use up and down regions to partition the level into three parts; ! # teleportation can't cross from one part into another. ! # The up region is where you'll arrive after activating the portal from ! # the preceding level; the exit portal is placed inside the down region. ! TELEPORT_REGION:levregion(01,00,24,20),levregion(25,00,79,20),up ! TELEPORT_REGION:levregion(56,00,79,20),levregion(01,00,55,20),down ! PORTAL:levregion(57,01,78,19),(0,0,0,0),"fire" REGION:(00,00,75,19),lit,"ordinary" MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile *** nethack-3.3.1/dat/gehennom.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/gehennom.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)gehennom.des 3.3 96/11/09 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by M. Stephenson and Izchak Miller # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)gehennom.des 3.4 1996/11/09 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by M. Stephenson and Izchak Miller # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/Healer.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Healer.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Healer.des 3.3 95/04/16 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991, 1993 by M. Stephenson, P. Winner # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Healer.des 3.4 1995/04/16 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991, 1993 by M. Stephenson, P. Winner # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/help Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/help Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! Welcome to NetHack! ( description of version 3.3 ) NetHack is a Dungeons and Dragons like game where you (the adventurer) descend into the depths of the dungeon in search of the Amulet of Yendor, --- 1,4 ---- ! Welcome to NetHack! ( description of version 3.4 ) NetHack is a Dungeons and Dragons like game where you (the adventurer) descend into the depths of the dungeon in search of the Amulet of Yendor, *************** *** 43,48 **** --- 43,49 ---- \ An opulent throne. ` A boulder or statue. A to Z, a to z, and several others: Monsters. + I Invisible or unseen monster's last known location You can find out what a symbol represents by typing '/' and following the directions to move the cursor *************** *** 57,65 **** b j n 1 2 3 g: run in direction until something numberpad interesting is seen G, same, except a branching corridor isn't ! < up ^: considered interesting > down m: move without picking up objects If the number_pad option is set, the number keys move instead. Commands: NetHack knows the following commands: --- 58,72 ---- b j n 1 2 3 g: run in direction until something numberpad interesting is seen G, same, except a branching corridor isn't ! < up ^: considered interesting (the ^ in this ! case means the Control key, not a caret) > down m: move without picking up objects + F: fight even if you don't sense a monster If the number_pad option is set, the number keys move instead. + Depending on the platform, Shift number (on the numberpad), + Meta number, or Alt number will invoke the YUHJKLBN commands. + Control may or may not work when number_pad is enabled, + depending on the platform's capabilities. Commands: NetHack knows the following commands: *************** *** 70,75 **** --- 77,83 ---- < Go up a staircase (if you are standing on it). > Go down a staircase (if you are standing on it). . Rest, do nothing for one turn. + _ Travel via a shortest-path algorithm to a point on the map a Apply (use) a tool (pick-axe, key, lamp...) A Remove all armor. ^A Redo the previous command *************** *** 133,138 **** --- 141,147 ---- W Wear armor. x Swap wielded and secondary weapons. X Switch the game to explore (discovery) mode. + ^X Show your attributes. z Zap a wand. Z Cast a spell. ^Z Suspend the game. *************** *** 159,173 **** has a meta key (which, when pressed in combination with another key, modifies it by setting the 'meta' (8th, or 'high') bit), these extended commands can be invoked by meta-ing the first ! letter of the command. If the "number_pad" option is on, some additional letter commands are available: j Jump to another location. k Kick (for doors, usually). l Loot a box on the floor. ! n Name an object or type of object. u Untrap a trapped object or door. You can put a number before a command to repeat it that many times, --- 168,184 ---- has a meta key (which, when pressed in combination with another key, modifies it by setting the 'meta' (8th, or 'high') bit), these extended commands can be invoked by meta-ing the first ! letter of the command. An alt key may have a similar effect. If the "number_pad" option is on, some additional letter commands are available: + h displays the help menu, like '?' j Jump to another location. k Kick (for doors, usually). l Loot a box on the floor. ! n followed by number of times to repeat the next command ! N Name an object or type of object. u Untrap a trapped object or door. You can put a number before a command to repeat it that many times, *************** *** 175,181 **** must type 'n' to prefix the count, as in "n40." or "n20s". ! Some information is displayed on the bottom line. You see your attributes, your alignment, what dungeon level you are on, how many hit points you have now (and will have when fully recovered), what your armor class is (the lower the better), your experience level, --- 186,193 ---- must type 'n' to prefix the count, as in "n40." or "n20s". ! Some information is displayed on the bottom line or perhaps in a ! box, depending on the platform you are using. You see your attributes, your alignment, what dungeon level you are on, how many hit points you have now (and will have when fully recovered), what your armor class is (the lower the better), your experience level, *** nethack-3.3.1/dat/hh Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/hh Thu Mar 21 07:37:35 2002 *************** *** 5,14 **** b j n 1 2 3 g: run in direction until something numberpad interesting is seen G, same, except a branching corridor isn't ! < up ^: considered interesting > down m: move without picking up objects/fighting F: fight even if you don't sense a monster If the number_pad option is set, the number keys move instead. General commands: ? help display one of several informative texts --- 5,19 ---- b j n 1 2 3 g: run in direction until something numberpad interesting is seen G, same, except a branching corridor isn't ! < up ^: considered interesting (the ^ in this ! case means the Control key, not a caret) > down m: move without picking up objects/fighting F: fight even if you don't sense a monster If the number_pad option is set, the number keys move instead. + Depending on the platform, Shift number (on the numberpad), + Meta number, or Alt number will invoke the YUHJKLBN commands. + Control may or may not work when number_pad is enabled, + depending on the platform's capabilities. General commands: ? help display one of several informative texts *************** *** 30,35 **** --- 35,41 ---- Game commands: ^D kick kick (a door, or something else) ^T 'port teleport (if you can) + ^X show show your attributes a apply apply or use a tool (pick-axe, key, camera, etc.) A armor take off all armor c close close a door *************** *** 67,72 **** --- 73,79 ---- * ask for combination of ),[,=,",( all at once $ gold count your gold + spells list the spells you know; also rearrange them if desired + _ travel move via a shortest-path algorithm to a point on the map . rest wait a moment , pickup pick up all you can carry @ toggle "pickup" (auto pickup) option on and off *************** *** 76,82 **** Keyboards that have a meta key can also use these extended commands via the meta modifier instead of the # prefix: ! M-2 twoweapon toggle two-weapon combat M-a adjust adjust inventory letters M-c chat talk to someone M-d dip dip an object into something --- 83,90 ---- Keyboards that have a meta key can also use these extended commands via the meta modifier instead of the # prefix: ! M-? Display extended command help (if the platform allows this) ! M-2 twoweapon toggle two-weapon combat (unless number_pad is enabled) M-a adjust adjust inventory letters M-c chat talk to someone M-d dip dip an object into something *************** *** 90,96 **** M-o offer offer a sacrifice to the gods M-p pray pray to the gods for help M-q quit stop playing ! M-r rub rub a lamp M-s sit sit down M-t turn turn undead M-u untrap untrap something --- 98,104 ---- M-o offer offer a sacrifice to the gods M-p pray pray to the gods for help M-q quit stop playing ! M-r rub rub a lamp or a stone M-s sit sit down M-t turn turn undead M-u untrap untrap something *************** *** 100,105 **** --- 108,114 ---- If the "number_pad" option is on, these additional variants are available: n followed by number of times to repeat the next command + h help display one of several informative texts, like '?' j jump jump to another location k kick kick something (usually a door) l loot loot a box on the floor *** nethack-3.3.1/dat/history Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/history Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! NetHack History file for release 3.3 Behold, mortal, the origins of NetHack... --- 1,4 ---- ! NetHack History file for release 3.4 Behold, mortal, the origins of NetHack... *************** *** 100,129 **** with the help of Kevin Hugo, added more features. Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. ! The 3.3 development team consisted of Michael Allison, Ken Arromdee, ! David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, Timo Hakulinen, ! Kevin Hugo, Steve Linhart, Dean Luick, Pat Rankin, Eric Smith, Mike ! Stephenson, Janet Walz, and Paul Winner. ! As with version 3.2, various people contributed to the game as a whole as well as supporting ports on the different platforms that NetHack runs on: ! Pat Rankin maintained 3.3 for VMS. ! Michael Allison ported NetHack 3.3 for the MS-DOS platform. Paul Winner ! and Yitzhak Sapir provided encouragement. Dean Luick, Mark Modrall, and Kevin Hugo maintained and enhanced the ! Macintosh port of 3.3. ! Michael Allison ported 3.3 for the Microsoft Windows NT platform. ! Ron Van Iwaarden took over responsibility for the OS/2 port. ! The Amiga port of NetHack was resurrected for 3.3.1 by Janne Salmijarvi. ! The Atari port of NetHack was resurrected for 3.3.1 by Christian "Marvin" ! Bressler. - - - - - - - - - - --- 100,155 ---- with the help of Kevin Hugo, added more features. Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. ! The final update to 3.2 was the bug fix release 3.2.3, which was released ! simultaneously with 3.3.0 in December 1999 just in time for the Year 2000. ! The 3.3 development team, consisting of Michael Allison, Ken Arromdee, ! David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, Timo Hakulinen, ! Kevin Hugo, Steve Linhart, Ken Lorber, Dean Luick, Pat Rankin, Eric Smith, ! Mike Stephenson, Janet Walz, and Paul Winner, released 3.3.0 in ! December 1999 and 3.3.1 in August of 2000. ! ! Version 3.3 offered many firsts. It was the first version to separate race ! and profession. The Elf class was removed in preference to an elf race, ! and the races of dwarves, gnomes, and orcs made their first appearance in ! the game alongside the familiar human race. Monk and Ranger roles joined ! Archeologists, Barbarians, Cavemen, Healers, Knights, Priests, Rogues, ! Samurai, Tourists, Valkyries and of course, Wizards. It was also the first ! version to allow you to ride a steed, and was the first version to have a ! publicly available web-site listing all the bugs that had been discovered. ! Despite that constantly growing bug list, 3.3 proved stable enough to last ! for more than a year and a half. ! ! ! The 3.4 development team initially consisted of Michael Allison, Ken Arromdee, ! David Cohrs, Jessie Collet, Kevin Hugo, Ken Lorber, Dean Luick, Pat Rankin, ! Mike Stephenson, Janet Walz, and Paul Winner, with Warwick Allison joining ! just before the release of NetHack 3.4.0 in March 2002. ! ! As with version 3.3, various people contributed to the game as a whole as well as supporting ports on the different platforms that NetHack runs on: ! Pat Rankin maintained 3.4 for VMS. ! Michael Allison maintained NetHack 3.4 for the MS-DOS platform. ! Paul Winner and Yitzhak Sapir provided encouragement. Dean Luick, Mark Modrall, and Kevin Hugo maintained and enhanced the ! Macintosh port of 3.4. ! ! Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas, and Yitzhak Sapir ! maintained and enhanced 3.4 for the Microsoft Windows platform. Alex Kompel ! contributed a new graphical interface for the Windows port. ! Ron Van Iwaarden maintained 3.4 for OS/2. ! Janne Salmijarvi and Teemu Suikki maintained and enhanced the ! Amiga port of 3.4 after Janne Salmijarvi resurrected it for 3.3.1. ! Christian `Marvin' Bressler maintained 3.4 for the Atari after he ! resurrected it for 3.3.1. ! There is a NetHack web site maintained by Ken Lorber at http://www.nethack.org/. - - - - - - - - - - *************** *** 132,162 **** the Dungeon sometimes make note of the names of the worst of these miscreants in this, the list of Dungeoneers: ! Adam Aronow Irina Rempt-Drijfhout Mike Gallop ! Andy Church Izchak Miller Mike Passaretti ! Andy Swanson Janet Walz Mike Stephenson ! Ari Huttunen Janne Salmijarvi Norm Meluch ! Barton House Jean-Christophe Collet Olaf Seibert ! Benson I. Margulies Jochen Erwied Pat Rankin ! Bill Dyer John Kallen Paul Winner ! Boudewijn Waijers John Rupley Pierre Martineau ! Bruce Cox John S. Bien Ralf Brown ! Bruce Holloway Johnny Lee Richard Addison ! Bruce Mewborne Jon W{tte Richard Beigel ! Carl Schelin Jonathan Handler Richard P. Hughey ! Chris Russo Joshua Delahunty Rob Menke ! David Cohrs Keizo Yamamoto Robin Johnson ! David Damerell Ken Arromdee Roland McGrath ! David Gentzel Ken Lorber Ron Van Iwaarden ! David Hairston Ken Washikita Ronnen Miller ! Dean Luick Kevin Darcy Ross Brown ! Del Lamb Kevin Hugo Sascha Wostmann ! Deron Meranda Kevin Sitze Scott R. Turner ! Dylan O'Donnell Kevin Smolkowski Stephen Spackman ! Eric Backus Kevin Sweet Stephen White ! Eric Hendrickson Lars Huttar Steve Creps ! Eric R. Smith Mark Gooderum Steve Linhart ! Eric S. Raymond Mark Modrall Steve VanDevender Erik Andersen Marvin Bressler Tim Lennan Frederick Roeber Matthew Day Timo Hakulinen Gil Neiger Merlyn LeRoy Tom Almy --- 158,191 ---- the Dungeon sometimes make note of the names of the worst of these miscreants in this, the list of Dungeoneers: ! Adam Aronow Helge Hafting Mike Engber ! Alex Kompel Irina Rempt-Drijfhout Mike Gallop ! Andreas Dorn Izchak Miller Mike Passaretti ! Andy Church J. Ali Harlow Mike Stephenson ! Andy Swanson Janet Walz Norm Meluch ! Ari Huttunen Janne Salmijarvi Olaf Seibert ! Barton House Jean-Christophe Collet Pat Rankin ! Benson I. Margulies Jochen Erwied Paul Winner ! Bill Dyer John Kallen Pierre Martineau ! Boudewijn Waijers John Rupley Ralf Brown ! Bruce Cox John S. Bien Richard Addison ! Bruce Holloway Johnny Lee Richard Beigel ! Bruce Mewborne Jon W{tte Richard P. Hughey ! Carl Schelin Jonathan Handler Rob Menke ! Chris Russo Joshua Delahunty Robin Johnson ! David Cohrs Keizo Yamamoto Roland McGrath ! David Damerell Ken Arnold Ron Van Iwaarden ! David Gentzel Ken Arromdee Ronnen Miller ! David Hairston Ken Lorber Ross Brown ! Dean Luick Ken Washikita Sascha Wostmann ! Del Lamb Kevin Darcy Scott Bigham ! Deron Meranda Kevin Hugo Scott R. Turner ! Dion Nicolaas Kevin Sitze Stephen Spackman ! Dylan O'Donnell Kevin Smolkowski Stephen White ! Eric Backus Kevin Sweet Steve Creps ! Eric Hendrickson Lars Huttar Steve Linhart ! Eric R. Smith Mark Gooderum Steve VanDevender ! Eric S. Raymond Mark Modrall Teemu Suikki Erik Andersen Marvin Bressler Tim Lennan Frederick Roeber Matthew Day Timo Hakulinen Gil Neiger Merlyn LeRoy Tom Almy *************** *** 164,167 **** Greg Olson Michael Feir Warren Cheung Gregg Wonderly Michael Hamel Warwick Allison Hao-yang Wang Michael Sokolov Yitzhak Sapir ! Helge Hafting Mike Engber --- 193,196 ---- Greg Olson Michael Feir Warren Cheung Gregg Wonderly Michael Hamel Warwick Allison Hao-yang Wang Michael Sokolov Yitzhak Sapir ! *** nethack-3.3.1/dat/Knight.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Knight.des Thu Mar 21 07:37:35 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Knight.des 3.3 95/04/16 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991,92 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Knight.des 3.4 1995/04/16 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991,92 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/knox.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/knox.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)knox.des 3.3 94/08/20 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by Izchak Miller # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)knox.des 3.4 1994/08/20 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by Izchak Miller # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/medusa.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/medusa.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)medusa.des 3.3 96/05/11 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1990, 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)medusa.des 3.4 1996/05/11 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1990, 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/mines.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/mines.des Thu Mar 21 07:37:36 2002 *************** *** 1,18 **** ! # SCCS Id: @(#)mines.des 3.3 95/10/07 # Copyright (c) 1989-95 by Jean-Christophe Collet # Copyright (c) 1991-95 by M. Stephenson # NetHack may be freely redistributed. See license for details. # LEVEL: "minetn-1" ROOM: "ordinary" , lit, (3,3), (center,center), (31,15) NAME: "town" FOUNTAIN: (13, 7) FOUNTAIN: (20, 7) ! # ! # The Town Watch. ! # MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful --- 1,62 ---- ! # SCCS Id: @(#)mines.des 3.4 2002/01/01 # Copyright (c) 1989-95 by Jean-Christophe Collet # Copyright (c) 1991-95 by M. Stephenson # NetHack may be freely redistributed. See license for details. # + # The "fill" level for the mines. + # + # This level is used to fill out any levels not occupied by + # specific levels as defined below. + # + MAZE: "minefill" , ' ' + INIT_MAP: '.' , ' ' , true , true , random , true + NOMAP + # + STAIR: random, up + STAIR: random, down + # + OBJECT: '*', random, random + OBJECT: '*', random, random + OBJECT: '*', random, random + OBJECT: '(', random, random + OBJECT: random, random, random + OBJECT: random, random, random + OBJECT: random, random, random + # + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome lord", random + MONSTER: 'h', "dwarf", random + MONSTER: 'h', "dwarf", random + MONSTER: 'G', random, random + MONSTER: 'G', random, random + MONSTER: 'h', random, random + # + TRAP: random, random + TRAP: random, random + TRAP: random, random + TRAP: random, random + TRAP: random, random + TRAP: random, random + + + # Minetown variant 1 + # "Frontier Town" + # LEVEL: "minetn-1" ROOM: "ordinary" , lit, (3,3), (center,center), (31,15) NAME: "town" FOUNTAIN: (13, 7) FOUNTAIN: (20, 7) ! ! # The Town Watch MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful *************** *** 82,188 **** RANDOM_CORRIDORS - MAZE: "minend-1", ' ' - GEOMETRY:center,center - MAP - --------------------------------------------------------------------------- - | |.......| |.......-...| |.....| | - | --------- ----.......-------...........| ---...--- | - | |.......| |..........................--- --.......| | - | |......------- ---........................| |.......-- | - | |..--........-----..........................| -.-..---- | - | --..--.-----........-.....................--- --..-- | - | --..--..| -----------..................---.----------..-- | - | |...--.| |..S...S..............---................-- | - | ----..----- ------------........--- ------------...--- | - | |.........-- ---------- ---...-- ----- | - | --.....---..-- -------- --...---...-- | - | ----..-..-- --..--------------------- --......-- ---........| | - |--....----- --..-..................--- |........| |.......-- | - |.......| --......................| --......-- ---..---- | - |--.--.-- ----.................--- ------..------...-- | - | |....| |...............-..| |...........| | - --------------------------------------------------------------------------- - ENDMAP - # Dungeon Description - REGION:(26,01,32,01),unlit,"ordinary",filled,true - REGION:(20,08,21,08),unlit,"ordinary" - REGION:(23,08,25,08),unlit,"ordinary" - # Secret doors - DOOR:locked,(22,08) - DOOR:locked,(26,08) - # Stairs - STAIR:(36,04),up - # Non diggable walls - NON_DIGGABLE:(00,00,74,17) - # Objects - OBJECT:'*',"diamond",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"diamond",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"emerald",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"emerald",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"emerald",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"ruby",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"ruby",(21,08) - OBJECT:'*',"amethyst",(21,08) - OBJECT:'*',random,(21,08) - OBJECT:'*',"amethyst",(21,08) - OBJECT:'*',"luckstone",(21,08) - OBJECT:'*',random,random - OBJECT:'*',random,random - OBJECT:'*',random,random - OBJECT:'*',random,random - OBJECT:'*',random,random - OBJECT:'*',random,random - OBJECT:'*',random,random - OBJECT:'(',random,random - OBJECT:'(',random,random - OBJECT:random,random,random - OBJECT:random,random,random - OBJECT:random,random,random - # Random traps - TRAP:random,random - TRAP:random,random - TRAP:random,random - TRAP:random,random - TRAP:random,random - TRAP:random,random - # Random monsters. - MONSTER:'G',"gnome king",random - MONSTER:'G',"gnome lord",random - MONSTER:'G',"gnome lord",random - MONSTER:'G',"gnome lord",random - MONSTER:'G',"gnomish wizard",random - MONSTER:'G',"gnomish wizard",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'G',"gnome",random - MONSTER:'h',"hobbit",random - MONSTER:'h',"hobbit",random - MONSTER:'h',"dwarf",random - MONSTER:'h',"dwarf",random - MONSTER:'h',"dwarf",random - MONSTER:'h',random,random LEVEL: "minetn-2" ROOM: "ordinary" , lit, (3,3), (center,center), (31,15) NAME: "town" FOUNTAIN: (17, 5) FOUNTAIN: (13, 8) ! # ! # The Town Watch. ! # MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful --- 126,142 ---- RANDOM_CORRIDORS + # Minetown variant 2 + # "Town Square" + # LEVEL: "minetn-2" ROOM: "ordinary" , lit, (3,3), (center,center), (31,15) NAME: "town" FOUNTAIN: (17, 5) FOUNTAIN: (13, 8) ! ! # The Town Watch MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful *************** *** 268,273 **** --- 222,797 ---- RANDOM_CORRIDORS + + # Minetown variant 3 by Kelly Bailey + # "Alley Town" + # + LEVEL: "minetn-3" + ROOM: "ordinary",lit,(3,3),(center,center),(31,15) + NAME: "town" + FOUNTAIN:(01,06) + FOUNTAIN:(29,13) + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watch captain", random, peaceful + + SUBROOM:"ordinary",random,(2,2),(2,2),"town" + DOOR: false,closed,south,random + + SUBROOM:"tool shop",lit,(5,3),(2,3),"town" + CHANCE: 30 + DOOR: false,closed,south,random + + SUBROOM:"ordinary",random,(2,10),(2,3),"town" + DOOR: false, locked, north, random + MONSTER: 'G',random,random + + SUBROOM:"ordinary",random,(5,9),(2,2),"town" + DOOR: false,closed,north,random + + SUBROOM:"temple",lit,(10,2),(3,4),"town" + DOOR: false,closed,east,random + ALTAR:(1,1),align[0],shrine + MONSTER: 'G', "gnomish wizard", random + MONSTER: 'G', "gnomish wizard", random + + SUBROOM:"ordinary",random,(11,7),(2,2),"town" + DOOR: false,closed,west,random + + SUBROOM:"shop",lit,(10,10),(3,3),"town" + DOOR:false,closed,west,random + + SUBROOM:"ordinary",random,(14,8),(2,2),"town" + DOOR:false,locked,north,random + MONSTER: 'G',random,random + + SUBROOM:"ordinary",random,(14,11),(2,2),"town" + DOOR:false,closed,south,random + + SUBROOM:"tool shop",lit,(17,10),(3,3),"town" + CHANCE:40 + DOOR:false,closed,north,random + + SUBROOM:"ordinary",random,(21,11),(2,2),"town" + DOOR:false,locked,east,random + MONSTER:'G',random,random + + SUBROOM:"food shop",lit,(26,8),(3,2),"town" + CHANCE:90 + DOOR:false,closed,west,random + + SUBROOM:"ordinary",random,(16,2),(2,2),"town" + DOOR:false,closed,west,random + + SUBROOM:"ordinary",random,(19,2),(2,2),"town" + DOOR:false,closed,north,random + + SUBROOM:"wand shop",lit,(19,5),(3,2),"town" + CHANCE:30 + DOOR:false,closed,west,random + + SUBROOM: "candle shop",lit,(25,2),(3,3),"town" + DOOR:false,closed,south,random + + ROOM: "ordinary", random, random, random, random + STAIR: random, up + + ROOM: "ordinary" , random, random, random, random + STAIR: random, down + TRAP: random, random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + + ROOM: "ordinary" , random, random, random, random + MONSTER: 'h', "dwarf", random + + ROOM: "ordinary" , random, random, random, random + TRAP: random, random + MONSTER: 'G', "gnome", random + + RANDOM_CORRIDORS + + + # Minetown variant 4 by Kelly Bailey + # "College Town" + # + LEVEL: "minetn-4" + ROOM: "ordinary",lit,(3,3),(center,center),(30,15) + NAME: "town" + FOUNTAIN:(08,07) + FOUNTAIN:(18,07) + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watch captain", random, peaceful + + SUBROOM:"book shop",lit,(4,2),(3,3),"town" + DOOR: false,closed,south,random + + SUBROOM:"ordinary",random,(8,2),(2,2),"town" + DOOR: false,closed,south,random + + SUBROOM:"temple",lit,(11,3),(5,4),"town" + DOOR: false,closed,south,random + ALTAR:(2,1),align[0],shrine + MONSTER: 'G', "gnomish wizard", random + MONSTER: 'G', "gnomish wizard", random + + SUBROOM:"ordinary",random,(19,2),(2,2),"town" + DOOR: false,closed,south,random + MONSTER: 'G', random, random + + SUBROOM:"candle shop",lit,(22,2),(3,3),"town" + DOOR:false,closed,south,random + + SUBROOM:"ordinary",random,(26,2),(2,2),"town" + DOOR:false,locked,east,random + MONSTER: 'G',random,random + + SUBROOM:"tool shop",lit,(4,10),(3,3),"town" + CHANCE:90 + DOOR:false,closed,north,random + + SUBROOM:"ordinary",random,(8,11),(2,2),"town" + DOOR:false,locked,south,random + MONSTER: 'k',"kobold shaman",random + MONSTER: 'k',"kobold shaman",random + MONSTER: 'f',"kitten",random + MONSTER: 'f',random,random + + SUBROOM:"food shop",lit,(11,11),(3,2),"town" + CHANCE:90 + DOOR:false,closed,east,random + + SUBROOM:"ordinary",random,(17,11),(2,2),"town" + DOOR:false,closed,west,random + + SUBROOM:"ordinary",random,(20,10),(2,2),"town" + DOOR:false,locked,north,random + MONSTER:'G',random,random + + SUBROOM:"shop",lit,(23,10),(3,3),"town" + CHANCE:90 + DOOR:false,closed,north,random + + ROOM: "ordinary" , random, random, random, random + STAIR: random, up + + ROOM: "ordinary" , random, random, random, random + STAIR: random, down + TRAP: random, random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + + ROOM: "ordinary" , random, random, random, random + MONSTER: 'h', "dwarf", random + + ROOM: "ordinary" , random, random, random, random + TRAP: random, random + MONSTER: 'G', "gnome", random + + RANDOM_CORRIDORS + + + # "Grotto Town" by Kelly Bailey + # + MAZE: "minetn-5",' ' + GEOMETRY:center,center + MAP + ----- --------- + |...--- ------.......-- ------- --------------- + |.....----.........--..| |.....| ------- |.............| + --..-....-.----------..| |.....| |.....| --+---+- .----+- + --.--.....---- ---- |.....| ------ --....---- |..-...--.-.+..| + ---.........---- ----- ---+--- |..+.| ---..-..----..---+-..---..| + ----.-....|..----...-- |.| |..|.| ---+-.....-+--........--+- + -----..|....-.....---- |.| |..|.------......--................| + ------ |..|.............---.-- ----.+..|-.......--..--------+--..-- + |....| --......---...........----- |.|..|-...{....---|.........|..-- + |....| |........-...-...........----.|..|--.......| |.........|...| + ---+--------....-------...---......--.-------....---- -----------...| + ------.---...--...--..-..--...-..---...|.--..-...-....------- |.......-- + |..|-.........-..---..-..---.....--....|........---...-|....| |.------- + |..+...............-+---+-----..--..........--....--...+....| |.|...S. + -----.....{....----...............-...........--...-...-|....| |.|...| + |..............-- --+--.---------.........--..-........------- |.--+------- + -+-----.........| |...|.|....| --.......------...|....---------.....|....| + |...| --..------- |...|.+....| ---...--- --..|...--......-...{..+..-+| + |...| ---- ------|....| ----- -----.....----........|..|.| + ----- ------ ------- --------------- + ENDMAP + STAIR:(01,01),up + STAIR:(46,03),down + + REGION:(00,00,74,20),unlit,"ordinary" + REGION:(09,13,11,17),lit,"ordinary" + REGION:(08,14,12,16),lit,"ordinary" + REGION:(49,07,51,11),lit,"ordinary" + REGION:(48,08,52,10),lit,"ordinary" + REGION:(64,17,68,19),lit,"ordinary" + REGION:(37,13,39,17),lit,"ordinary" + REGION:(36,14,40,17),lit,"ordinary" + REGION:(59,02,72,10),lit,"ordinary" + + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watch captain", random, peaceful + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome lord", random + MONSTER: 'G', "gnome lord", random + MONSTER: 'h', "dwarf", random + MONSTER: 'h', "dwarf", random + MONSTER: 'h', "dwarf", random + + # The shops + REGION:(25,17,28,19),lit,"candle shop" + DOOR:closed,(24,18) + REGION:(59,9,67,10),lit,"shop" + DOOR:closed,(66,08) + REGION:(57,13,60,15),lit,"tool shop" + DOOR:closed,(56,14) + REGION:(05,09,08,10),lit,"food shop" + DOOR:closed,(07,11) + # Gnome homes + DOOR:closed,(04,14) + DOOR:locked,(01,17) + MONSTER: 'G', "gnomish wizard", (02,19) + DOOR:locked,(20,16) + MONSTER: 'G', random, (20,18) + DOOR:random,(21,14) + DOOR:random,(25,14) + DOOR:random,(42,08) + DOOR:locked,(40,05) + MONSTER: 'G', random, (38,07) + DOOR:random,(59,03) + DOOR:random,(58,06) + DOOR:random,(63,03) + DOOR:random,(63,05) + DOOR:locked,(71,03) + DOOR:locked,(71,06) + DOOR:closed,(69,04) + DOOR:closed,(67,16) + MONSTER: 'G', "gnomish wizard", (67,14) + OBJECT: '=', random, (70,14) + DOOR:locked,(69,18) + MONSTER: 'G', "gnome lord", (71,19) + DOOR:locked,(73,18) + OBJECT: '(', "chest", (73,19) + DOOR:locked,(50,06) + OBJECT: '(', random, (50,03) + OBJECT: '`', "statue", (38,15), "gnome king", 1 + # Temple + REGION:(29,02,33,04),lit,"temple" + DOOR:closed,(31,05) + ALTAR:(31,03),align[0],shrine + + + # "Bustling Town" by Kelly Bailey + # + MAZE: "minetn-6",' ' + INIT_MAP:'.','-',true,true,lit,true + GEOMETRY:center,top + MAP + .-----................----------------. + .|...|................|...|..|...|...|. + .|...+..--+--.........|...|..|...|...|. + .|...|..|...|..-----..|...|..|-+---+--. + .-----..|...|--|...|..--+---+-......... + ........|...|..|...+.............-----. + ........-----..|...|......--+-...|...|. + .----...|...|+------..{...|..|...+...|. + .|..+...|...|.............|..|...|...|. + .|..|...|...|-+-.....---+-------------. + .----...--+--..|..-+-|................. + ...|........|..|..|..|----....--------- + ...|..T.....----..|..|...+....|......|- + ...|-....{........|..|...|....+......|- + ...--..-....T.....--------....|......|- + .......--.....................--------- + ENDMAP + REGION:(00,00,38,15),lit,"ordinary" + STAIR:levregion(01,03,20,19),(0,0,38,15),up + STAIR:levregion(21,03,75,19),(0,0,38,15),down + REGION:(13,5,14,6),unlit,"ordinary" + REGION:(9,7,11,9),lit,"candle shop" + REGION:(16,4,18,6),lit,"tool shop" + REGION:(23,1,25,3),lit,"shop" + REGION:(22,12,24,13),lit,"food shop" + REGION:(31,12,36,14),lit,"temple" + ALTAR:(35,13),align[0],shrine + + DOOR:closed,(5,2) + DOOR:locked,(4,8) + DOOR:closed,(10,2) + DOOR:closed,(10,10) + DOOR:locked,(13,7) + DOOR:locked,(14,9) + DOOR:closed,(19,5) + DOOR:closed,(19,10) + DOOR:closed,(24,4) + DOOR:closed,(24,9) + DOOR:closed,(25,12) + DOOR:closed,(28,4) + DOOR:locked,(28,6) + DOOR:closed,(30,13) + DOOR:closed,(31,3) + DOOR:closed,(35,3) + DOOR:closed,(33,7) + + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", (14,6) + MONSTER: 'G', "gnome lord", (14,5) + MONSTER: 'G', "gnome", (27,8) + MONSTER: 'G', "gnome lord", random + MONSTER: 'G', "gnome lord", random + MONSTER: 'h', "dwarf", random + MONSTER: 'h', "dwarf", random + MONSTER: 'h', "dwarf", random + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watch captain", random, peaceful + MONSTER: '@', "watch captain", random, peaceful + + + # "Bazaar Town" by Kelly Bailey + # + LEVEL: "minetn-7" + ROOM: "ordinary" , lit, (3,3), (center,center), (30,15) + NAME: "town" + FOUNTAIN: (12, 07) + FOUNTAIN: (11, 13) + + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watchman", random, peaceful + MONSTER: '@', "watch captain", random, peaceful + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome lord",random + MONSTER:'Y',"monkey",random + MONSTER:'Y',"monkey",random + + SUBROOM: "ordinary", random, (2,2), (4,2), "town" + DOOR: false, closed, south, random + + SUBROOM: "ordinary", random, (7,2), (2,2), "town" + DOOR: false, closed, north, random + + SUBROOM: "ordinary", random, (7,5), (2,2), "town" + DOOR: false, closed, south, random + + SUBROOM: "ordinary", lit, (10,2), (3,4), "town" + MONSTER:'G',"gnome",random + MONSTER:'Y',"monkey",random + MONSTER:'Y',"monkey",random + MONSTER:'Y',"monkey",random + DOOR: false, closed, south, random + + SUBROOM: "ordinary", random, (14,2), (4,2), "town" + DOOR: false, closed, south, 0 + MONSTER: 'n', random, random + + SUBROOM: "ordinary", random, (16,5), (2,2), "town" + DOOR: false, closed, south, random + + SUBROOM: "ordinary", unlit, (19,2), (2,2), "town" + DOOR: false, locked, east, random + MONSTER: 'G',"gnome king",random + + SUBROOM: "food shop", lit, (19,5), (2,3), "town" + CHANCE: 50 + DOOR: false, closed, south, random + + SUBROOM: "ordinary", random, (2,7), (2,2), "town" + DOOR: false, closed, east, random + + SUBROOM: "tool shop", lit, (2,10), (2,3), "town" + CHANCE: 50 + DOOR: false, closed, south, random + + SUBROOM: "candle shop", lit, (5,10),(3,3), "town" + DOOR: false, closed, north, random + + SUBROOM: "ordinary", random, (11,10), (2,2), "town" + DOOR: false, locked, west, random + MONSTER: 'G',random,random + + SUBROOM: "shop", lit, (14,10), (2,3), "town" + CHANCE: 60 + DOOR: false, closed, north, random + + SUBROOM: "ordinary", random, (17,11), (4,2), "town" + DOOR: false, closed, north, random + + SUBROOM: "ordinary", random, (22,11), (2,2), "town" + DOOR: false, closed, south, random + SINK: (00,00) + + SUBROOM: "food shop", lit, (25,11), (3,2), "town" + CHANCE: 50 + DOOR: false, closed, east, random + + SUBROOM: "tool shop", lit, (25,2), (3,3), "town" + CHANCE: 30 + DOOR: false, closed, west, random + + SUBROOM: "temple", lit, (24,6), (4,4), "town" + DOOR: false, closed, west, random + ALTAR:(02,01),align[0],shrine + MONSTER: 'G', "gnomish wizard", random + MONSTER: 'G', "gnomish wizard", random + + ROOM: "ordinary" , random, random, random, random + STAIR: random, up + + ROOM: "ordinary" , random, random, random, random + STAIR: random, down + TRAP: random, random + MONSTER: 'G', "gnome", random + MONSTER: 'G', "gnome", random + + ROOM: "ordinary" , random, random, random, random + MONSTER: 'h', "dwarf", random + + ROOM: "ordinary" , random, random, random, random + TRAP: random, random + MONSTER: 'G', "gnome", random + + RANDOM_CORRIDORS + + + # Mine end level variant 1 + # "Mimic of the Mines" + # + MAZE: "minend-1", ' ' + GEOMETRY:center,center + #1234567890123456789012345678901234567890123456789012345678901234567890 + MAP + ------------------------------------------------------------------ ------ + | |.......| |.......-...| |.....|. | + | --------- ----.......-------...........| ---...-S- | + | |.......| |..........................-S- --.......| | + | |......------- ---........................|. |.......-- | + | |..--........-----..........................|. -.-..---- | + | --..--.-----........-.....................--- --..-- | + | --..--..| -----------..................---.----------..-- | + | |...--.| |..S...S..............---................-- | + | ----..----- ------------........--- ------------...--- | + | |.........-- ---------- ---...-- ----- | + | --.....---..-- -------- --...---...-- | + | ----..-..-- --..--------------------- --......-- ---........| | + |--....----- --..-..................--- |........| |.......-- | + |.......| --......................S.. --......-- ---..---- | + |--.--.-- ----.................--- ------..------...-- | + | |....S.. |...............-..| ..S...........| | + -------- -------------------- ------------------------ + ENDMAP + # Dungeon Description + RANDOM_PLACES:(08,16),(13,07),(21,08),(41,14),(50,04),(50,16),(66,01) + REGION:(26,01,32,01),unlit,"ordinary",filled,true + REGION:(20,08,21,08),unlit,"ordinary" + REGION:(23,08,25,08),unlit,"ordinary" + # Secret doors + DOOR:locked,(07,16) + DOOR:locked,(22,08) + DOOR:locked,(26,08) + DOOR:locked,(40,14) + DOOR:locked,(50,03) + DOOR:locked,(51,16) + DOOR:locked,(66,02) + # Stairs + STAIR:(36,04),up + # Non diggable walls + NON_DIGGABLE:(00,00,74,17) + # Niches + # Note: place[6] empty + OBJECT:'*',"diamond",place[0] + OBJECT:'*',"emerald",place[0] + OBJECT:'*',"worthless piece of violet glass",place[0] + MONSTER:'m',random,place[0], m_object "luckstone" + OBJECT:'*',"worthless piece of white glass",place[1] + OBJECT:'*',"emerald",place[1] + OBJECT:'*',"amethyst",place[1] + MONSTER:'m',random,place[1], m_object "loadstone" + OBJECT:'*',"diamond",place[2] + OBJECT:'*',"worthless piece of green glass",place[2] + OBJECT:'*',"amethyst",place[2] + MONSTER:'m',random,place[2], m_object "flint" + OBJECT:'*',"worthless piece of white glass",place[3] + OBJECT:'*',"emerald",place[3] + OBJECT:'*',"worthless piece of violet glass",place[3] + MONSTER:'m',random,place[3], m_object "touchstone" + OBJECT:'*',"worthless piece of red glass",place[4] + OBJECT:'*',"ruby",place[4] + OBJECT:'*',"loadstone",place[4] + OBJECT:'*',"ruby",place[5] + OBJECT:'*',"worthless piece of red glass",place[5] + OBJECT:'*',"luckstone",place[5] + # Random objects + OBJECT:'*',random,random + OBJECT:'*',random,random + OBJECT:'*',random,random + OBJECT:'*',random,random + OBJECT:'*',random,random + OBJECT:'*',random,random + OBJECT:'*',random,random + OBJECT:'(',random,random + OBJECT:'(',random,random + OBJECT:random,random,random + OBJECT:random,random,random + OBJECT:random,random,random + # Random traps + TRAP:random,random + TRAP:random,random + TRAP:random,random + TRAP:random,random + TRAP:random,random + TRAP:random,random + # Random monsters + MONSTER:'G',"gnome king",random + MONSTER:'G',"gnome lord",random + MONSTER:'G',"gnome lord",random + MONSTER:'G',"gnome lord",random + MONSTER:'G',"gnomish wizard",random + MONSTER:'G',"gnomish wizard",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'G',"gnome",random + MONSTER:'h',"hobbit",random + MONSTER:'h',"hobbit",random + MONSTER:'h',"dwarf",random + MONSTER:'h',"dwarf",random + MONSTER:'h',"dwarf",random + MONSTER:'h',random,random + + + # Mine end level variant 2 + # "Gnome King's Wine Cellar" + # MAZE: "minend-2", ' ' GEOMETRY:center,center MAP *************** *** 284,290 **** |.|---|..|--|.......|----------------------------|..|..... | |...........|----.--|......................| |..|....... | |-----------|...|.| |------------------|.|.|-----|..|.....|.. | ! |-----------|...|.|--------------------|.|..........|.....|.... | |...............|.S......................|-------------..-----... | |.--------------|.|--------------------|.|......................... | |.................| |.....................|........ | --- 808,814 ---- |.|---|..|--|.......|----------------------------|..|..... | |...........|----.--|......................| |..|....... | |-----------|...|.| |------------------|.|.|-----|..|.....|.. | ! |-----------|.{.|.|--------------------|.|..........|.....|.... | |...............|.S......................|-------------..-----... | |.--------------|.|--------------------|.|......................... | |.................| |.....................|........ | *************** *** 383,427 **** MONSTER:'h',"dwarf",random MONSTER:'h',random,random - # - # The "fill" level for the mines. - # - # This level is used to fill out any levels not occupied by specific - # levels as defined above. - # ! MAZE: "minefill" , ' ' ! INIT_MAP: '.' , ' ' , true , true , random , true ! NOMAP # ! STAIR: random, up ! STAIR: random, down ! # ! OBJECT: '*', random, random ! OBJECT: '*', random, random ! OBJECT: '*', random, random ! OBJECT: '(', random, random ! OBJECT: random, random, random ! OBJECT: random, random, random ! OBJECT: random, random, random ! # ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome", random ! MONSTER: 'G', "gnome lord", random ! MONSTER: 'h', "dwarf", random ! MONSTER: 'h', "dwarf", random ! MONSTER: 'G', random, random ! MONSTER: 'G', random, random ! MONSTER: 'h', random, random ! # ! TRAP: random, random ! TRAP: random, random ! TRAP: random, random ! TRAP: random, random ! TRAP: random, random ! TRAP: random, random --- 907,1008 ---- MONSTER:'h',"dwarf",random MONSTER:'h',random,random ! # "Catacombs" by Kelly Bailey ! # Relies on some very specific behavior of MAZEWALK. # ! MAZE:"minend-3",'-' ! FLAGS:nommap ! GEOMETRY:center,bottom ! MAP ! - - - - - - - - - - -- -- - - . - - - - - - - - - -- - - -- - - - - . - - | ! ------...---------.-----------...-----.-------.------- ----------------| ! - - - - - - - - - - - . - - - . - - - - - - - - - - -- - -- - . - - - - - | ! ------------.---------...-------------------------.--- ------------------| ! - - - - - - - - - - . . - - --- - . - - - - - - - - -- -- - - - - |.....| | ! --.---------------.......------------------------------- ----------|.....S-| ! - - - - |.. ..| - ....... . - - - - |.........| - - - --- - - - - |.....| | ! ----.----|.....|------.......--------|.........|--------------.------------| ! - - - - |..{..| - - -.... . --- - -.S.........S - - - - - - - - - - - - - | ! ---------|.....|--.---...------------|.........|---------------------------| ! - - - - |.. ..| - - - . - - - - - - |.........| - --- . - - - - - - - - - | ! ----------------------...-------.---------------------...------------------| ! ---..| - - - - - - - - . --- - - - - - - - - - - - - - . - - --- - - --- - | ! -.S..|----.-------.------- ---------.-----------------...----- -----.------- ! ---..| - - - - - - - -- - - -- . - - - - - . - - - . - . - - -- -- - - - -- ! -.S..|--------.---.--- -...---------------...{.--------- --------- ! --|. - - - - - - - -- - - - -- . - - - --- - - - . . - - - - -- - - - - - - ! ENDMAP ! RANDOM_PLACES:(1,15),(68,6),(1,13) ! NON_DIGGABLE:(67,3,73,7) ! NON_DIGGABLE:(0,14,2,16) ! REGION:(0,0,75,16),unlit,"ordinary" ! REGION:(38,6,46,10),lit,"ordinary" ! DOOR:closed,(37,8) ! DOOR:closed,(47,8) ! DOOR:closed,(73,5) ! DOOR:closed,(2,15) ! MAZEWALK:(36,8),west ! STAIR:(42,8),up ! ! # Objects ! OBJECT:'*',"diamond",random ! OBJECT:'*',random,random ! OBJECT:'*',"diamond",random ! OBJECT:'*',random,random ! OBJECT:'*',"emerald",random ! OBJECT:'*',random,random ! OBJECT:'*',"emerald",random ! OBJECT:'*',random,random ! OBJECT:'*',"emerald",random ! OBJECT:'*',random,random ! OBJECT:'*',"ruby",random ! OBJECT:'*',random,random ! OBJECT:'*',"ruby",random ! OBJECT:'*',"amethyst",random ! OBJECT:'*',random,random ! OBJECT:'*',"amethyst",random ! OBJECT:'*',"luckstone",place[0] ! OBJECT:'*',"flint",place[1] ! OBJECT:'?',random,random ! OBJECT:'?',random,random ! OBJECT:'?',random,random ! OBJECT:'?',random,random ! OBJECT:'?',random,random ! OBJECT:'+',random,random ! OBJECT:'+',random,random ! OBJECT:'+',random,random ! OBJECT:'+',random,random ! OBJECT:random,random,random ! OBJECT:random,random,random ! OBJECT:random,random,random ! TRAP:random,random ! TRAP:random,random ! TRAP:random,random ! TRAP:random,random ! TRAP:random,random ! TRAP:random,random ! TRAP:random,random ! # One-time annoyance factor ! TRAP:"level teleport",place[0] ! TRAP:"level teleport",place[1] ! MONSTER:'M',random,random ! MONSTER:'M',random,random ! MONSTER:'M',random,random ! MONSTER:'M',random,random ! MONSTER:'M',random,random ! MONSTER:'M',"ettin mummy",random ! MONSTER:'V',random,random ! MONSTER:'Z',random,random ! MONSTER:'Z',random,random ! MONSTER:'Z',random,random ! MONSTER:'Z',random,random ! MONSTER:'Z',random,random ! MONSTER:'V',random,random ! MONSTER:'e',random,random ! MONSTER:'e',random,random ! MONSTER:'e',random,random ! MONSTER:'e',random,random ! ! ! # end mines.des *** nethack-3.3.1/dat/Monk.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Monk.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Monk.des 3.3 1999/12/05 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Monk.des 3.4 2001/09/01 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. *************** *** 105,113 **** MAZE: "Mon-loca",' ' GEOMETRY:center,center - MAP # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 ---------------------------------------------------- -------- ---.................................................- --.....| ---...--------........------........................--- ---...| --- 105,113 ---- MAZE: "Mon-loca",' ' GEOMETRY:center,center # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 + MAP ---------------------------------------------------- -------- ---.................................................- --.....| ---...--------........------........................--- ---...| *************** *** 121,131 **** |......----- ---.........- | -----...|............| |..........----- ----...........--- -------......||...........|| |..............-----................--- |............|||..........| ! |------...............................--- |...........|| |.........|| |.....|..............------.............-----..........|| ||........| |.....|.............-- ---.........................|| |.......|| |.....|.............- ---.....................--| ||......| ! |------------.......---- --.................---- |.....|| |...........|..........--------..............----- ||....| |...........|............................----- |....| ------------------------------------------ ------ --- 121,131 ---- |......----- ---.........- | -----...|............| |..........----- ----...........--- -------......||...........|| |..............-----................--- |............|||..........| ! |-S----...............................--- |...........|| |.........|| |.....|..............------.............-----..........|| ||........| |.....|.............-- ---.........................|| |.......|| |.....|.............- ---.....................--| ||......| ! |---S--------.......---- --.................---- |.....|| |...........|..........--------..............----- ||....| |...........|............................----- |....| ------------------------------------------ ------ *** nethack-3.3.1/dat/opthelp Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/opthelp Thu Mar 21 07:37:36 2002 *************** *** 2,7 **** --- 2,8 ---- (You can learn which options exist in your version by checking your current option setting, which is reached via the 'O' cmd.) + autodig dig if moving and wielding digging tool [FALSE] autopickup automatically pick up objects you move over [TRUE] autoquiver when firing with an empty quiver, select some suitable inventory weapon to fill the quiver [FALSE] *************** *** 33,38 **** --- 34,41 ---- sound enable messages about what your character hears [TRUE] (note: this has nothing to do with your computer's audio capabilities, and the game resets it periodically) + sparkle display sparkly effect for resisted magical [TRUE] + attacks (e.g. fire attack on fire-resistant monster) standout use standout mode for --More-- on messages [FALSE] time display elapsed game time, in moves [FALSE] tombstone print tombstone when you die [TRUE] *************** *** 69,74 **** --- 72,80 ---- display effect. on MSDOS without the termcap lib, whether or not to pause for visual effect. [TRUE] + Boolean option if TTY_GRAPHICS was set at compile time: + msg_window show previous messages in a screen-size window [FALSE] + Boolean option if USE_TILES was set at compile time (MSDOS protected mode only): preload_tiles control whether tiles get pre-loaded into RAM at the start of the game. Doing so enhances performance *************** *** 81,86 **** --- 87,93 ---- Compound options which can be set during the game are: + boulder override the default boulder symbol with another default:` disclose the types of information you want offered at the end of the game [all] fruit the name of a fruit you enjoy eating [slime mold] *************** *** 177,183 **** objects like dungeon, but for object symbols default: ])[="(%!?+/$*`0_. pettype your preferred type of pet (cat or dog), if your character ! class uses both types [RANDOM] race Your starting race (e.g., race:Human, race:Elf). [RANDOM] role Your starting role (e.g., role:Barbarian, role:Valk). Although you can specify just the first letter(s), it will --- 184,190 ---- objects like dungeon, but for object symbols default: ])[="(%!?+/$*`0_. pettype your preferred type of pet (cat or dog), if your character ! class uses both types; or none for no pet [RANDOM] race Your starting race (e.g., race:Human, race:Elf). [RANDOM] role Your starting role (e.g., role:Barbarian, role:Valk). Although you can specify just the first letter(s), it will *** nethack-3.3.1/dat/oracle.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/oracle.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)oracle.des 3.3 95/10/07 # NetHack may be freely redistributed. See license for details. # # Oracle level --- 1,4 ---- ! # SCCS Id: @(#)oracle.des 3.4 1995/10/07 # NetHack may be freely redistributed. See license for details. # # Oracle level *** nethack-3.3.1/dat/Priest.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Priest.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Priest.des 3.3 92/09/22 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Priest.des 3.4 1992/09/22 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/quest.txt Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/quest.txt Thu Mar 21 07:37:36 2002 *************** *** 1,8 **** ! # SCCS Id: @(#)quest.txt 3.3 2000/01/31 # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # ! # The quest text file for NetHack 3.3 # # These are the "standard" message numbers from qtext.h. All class # dialogue must have at least these entries. --- 1,8 ---- ! # SCCS Id: @(#)quest.txt 3.4 2002/01/30 # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # ! # The quest text file for NetHack 3.4 # # These are the "standard" message numbers from qtext.h. All class # dialogue must have at least these entries. *************** *** 11,30 **** # QT_NEXTTIME 2 # QT_OTHERTIME 3 # ! # QT_GUARDTALK 5 /* 5 random things for guards to say */ # ! # QT_FIRSTLEADER 10 ! # QT_NEXTLEADER 11 ! # QT_OTHERLEADER 12 ! # QT_LASTLEADER 13 ! # QT_BADLEVEL 14 ! # QT_BADALIGN 15 ! # QT_ASSIGNQUEST 16 # ! # QT_ENCOURAGE 20 /* 1-10 random encouragement messages */ # ! # QT_FIRSTLOCATE 30 ! # QT_NEXTLOCATE 31 # # QT_FIRSTACQUIRE 40 # QT_NEXTACQUIRE 41 --- 11,31 ---- # QT_NEXTTIME 2 # QT_OTHERTIME 3 # ! # QT_GUARDTALK 5 /* 5 random things guards say before quest */ ! # QT_GUARDTALK2 10 /* 5 random things guards say after quest */ # ! # QT_FIRSTLEADER 15 ! # QT_NEXTLEADER 16 ! # QT_OTHERLEADER 17 ! # QT_LASTLEADER 18 ! # QT_BADLEVEL 19 ! # QT_BADALIGN 20 ! # QT_ASSIGNQUEST 21 # ! # QT_ENCOURAGE 25 /* 1-10 random encouragement messages */ # ! # QT_FIRSTLOCATE 35 ! # QT_NEXTLOCATE 36 # # QT_FIRSTACQUIRE 40 # QT_NEXTACQUIRE 41 *************** *** 81,119 **** %Cp Arc 00009 "So you're %ls prize pupil! I don't know what he sees in you." %E ! %Cc Arc 00010 "Finally you have returned, %p. You were always my most promising student. Allow me to see if you are ready for the most difficult task of your career." %E ! %Cp Arc 00011 "Again, %p, you stand before me. Let me see if you have gained experience in the interim." %E ! %Cp Arc 00012 "Once more, %p, you have returned from the field. Are you finally ready for the task that must be accomplished?" %E ! %Cc Arc 00013 "%p, you have failed us. All of my careful training has been in vain. Begone! Your tenure at this college has been revoked! "You are a disgrace to the profession!" %E ! %Cc Arc 00014 "%p, you are yet too inexperienced to undertake such a demanding quest. A mere %r could not possibly face the rigors demanded and survive. Go forth, and come here again when your adventures have further taught you." %E ! %Cc Arc 00015 "%pC! I've heard that you've been using sloppy techniques. Your results lately can hardly be called suitable for %ra! "How could you have strayed from the %a path? Go from here, and come back only when you have purified yourself." %E ! %Cc Arc 00016 "Grave times have befallen the college, for %na has stolen %o. Without it, the board of directors of the university will soon have no choice but to revoke our research grants. --- 82,135 ---- %Cp Arc 00009 "So you're %ls prize pupil! I don't know what he sees in you." %E ! %Cp Arc 00010 ! "Did you see Lash LaRue in 'Song of Old Wyoming' the other night?" ! %E ! %Cp Arc 00011 ! "Hey man, got any potions of hallucination for sale?" ! %E ! %Cp Arc 00012 ! "I guess you are guaranteed to make full professor now." ! %E ! %Cp Arc 00013 ! "So, what was worse, %n or your entrance exams?" ! %E ! %Cp Arc 00014 ! "%oC is impressive, but nothing like the bones I dug up!" ! %E ! %Cc Arc 00015 "Finally you have returned, %p. You were always my most promising student. Allow me to see if you are ready for the most difficult task of your career." %E ! %Cp Arc 00016 "Again, %p, you stand before me. Let me see if you have gained experience in the interim." %E ! %Cp Arc 00017 "Once more, %p, you have returned from the field. Are you finally ready for the task that must be accomplished?" %E ! %Cc Arc 00018 "%p, you have failed us. All of my careful training has been in vain. Begone! Your tenure at this college has been revoked! "You are a disgrace to the profession!" %E ! %Cc Arc 00019 "%p, you are yet too inexperienced to undertake such a demanding quest. A mere %r could not possibly face the rigors demanded and survive. Go forth, and come here again when your adventures have further taught you." %E ! %Cc Arc 00020 "%pC! I've heard that you've been using sloppy techniques. Your results lately can hardly be called suitable for %ra! "How could you have strayed from the %a path? Go from here, and come back only when you have purified yourself." %E ! %Cc Arc 00021 "Grave times have befallen the college, for %na has stolen %o. Without it, the board of directors of the university will soon have no choice but to revoke our research grants. *************** *** 121,127 **** "You must locate the entrance to %i. Within it, you will find %n. ! "You must the defeat %n and return %o to me. "Only in this way will we be able to prevent the budget cuts that could --- 137,143 ---- "You must locate the entrance to %i. Within it, you will find %n. ! "You must then defeat %n and return %o to me. "Only in this way will we be able to prevent the budget cuts that could *************** *** 129,173 **** "May the wisdom of %d be your guide." %E ! %Cp Arc 00020 "Beware, for %n is powerful and cunning." %E ! %Cp Arc 00021 "To locate the entrance to %i, you must pass many traps." %E ! %Cp Arc 00022 "A %nt may be vulnerable to attacks by magical cold." %E ! %Cp Arc 00023 "Call upon %d when you encounter %n." %E ! %Cp Arc 00024 "You must destroy %n. It will pursue you otherwise." %E ! %Cp Arc 00025 "%oC is a mighty talisman. With it you can destroy %n." %E ! %Cp Arc 00026 "Go forth with the blessings of %d." %E ! %Cp Arc 00027 "I will have my %gP watch for your return." %E ! %Cp Arc 00028 "Remember not to stray from the true %a path." %E ! %Cp Arc 00029 "You may be able to sense %o when you are near." %E ! %Cc Arc 00030 A plain opens before you. Beyond the plain lies a foreboding edifice. You have the feeling that you will soon find the entrance to %i. %E ! %Cp Arc 00031 Once again, you are near the entrance to %i. %E %Cc Arc 00040 --- 145,189 ---- "May the wisdom of %d be your guide." %E ! %Cp Arc 00025 "Beware, for %n is powerful and cunning." %E ! %Cp Arc 00026 "To locate the entrance to %i, you must pass many traps." %E ! %Cp Arc 00027 "A %nt may be vulnerable to attacks by magical cold." %E ! %Cp Arc 00028 "Call upon %d when you encounter %n." %E ! %Cp Arc 00029 "You must destroy %n. It will pursue you otherwise." %E ! %Cp Arc 00030 "%oC is a mighty talisman. With it you can destroy %n." %E ! %Cp Arc 00031 "Go forth with the blessings of %d." %E ! %Cp Arc 00032 "I will have my %gP watch for your return." %E ! %Cp Arc 00033 "Remember not to stray from the true %a path." %E ! %Cp Arc 00034 "You may be able to sense %o when you are near." %E ! %Cc Arc 00035 A plain opens before you. Beyond the plain lies a foreboding edifice. You have the feeling that you will soon find the entrance to %i. %E ! %Cp Arc 00036 Once again, you are near the entrance to %i. %E %Cc Arc 00040 *************** *** 278,284 **** # %Cc Bar 00001 Warily you scan your surroundings, all of your senses alert for signs ! of possible danger. Off in the distance, you can see the familiar shapes of %H. But why, you think, should %l be there? --- 294,300 ---- # %Cc Bar 00001 Warily you scan your surroundings, all of your senses alert for signs ! of possible danger. Off in the distance, you can %x the familiar shapes of %H. But why, you think, should %l be there? *************** *** 313,331 **** %Cp Bar 00009 "%lC is a strange one, but he has helped defend us." %E ! %Cc Bar 00010 "Ah, %p. You have returned at last. The world is in dire need of your help. There is a great quest you must undertake. "But first, I must see if you are ready to take on such a challenge." %E ! %Cp Bar 00011 "%p, you are back. Are you ready now for the challenge?" %E ! %Cp Bar 00012 "Again, you stand before me, %p. Surely you have prepared yourself." %E ! %Cc Bar 00013 "Pah! You have betrayed the gods, %p. You will never attain the glory which you aspire to. Your failure to follow the true path has closed this future to you. --- 329,362 ---- %Cp Bar 00009 "%lC is a strange one, but he has helped defend us." %E ! %Cp Bar 00010 ! "The battles here have been good -- our enemies' blood soaks the soil!" ! %E ! %Cp Bar 00011 ! "Remember that glory is crushing your enemies beneath your feet!" ! %E ! %Cp Bar 00012 ! "Times will be good again, now that the horde is vanquished." ! %E ! %Cp Bar 00013 ! "You have brought our clan much honor in defeating %n." ! %E ! %Cp Bar 00014 ! "You will be a worthy successor to %l." ! %E ! %Cc Bar 00015 "Ah, %p. You have returned at last. The world is in dire need of your help. There is a great quest you must undertake. "But first, I must see if you are ready to take on such a challenge." %E ! %Cp Bar 00016 "%p, you are back. Are you ready now for the challenge?" %E ! %Cp Bar 00017 "Again, you stand before me, %p. Surely you have prepared yourself." %E ! %Cc Bar 00018 "Pah! You have betrayed the gods, %p. You will never attain the glory which you aspire to. Your failure to follow the true path has closed this future to you. *************** *** 333,350 **** "I will protect these people as best I can, but soon %n will overcome me and destroy all who once called you %s. Now begone!" %E ! %Cc Bar 00014 "%p, I fear that you are as yet too inexperienced to face %n. Only %Ra with the help of %d could ever hope to defeat him." %E ! %Cc Bar 00015 "%pC! You have wandered from the path of the %a! If you attempt to overcome %n in this state, he will surely enslave your soul. Your only hope, and ours, lies in your purification. Go forth, and return when you feel ready." %E ! %Cc Bar 00016 "The world is in great need of your assistance, %p. "About six months ago, I learned that a mysterious sorcerer, known --- 364,381 ---- "I will protect these people as best I can, but soon %n will overcome me and destroy all who once called you %s. Now begone!" %E ! %Cc Bar 00019 "%p, I fear that you are as yet too inexperienced to face %n. Only %Ra with the help of %d could ever hope to defeat him." %E ! %Cc Bar 00020 "%pC! You have wandered from the path of the %a! If you attempt to overcome %n in this state, he will surely enslave your soul. Your only hope, and ours, lies in your purification. Go forth, and return when you feel ready." %E ! %Cc Bar 00021 "The world is in great need of your assistance, %p. "About six months ago, I learned that a mysterious sorcerer, known *************** *** 369,412 **** %n, defeat him, and return %o to us. Only then will the world be safe." %E ! %Cp Bar 00020 "%nC is strong in the dark arts, but not immune to cold steel." %E ! %Cp Bar 00021 "Remember that %n is a great sorcerer. He lived in the time of Atlantis." %E ! %Cp Bar 00022 "If you fail, %p, I will not be able to protect these people long." %E ! %Cp Bar 00023 "To enter %i, you must be very stealthy. The horde will be on guard." %E ! %Cp Bar 00024 "Call upon %d in your time of need." %E ! %Cp Bar 00025 "May %d protect you, and guide your steps." %E ! %Cp Bar 00026 "If you can lay hands upon %o, carry it for good fortune." %E ! %Cp Bar 00027 "I cannot stand against %ns sorcery. But %d will help you." %E ! %Cp Bar 00028 "Do not fear %n. I know you can defeat him." %E ! %Cp Bar 00029 "You have a great road to travel, %p, but only after you defeat %n." %E ! %Cc Bar 00030 The scent of water comes to you in the desert breeze. You know that you have located %i. %E ! %Cp Bar 00031 Yet again you have a chance to infiltrate %i. %E %Cc Bar 00040 --- 400,443 ---- %n, defeat him, and return %o to us. Only then will the world be safe." %E ! %Cp Bar 00025 "%nC is strong in the dark arts, but not immune to cold steel." %E ! %Cp Bar 00026 "Remember that %n is a great sorcerer. He lived in the time of Atlantis." %E ! %Cp Bar 00027 "If you fail, %p, I will not be able to protect these people long." %E ! %Cp Bar 00028 "To enter %i, you must be very stealthy. The horde will be on guard." %E ! %Cp Bar 00029 "Call upon %d in your time of need." %E ! %Cp Bar 00030 "May %d protect you, and guide your steps." %E ! %Cp Bar 00031 "If you can lay hands upon %o, carry it for good fortune." %E ! %Cp Bar 00032 "I cannot stand against %ns sorcery. But %d will help you." %E ! %Cp Bar 00033 "Do not fear %n. I know you can defeat him." %E ! %Cp Bar 00034 "You have a great road to travel, %p, but only after you defeat %n." %E ! %Cc Bar 00035 The scent of water comes to you in the desert breeze. You know that you have located %i. %E ! %Cp Bar 00036 Yet again you have a chance to infiltrate %i. %E %Cc Bar 00040 *************** *** 558,564 **** %Cp Cav 00009 "%lC grows old. We know not who will guide us after he ascends." %E ! %Cc Cav 00010 "You have returned from your vision quest, %p. Thank %d. "We are in dire need of your help, my %S. --- 589,610 ---- %Cp Cav 00009 "%lC grows old. We know not who will guide us after he ascends." %E ! %Cp Cav 00010 ! "The rains have returned and the land grows lush again." ! %E ! %Cp Cav 00011 ! "Peace has returned, give thanks to %d!" ! %E ! %Cp Cav 00012 ! "Welcome back! Did you find %o?" ! %E ! %Cp Cav 00013 ! "So, %p, tell us the story of your fight with %n." ! %E ! %Cp Cav 00014 ! "%lC grows old. Perhaps you will guide us after he ascends." ! %E ! %Cc Cav 00015 "You have returned from your vision quest, %p. Thank %d. "We are in dire need of your help, my %S. *************** *** 566,578 **** "But first, I must see if you are yet capable of the quest I would ask you to undertake." %E ! %Cp Cav 00011 "Again, you return to us, %p. Let me see if you are ready now." %E ! %Cp Cav 00012 "Ah, %p. Are you finally ready?" %E ! %Cc Cav 00013 "%pC! You have sealed our fate. You seem unable to reform yourself, so I must select another to take your place. --- 612,624 ---- "But first, I must see if you are yet capable of the quest I would ask you to undertake." %E ! %Cp Cav 00016 "Again, you return to us, %p. Let me see if you are ready now." %E ! %Cp Cav 00017 "Ah, %p. Are you finally ready?" %E ! %Cc Cav 00018 "%pC! You have sealed our fate. You seem unable to reform yourself, so I must select another to take your place. *************** *** 581,587 **** "You no longer live in our eyes." %E ! %Cc Cav 00014 "Alas, %p, you are as yet too inexperienced to embark upon such a difficult quest as that I propose to give you. --- 627,633 ---- "You no longer live in our eyes." %E ! %Cc Cav 00019 "Alas, %p, you are as yet too inexperienced to embark upon such a difficult quest as that I propose to give you. *************** *** 591,603 **** "Adventure some more, and you will learn the skills you will require. %d decrees it." %E ! %Cc Cav 00015 "%pC! You have deviated from my teachings. You no longer follow the path of the %a as you should. I banish you from these caves, to go forth and purify yourself. Then, you might be able to accomplish this quest." %E ! %Cc Cav 00016 "You are indeed ready now, %p. I shall tell you a tale of great suffering among your people: --- 637,649 ---- "Adventure some more, and you will learn the skills you will require. %d decrees it." %E ! %Cc Cav 00020 "%pC! You have deviated from my teachings. You no longer follow the path of the %a as you should. I banish you from these caves, to go forth and purify yourself. Then, you might be able to accomplish this quest." %E ! %Cc Cav 00021 "You are indeed ready now, %p. I shall tell you a tale of great suffering among your people: *************** *** 617,657 **** "Please, %p, recover %o for us, and return it here." %E ! %Cp Cav 00020 "%nC is immune to her own breath weapons. You should use magic upon her that she does not use herself." %E ! %Cp Cav 00021 "When you encounter %n, call upon %d for assistance." %E ! %Cp Cav 00022 "There will be nowhere to hide inside %ns inner sanctum." %E ! %Cp Cav 00023 "Your best chance with %n will be to keep moving." %E ! %Cp Cav 00024 "Do not be distracted by the great treasures in %ns lair. Concentrate on %o." %E ! %Cp Cav 00025 "%oC is the only object that %n truly fears." %E ! %Cp Cav 00026 "Do not be fooled by %ns size. She is fast, and it is rumored that she uses magic." %E ! %Cp Cav 00027 "I would send a party of %gP with you, but we will need all of our strength to defend ourselves." %E ! %Cp Cav 00028 "Remember, be %a at all times. This is your strength." %E ! %Cp Cav 00029 "If only we had an amulet of reflection, this would not have happened." %E ! %Cc Cav 00030 You %x many large claw marks on the ground. The tunnels ahead of you are larger than most of those in any cave complex you have ever been in before. --- 663,703 ---- "Please, %p, recover %o for us, and return it here." %E ! %Cp Cav 00025 "%nC is immune to her own breath weapons. You should use magic upon her that she does not use herself." %E ! %Cp Cav 00026 "When you encounter %n, call upon %d for assistance." %E ! %Cp Cav 00027 "There will be nowhere to hide inside %ns inner sanctum." %E ! %Cp Cav 00028 "Your best chance with %n will be to keep moving." %E ! %Cp Cav 00029 "Do not be distracted by the great treasures in %ns lair. Concentrate on %o." %E ! %Cp Cav 00030 "%oC is the only object that %n truly fears." %E ! %Cp Cav 00031 "Do not be fooled by %ns size. She is fast, and it is rumored that she uses magic." %E ! %Cp Cav 00032 "I would send a party of %gP with you, but we will need all of our strength to defend ourselves." %E ! %Cp Cav 00033 "Remember, be %a at all times. This is your strength." %E ! %Cp Cav 00034 "If only we had an amulet of reflection, this would not have happened." %E ! %Cc Cav 00035 You %x many large claw marks on the ground. The tunnels ahead of you are larger than most of those in any cave complex you have ever been in before. *************** *** 659,665 **** Your nose detects the smell of carrion from within, and bones litter the sides of the tunnels. %E ! %Cp Cav 00031 Once again, you approach %i. %E %Cc Cav 00040 --- 705,711 ---- Your nose detects the smell of carrion from within, and bones litter the sides of the tunnels. %E ! %Cp Cav 00036 Once again, you approach %i. %E %Cc Cav 00040 *************** *** 805,811 **** "We think %n has used his alchemists, and %o, to unleash a new disease we call 'the cold' on Gehennom." %E ! %Cc Hea 00010 "Feebly, %l raises his head to look at you. "It is good to see you again, %p. I see the concern in your --- 851,873 ---- "We think %n has used his alchemists, and %o, to unleash a new disease we call 'the cold' on Gehennom." %E ! %Cp Hea 00010 ! "Did you read that new treatise on the therapeutic use of leeches?" ! %E ! %Cp Hea 00011 ! "Paint a red caduceus on your shield and monsters won't hit you." ! %E ! %Cp Hea 00012 ! "How are you feeling? Perhaps a good bleeding will improve your sprits." ! %E ! %Cp Hea 00013 ! "Have you heard the absurd new theory that diseases are caused by ! microscopic organisms, and not ill humors?" ! %E ! %Cp Hea 00014 ! "I see that you bring %o, now you can cure this plague!" ! %E ! %Cc Hea 00015 "Feebly, %l raises his head to look at you. "It is good to see you again, %p. I see the concern in your *************** *** 816,839 **** "Come closer and let me lay hands on you, and determine if you have the skills necessary to accomplish this mission." %E ! %Cp Hea 00011 "Again you return to me, %p. I sense that each trip back the pleurisy and maladies of our land begin to infect you. Let us hope and pray to %d that you become ready for your task before you fall victim to the bad humors." %E ! %Cp Hea 00012 "Chiron has fallen, Hermes has fallen, what else must I tell you to impress upon you the importance of your mission! I hope that you have come prepared this time." %E ! %Cc Hea 00013 "You have failed us, %p. You are a quack! A charlatan! "Hades will be happy to hear that you are once again practicing your arts on the unsuspecting." %E ! %Cc Hea 00014 "Alas, %p, you are yet too inexperienced to deal with the rigors of such a task. You must be able to draw on the knowledge of botany, vetenary, and alchemy before I can send you on this quest with good --- 878,901 ---- "Come closer and let me lay hands on you, and determine if you have the skills necessary to accomplish this mission." %E ! %Cp Hea 00016 "Again you return to me, %p. I sense that each trip back the pleurisy and maladies of our land begin to infect you. Let us hope and pray to %d that you become ready for your task before you fall victim to the bad humors." %E ! %Cp Hea 00017 "Chiron has fallen, Hermes has fallen, what else must I tell you to impress upon you the importance of your mission! I hope that you have come prepared this time." %E ! %Cc Hea 00018 "You have failed us, %p. You are a quack! A charlatan! "Hades will be happy to hear that you are once again practicing your arts on the unsuspecting." %E ! %Cc Hea 00019 "Alas, %p, you are yet too inexperienced to deal with the rigors of such a task. You must be able to draw on the knowledge of botany, vetenary, and alchemy before I can send you on this quest with good *************** *** 841,854 **** "Return when you wear %Ra's caduceus." %E ! %Cc Hea 00015 "You have learned much of the remedies that benefit, but you must also know which physic for which ail. That is why %ds teachings are a part of your training. "Return to us when you have healed thyself." %E ! %Cc Hea 00016 For the first time, you sense a smile on %ls face. You have indeed learned as much as we can teach you in preparation --- 903,916 ---- "Return when you wear %Ra's caduceus." %E ! %Cc Hea 00020 "You have learned much of the remedies that benefit, but you must also know which physic for which ail. That is why %ds teachings are a part of your training. "Return to us when you have healed thyself." %E ! %Cc Hea 00021 For the first time, you sense a smile on %ls face. You have indeed learned as much as we can teach you in preparation *************** *** 867,912 **** You must travel into the swamps to %i, and from there follow the trail to %ns island lair. Be careful. %E ! %Cp Hea 00020 "Remember, %p, to always wash your hands before operating." %E ! %Cp Hea 00021 "%nC has no real magic of his own. To this he is vulnerable." %E ! %Cp Hea 00022 "If you have been true to %d, you can draw on the power of %o." %E ! %Cp Hea 00023 "Bring with you antidotes for poisons." %E ! %Cp Hea 00024 "Remember this, %n can twist the powers of %o to hurt instead of heal." %E ! %Cp Hea 00025 "I have sent for Chiron, but I am afraid he will come too late." %E ! %Cp Hea 00026 "Maybe when you return the snakes will once again begin to shed." %E ! %Cp Hea 00027 "The plague grows worse as we speak. Hurry, %p!" %E ! %Cp Hea 00028 "Many times %n has caused trouble in these lands. It is time that he was eradicated like the diseases he has caused." %E ! %Cp Hea 00029 "With but one eye, %n should be easy to blind. Remember this." %E ! %Cc Hea 00030 You stand before the entrance to %i. Strange scratching noises come from within the building. The swampy ground around you seems to stink with disease. %E ! %Cp Hea 00031 Once again you stand at the entrance to %i. %E %Cc Hea 00040 --- 929,974 ---- You must travel into the swamps to %i, and from there follow the trail to %ns island lair. Be careful. %E ! %Cp Hea 00025 "Remember, %p, to always wash your hands before operating." %E ! %Cp Hea 00026 "%nC has no real magic of his own. To this he is vulnerable." %E ! %Cp Hea 00027 "If you have been true to %d, you can draw on the power of %o." %E ! %Cp Hea 00028 "Bring with you antidotes for poisons." %E ! %Cp Hea 00029 "Remember this, %n can twist the powers of %o to hurt instead of heal." %E ! %Cp Hea 00030 "I have sent for Chiron, but I am afraid he will come too late." %E ! %Cp Hea 00031 "Maybe when you return the snakes will once again begin to shed." %E ! %Cp Hea 00032 "The plague grows worse as we speak. Hurry, %p!" %E ! %Cp Hea 00033 "Many times %n has caused trouble in these lands. It is time that he was eradicated like the diseases he has caused." %E ! %Cp Hea 00034 "With but one eye, %n should be easy to blind. Remember this." %E ! %Cc Hea 00035 You stand before the entrance to %i. Strange scratching noises come from within the building. The swampy ground around you seems to stink with disease. %E ! %Cp Hea 00036 Once again you stand at the entrance to %i. %E %Cc Hea 00040 *************** *** 1049,1072 **** %Cp Kni 00009 "Many brave %cP died when %n attacked." %E ! %Cc Kni 00010 "Ah, %p. We see thou hast received our summons. We are in dire need of thy prowess. But first, We must needs decide if thou art ready for this great undertaking." %E ! %Cp Kni 00011 "Welcome again, %p. We hope thou art ready now." %E ! %Cp Kni 00012 "Once again, thou standest before us, %p. Art thou ready now?" %E ! %Cc Kni 00013 "Thou disgracest this noble court with thine impure presence. We have been lenient with thee, but no more. Thy name shall be spoken no more. We hereby strip thee of thy title, thy lands, and thy standing as %ca. Begone from our sight!" %E ! %Cc Kni 00014 "Verily, %p, thou hast done well. That thou hast survived thus far is a credit to thy valor, but thou art yet unprepared for the demands required as Our Champion. %rA, no matter how --- 1111,1150 ---- %Cp Kni 00009 "Many brave %cP died when %n attacked." %E ! %Cp Kni 00010 ! "Hail, %p! Verily, thou lookest well." ! %E ! %Cp Kni 00011 ! "So, %p, didst thou find %n in the fens ! near %i?" ! %E ! %Cp Kni 00012 ! "Worthy %p, hast thou proven thy right purpose on the body of %n?" ! %E ! %Cp Kni 00013 ! "Verily, %l could have no better champion, %p." ! %E ! %Cp Kni 00014 ! "Hast thou indeed recovered %o?" ! %E ! %Cc Kni 00015 "Ah, %p. We see thou hast received our summons. We are in dire need of thy prowess. But first, We must needs decide if thou art ready for this great undertaking." %E ! %Cp Kni 00016 "Welcome again, %p. We hope thou art ready now." %E ! %Cp Kni 00017 "Once again, thou standest before us, %p. Art thou ready now?" %E ! %Cc Kni 00018 "Thou disgracest this noble court with thine impure presence. We have been lenient with thee, but no more. Thy name shall be spoken no more. We hereby strip thee of thy title, thy lands, and thy standing as %ca. Begone from our sight!" %E ! %Cc Kni 00019 "Verily, %p, thou hast done well. That thou hast survived thus far is a credit to thy valor, but thou art yet unprepared for the demands required as Our Champion. %rA, no matter how *************** *** 1075,1086 **** "Journey forth from this place, and hone thy skills. Return to Our presence when thou hast attained the noble title of %R." %E ! %Cc Kni 00015 "Thou dishonourest us, %p! Thou hast strayed from the path of chivalry! Go from our presence and do penance. Only when thou art again pure mayst thou return hence." %E ! %Cc Kni 00016 "Ah, %p. Thou art truly ready, as no %c before thee hath been. Hear now Our words: --- 1153,1164 ---- "Journey forth from this place, and hone thy skills. Return to Our presence when thou hast attained the noble title of %R." %E ! %Cc Kni 00020 "Thou dishonourest us, %p! Thou hast strayed from the path of chivalry! Go from our presence and do penance. Only when thou art again pure mayst thou return hence." %E ! %Cc Kni 00021 "Ah, %p. Thou art truly ready, as no %c before thee hath been. Hear now Our words: *************** *** 1102,1145 **** beast, and return to Us %o. Only then can We restore Merlin to health." %E ! %Cp Kni 00020 "Remember, %p, follow always the path of %d." %E ! %Cp Kni 00021 "Though %n is verily a mighty foe, we have confidence in thy victory." %E ! %Cp Kni 00022 "Beware, for %n hath surrounded himself with hordes of foul creatures." %E ! %Cp Kni 00023 "Great treasure, 'tis said, is hoarded in the lair of %n." %E ! %Cp Kni 00024 "If thou possessest %o, %p, %ns magic shall therewith be thwarted." %E ! %Cp Kni 00025 "The gates of %i are guarded by forces unseen, %p. Go carefully." %E ! %Cp Kni 00026 "Return %o to us quickly, %p." %E ! %Cp Kni 00027 "Destroy %n, %p, else %H shall surely fall." %E ! %Cp Kni 00028 "Call upon %d when thou art in need." %E ! %Cp Kni 00029 "To find %i, thou must keep thy heart pure." %E ! %Cc Kni 00030 You stand at the foot of %i. Atop, you can %x a shrine. Strange energies seem to be focused here, and the hair on the back of your neck stands on end. %E ! %Cp Kni 00031 Again, you stand at the foot of %i. %E %Cc Kni 00040 --- 1180,1223 ---- beast, and return to Us %o. Only then can We restore Merlin to health." %E ! %Cp Kni 00025 "Remember, %p, follow always the path of %d." %E ! %Cp Kni 00026 "Though %n is verily a mighty foe, we have confidence in thy victory." %E ! %Cp Kni 00027 "Beware, for %n hath surrounded himself with hordes of foul creatures." %E ! %Cp Kni 00028 "Great treasure, 'tis said, is hoarded in the lair of %n." %E ! %Cp Kni 00029 "If thou possessest %o, %p, %ns magic shall therewith be thwarted." %E ! %Cp Kni 00030 "The gates of %i are guarded by forces unseen, %p. Go carefully." %E ! %Cp Kni 00031 "Return %o to us quickly, %p." %E ! %Cp Kni 00032 "Destroy %n, %p, else %H shall surely fall." %E ! %Cp Kni 00033 "Call upon %d when thou art in need." %E ! %Cp Kni 00034 "To find %i, thou must keep thy heart pure." %E ! %Cc Kni 00035 You stand at the foot of %i. Atop, you can %x a shrine. Strange energies seem to be focused here, and the hair on the back of your neck stands on end. %E ! %Cp Kni 00036 Again, you stand at the foot of %i. %E %Cc Kni 00040 *************** *** 1280,1309 **** %Cp Mon 00009 "May %d be with you, %s." %E ! %Cc Mon 00010 "Ah, %p, my %S. You have returned to us at last. A great blow has befallen our order; perhaps you can help us. First, however, I must determine if you are prepared for this great challenge." %E ! %Cp Mon 00011 "Again, my %S, you stand before me. Are you ready now to help us?" %E ! %Cp Mon 00012 "Once more, %p, you stand within the sanctum. Are you ready now?" %E ! %Cc Mon 00013 "You are a heretic, %p! How can you, %ra, deviate so from the teachings of %d? Begone from this temple. You are no longer %sa to this order. We will pray to %d for other assistance, as you have failed us utterly." %E ! %Cc Mon 00014 "Alas, %p, it is not yet to be. A mere %r could never withstand the might of %n. Go forth, again into the world, and return when you have attained the post of %R." %E ! %Cc Mon 00015 "This is terrible, %p. You have deviated from the true path! You know that %d requires the most strident devotion of this order. The %shood must stand for utmost piety. --- 1358,1402 ---- %Cp Mon 00009 "May %d be with you, %s." %E ! %Cp Mon 00010 ! "Greetings, honorable %r. It is good to see you again." ! %E ! %Cp Mon 00011 ! "Ah, %p! Our deepest gratitude for all of your help." ! %E ! %Cp Mon 00012 ! "Greetings, %s. Perhaps you will take some time to meditate with us?" ! %E ! %Cp Mon 00013 ! "With this test behind you, may %d bring you enlightenment." ! %E ! %Cp Mon 00014 ! "May %d be with you, %s." ! %E ! %Cc Mon 00015 "Ah, %p, my %S. You have returned to us at last. A great blow has befallen our order; perhaps you can help us. First, however, I must determine if you are prepared for this great challenge." %E ! %Cp Mon 00016 "Again, my %S, you stand before me. Are you ready now to help us?" %E ! %Cp Mon 00017 "Once more, %p, you stand within the sanctum. Are you ready now?" %E ! %Cc Mon 00018 "You are a heretic, %p! How can you, %ra, deviate so from the teachings of %d? Begone from this temple. You are no longer %sa to this order. We will pray to %d for other assistance, as you have failed us utterly." %E ! %Cc Mon 00019 "Alas, %p, it is not yet to be. A mere %r could never withstand the might of %n. Go forth, again into the world, and return when you have attained the post of %R." %E ! %Cc Mon 00020 "This is terrible, %p. You have deviated from the true path! You know that %d requires the most strident devotion of this order. The %shood must stand for utmost piety. *************** *** 1311,1317 **** "Go from here, atone for your sins against %d. Return only when you have purified yourself." %E ! %Cc Mon 00016 "Yes, %p. You are truly ready now. Attend to me and I shall tell you of what has transpired: --- 1404,1410 ---- "Go from here, atone for your sins against %d. Return only when you have purified yourself." %E ! %Cc Mon 00021 "Yes, %p. You are truly ready now. Attend to me and I shall tell you of what has transpired: *************** *** 1329,1370 **** "Go with %d as your guide, %p." %E ! %Cp Mon 00020 "You can prevail, if you rely on %d." %E ! %Cp Mon 00021 "Remember that %n has great magic at his command." %E ! %Cp Mon 00022 "Be pure, my %S." %E ! %Cp Mon 00023 "Beware, %i is surrounded by hordes of earth elementals." %E ! %Cp Mon 00024 "Remember your studies, and you will prevail!" %E ! %Cp Mon 00025 "Acquire and wear %o if you can. They will aid you against %n." %E ! %Cp Mon 00026 "Call upon %d when your need is greatest. You will be answered." %E ! %Cp Mon 00027 "Remember that use the elementals' strength against them!" %E ! %Cp Mon 00028 "Do not lose faith, %p. If you do so, %n will grow stronger." %E ! %Cp Mon 00029 "Wear %o. They will assist you in your efforts." %E ! %Cc Mon 00030 You remember the descriptions of %i, given to you by the %l. It is ahead that you will find %n's trail. %E ! %Cp Mon 00031 Again, you stand before %i. %E %Cc Mon 00040 --- 1422,1463 ---- "Go with %d as your guide, %p." %E ! %Cp Mon 00025 "You can prevail, if you rely on %d." %E ! %Cp Mon 00026 "Remember that %n has great magic at his command." %E ! %Cp Mon 00027 "Be pure, my %S." %E ! %Cp Mon 00028 "Beware, %i is surrounded by hordes of earth elementals." %E ! %Cp Mon 00029 "Remember your studies, and you will prevail!" %E ! %Cp Mon 00030 "Acquire and wear %o if you can. They will aid you against %n." %E ! %Cp Mon 00031 "Call upon %d when your need is greatest. You will be answered." %E ! %Cp Mon 00032 "Remember that use the elementals' strength against them!" %E ! %Cp Mon 00033 "Do not lose faith, %p. If you do so, %n will grow stronger." %E ! %Cp Mon 00034 "Wear %o. They will assist you in your efforts." %E ! %Cc Mon 00035 You remember the descriptions of %i, given to you by the %l. It is ahead that you will find %n's trail. %E ! %Cp Mon 00036 Again, you stand before %i. %E %Cc Mon 00040 *************** *** 1457,1462 **** --- 1550,1564 ---- "Go forth, and let %d guide your steps." %E + %Cc Mon 00082 + %lC studies %o for a moment, + then returns his gaze to you. + + "%oC must remain with you. Use them + as you resume your search for the Amulet. + %Z await your return through the magic portal + that brought you here." + %E %Cp Mon 00090 "Welcome back, %p. How is your quest for the Amulet going?" %E *************** *** 1499,1528 **** %Cp Pri 00009 "May %d be with you, %s." %E ! %Cc Pri 00010 "Ah, %p, my %S. You have returned to us at last. A great blow has befallen our order; perhaps you can help us. First, however, I must determine if you are prepared for this great challenge." %E ! %Cp Pri 00011 "Again, my %S, you stand before me. Are you ready now to help us?" %E ! %Cp Pri 00012 "Once more, %p, you stand within the sanctum. Are you ready now?" %E ! %Cc Pri 00013 "You are a heretic, %p! How can you, %ra, deviate so from the teachings of %d? Begone from this temple. You are no longer %sa to this order. We will pray to %d for other assistance, as you have failed us utterly." %E ! %Cc Pri 00014 "Alas, %p, it is not yet to be. A mere %r could never withstand the might of %n. Go forth, again into the world, and return when you have attained the post of %R." %E ! %Cc Pri 00015 "This is terrible, %p. You have deviated from the true path! You know that %d requires the most strident devotion of this order. The %shood must stand for utmost piety. --- 1601,1645 ---- %Cp Pri 00009 "May %d be with you, %s." %E ! %Cp Pri 00010 ! "Greetings, %r. It is good to see you again." ! %E ! %Cp Pri 00011 ! "Ah, %p! Our deepest gratitude for all of your help." ! %E ! %Cp Pri 00012 ! "Welcome back, %s! With %o, no undead can stand against us." ! %E ! %Cp Pri 00013 ! "Praise be to %d, for delivering us from %n." ! %E ! %Cp Pri 00014 ! "May %d be with you, %s." ! %E ! %Cc Pri 00015 "Ah, %p, my %S. You have returned to us at last. A great blow has befallen our order; perhaps you can help us. First, however, I must determine if you are prepared for this great challenge." %E ! %Cp Pri 00016 "Again, my %S, you stand before me. Are you ready now to help us?" %E ! %Cp Pri 00017 "Once more, %p, you stand within the sanctum. Are you ready now?" %E ! %Cc Pri 00018 "You are a heretic, %p! How can you, %ra, deviate so from the teachings of %d? Begone from this temple. You are no longer %sa to this order. We will pray to %d for other assistance, as you have failed us utterly." %E ! %Cc Pri 00019 "Alas, %p, it is not yet to be. A mere %r could never withstand the might of %n. Go forth, again into the world, and return when you have attained the post of %R." %E ! %Cc Pri 00020 "This is terrible, %p. You have deviated from the true path! You know that %d requires the most strident devotion of this order. The %shood must stand for utmost piety. *************** *** 1530,1536 **** "Go from here, atone for your sins against %d. Return only when you have purified yourself." %E ! %Cc Pri 00016 "Yes, %p. You are truly ready now. Attend to me and I shall tell you of what has transpired: --- 1647,1653 ---- "Go from here, atone for your sins against %d. Return only when you have purified yourself." %E ! %Cc Pri 00021 "Yes, %p. You are truly ready now. Attend to me and I shall tell you of what has transpired: *************** *** 1549,1586 **** "Go with %d as your guide, %p." %E ! %Cp Pri 00020 "You can prevail, if you rely on %d." %E ! %Cp Pri 00021 "Remember that %n has great magic at his command." %E ! %Cp Pri 00022 "Be pure, my %S." %E ! %Cp Pri 00023 "Beware, %i is surrounded by a great graveyard." %E ! %Cp Pri 00024 "You may be able to affect %n with magical cold." %E ! %Cp Pri 00025 "Acquire and wear %o if you can. It will aid you against %n." %E ! %Cp Pri 00026 "Call upon %d when your need is greatest. You will be answered." %E ! %Cp Pri 00027 "The undead legions are weakest during the daylight hours." %E ! %Cp Pri 00028 "Do not lose faith, %p. If you do so, %n will grow stronger." %E ! %Cp Pri 00029 "Wear %o. It will assist you against the undead." %E ! %Cc Pri 00030 You stand facing a large graveyard. The sky above is filled with clouds that seem to get thicker closer to the center. You sense the presence of undead in larger numbers than you have ever encountered before. --- 1666,1703 ---- "Go with %d as your guide, %p." %E ! %Cp Pri 00025 "You can prevail, if you rely on %d." %E ! %Cp Pri 00026 "Remember that %n has great magic at his command." %E ! %Cp Pri 00027 "Be pure, my %S." %E ! %Cp Pri 00028 "Beware, %i is surrounded by a great graveyard." %E ! %Cp Pri 00029 "You may be able to affect %n with magical cold." %E ! %Cp Pri 00030 "Acquire and wear %o if you can. It will aid you against %n." %E ! %Cp Pri 00031 "Call upon %d when your need is greatest. You will be answered." %E ! %Cp Pri 00032 "The undead legions are weakest during the daylight hours." %E ! %Cp Pri 00033 "Do not lose faith, %p. If you do so, %n will grow stronger." %E ! %Cp Pri 00034 "Wear %o. It will assist you against the undead." %E ! %Cc Pri 00035 You stand facing a large graveyard. The sky above is filled with clouds that seem to get thicker closer to the center. You sense the presence of undead in larger numbers than you have ever encountered before. *************** *** 1588,1594 **** You remember the descriptions of %i, given to you by %lC. It is ahead that you will find %ns trail. %E ! %Cp Pri 00031 Again, you stand before %i. %E %Cc Pri 00040 --- 1705,1711 ---- You remember the descriptions of %i, given to you by %lC. It is ahead that you will find %ns trail. %E ! %Cp Pri 00036 Again, you stand before %i. %E %Cc Pri 00040 *************** *** 1730,1766 **** %Cp Ran 00009 "We must regain %o. Without it we will be overrun." %E ! %Cc Ran 00010 "%pC! You have returned! Thank %d. "We have great need of you. But first, I must see if you have the required abilities to take on this responsibility." %E ! %Cp Ran 00011 "Once again, %p, you stand in our midst. Are you ready now?" %E ! %Cp Ran 00012 "Ah, you are here again, %p. Allow me to determine your readiness..." %E ! %Cc Ran 00013 "%pC! You have doomed us all. You fairly radiate %L influences and weaken the power we have raised in this grove as a result! "Begone! We renounce your %shood with us! You are an outcast now!" %E ! %Cc Ran 00014 "%p, you are yet too inexperienced to withstand the demands of that which we need you to do. %RA might just be able to do this thing. "Return to us when you have learned more, my %S." %E ! %Cc Ran 00015 "You have strayed, %p! You know that %d requires that we maintain a pure devotion to things %a! "You must go from us. Return when you have purified yourself." %E ! %Cc Ran 00016 "You are indeed ready, %p. I shall tell you what has transpired, and why we so desperately need your help: --- 1847,1898 ---- %Cp Ran 00009 "We must regain %o. Without it we will be overrun." %E ! %Cp Ran 00010 ! "%pC! I have not seen you in many moons. How do you fare?" ! %E ! %Cp Ran 00011 ! "Birdsong has returned to the grove, surely this means you have defeated %n." ! %E ! %Cp Ran 00012 ! "%lC seems to have regained some of his strength." ! %E ! %Cp Ran 00013 ! "So, tell us how you entered %i, in case some new evil arises there." ! %E ! %Cp Ran 00014 ! "Is that truely %o that I see you carrying?" ! %E ! %Cc Ran 00015 "%pC! You have returned! Thank %d. "We have great need of you. But first, I must see if you have the required abilities to take on this responsibility." %E ! %Cp Ran 00016 "Once again, %p, you stand in our midst. Are you ready now?" %E ! %Cp Ran 00017 "Ah, you are here again, %p. Allow me to determine your readiness..." %E ! %Cc Ran 00018 "%pC! You have doomed us all. You fairly radiate %L influences and weaken the power we have raised in this grove as a result! "Begone! We renounce your %shood with us! You are an outcast now!" %E ! %Cc Ran 00019 "%p, you are yet too inexperienced to withstand the demands of that which we need you to do. %RA might just be able to do this thing. "Return to us when you have learned more, my %S." %E ! %Cc Ran 00020 "You have strayed, %p! You know that %d requires that we maintain a pure devotion to things %a! "You must go from us. Return when you have purified yourself." %E ! %Cc Ran 00021 "You are indeed ready, %p. I shall tell you what has transpired, and why we so desperately need your help: *************** *** 1783,1822 **** "Recover %o for us, %p! Only then will %d be safe." %E ! %Cp Ran 00020 "It is rumored that the Forest and Mountain Centaurs have resolved their ancient feud and now band together against us." %E ! %Cp Ran 00021 "%nC is strong, and very smart." %E ! %Cp Ran 00022 "Use %o, when you find it. It will help you survive to reach us." %E ! %Cp Ran 00023 "Remember, let %d be your guide." %E ! %Cp Ran 00024 "Call upon %d when you face %n. The very act of doing so will infuriate him, and give you advantage." %E ! %Cp Ran 00025 "%n and his kind have always hated us." %E ! %Cp Ran 00026 "We cannot hold the grove much longer, %p. Hurry!" %E ! %Cp Ran 00027 "To infiltrate %i, you must be very stealthy." %E ! %Cp Ran 00028 "Remember that %n is a braggart. Trust not what he says." %E ! %Cp Ran 00029 "You can triumph, %p, if you trust in %d." %E ! %Cc Ran 00030 This must be %i. You are in a cave built of many different rooms, all interconnected --- 1915,1954 ---- "Recover %o for us, %p! Only then will %d be safe." %E ! %Cp Ran 00025 "It is rumored that the Forest and Mountain Centaurs have resolved their ancient feud and now band together against us." %E ! %Cp Ran 00026 "%nC is strong, and very smart." %E ! %Cp Ran 00027 "Use %o, when you find it. It will help you survive to reach us." %E ! %Cp Ran 00028 "Remember, let %d be your guide." %E ! %Cp Ran 00029 "Call upon %d when you face %n. The very act of doing so will infuriate him, and give you advantage." %E ! %Cp Ran 00030 "%n and his kind have always hated us." %E ! %Cp Ran 00031 "We cannot hold the grove much longer, %p. Hurry!" %E ! %Cp Ran 00032 "To infiltrate %i, you must be very stealthy." %E ! %Cp Ran 00033 "Remember that %n is a braggart. Trust not what he says." %E ! %Cp Ran 00034 "You can triumph, %p, if you trust in %d." %E ! %Cc Ran 00035 This must be %i. You are in a cave built of many different rooms, all interconnected *************** *** 1829,1835 **** *rustle* *rustle* (must be bats nearby) *sniff* (I can smell the evil wumpus nearby!) %E ! %Cc Ran 00031 Once again, you descend into %i. *whoosh* (I feel a draft from some pits). --- 1961,1967 ---- *rustle* *rustle* (must be bats nearby) *sniff* (I can smell the evil wumpus nearby!) %E ! %Cc Ran 00036 Once again, you descend into %i. *whoosh* (I feel a draft from some pits). *************** *** 1975,1997 **** "Be careful what you steal, I hear the boss has perfected turning rocks into worthless pieces of glass." %E ! %Cc Rog 00010 "Well, look who it is boys -- %p has come home. You seem to have fallen behind in your dues. I should kill you as an example to these other worthless cutpurses, but I have a better plan. If you are ready maybe you could work off your back dues by performing a little job for me. Let us just see if you are ready..." %E ! %Cp Rog 00011 "Well, I didn't expect to see you back. It shows that you are either stupid, or you are finally ready to accept my offer. Let us hope for your sake it isn't stupidity that brings you back." %E ! %Cp Rog 00012 "Did you perhaps mistake me for some other %lt? You must think me as stupid as your behavior. I warn you not to try my patience." %E ! %Cc Rog 00013 "Well %gp, it looks like our friend has forgotten who is the boss around here. Our friend seems to think that %rp have been put in charge. Wrong. DEAD WRONG!" --- 2107,2146 ---- "Be careful what you steal, I hear the boss has perfected turning rocks into worthless pieces of glass." %E ! %Cp Rog 00010 ! "I was sure wrong about Lady Tyvefelle's house; I barely got away with my ! life and lost my lock pick in the process." ! %E ! %Cp Rog 00011 ! "You're back? Even the Twain don't come back anymore." ! %E ! %Cp Rog 00012 ! "Can you spare an old cutpurse a zorkmid for some grog?" ! %E ! %Cp Rog 00013 ! "Fritz tried to join the other side, and now he's hell-hound chow." ! %E ! %Cp Rog 00014 ! "Be careful what you steal, I hear the boss has perfected turning ! rocks into worthless pieces of glass." ! %E ! %Cc Rog 00015 "Well, look who it is boys -- %p has come home. You seem to have fallen behind in your dues. I should kill you as an example to these other worthless cutpurses, but I have a better plan. If you are ready maybe you could work off your back dues by performing a little job for me. Let us just see if you are ready..." %E ! %Cp Rog 00016 "Well, I didn't expect to see you back. It shows that you are either stupid, or you are finally ready to accept my offer. Let us hope for your sake it isn't stupidity that brings you back." %E ! %Cp Rog 00017 "Did you perhaps mistake me for some other %lt? You must think me as stupid as your behavior. I warn you not to try my patience." %E ! %Cc Rog 00018 "Well %gp, it looks like our friend has forgotten who is the boss around here. Our friend seems to think that %rp have been put in charge. Wrong. DEAD WRONG!" *************** *** 1999,2017 **** Your sudden shift in surroundings prevents you from hearing the end of %ls curse. %E ! %Cc Rog 00014 "In the time that you've been gone you've only been able to master the arts of %ra? I've trained ten times again as many %Rp in that time. Maybe I should send one of them, no? Where would that leave you, %p? Oh yeah, I remember, I was going to kill you!" %E ! %Cc Rog 00015 "Maybe I should chain you to my perch here for a while. Perhaps watching real %a men at work will bring some sense back to you. I don't think I could stand the sight of you for that long though. Come back when you can be trusted to act properly." %E ! %Cc Rog 00016 "Will everyone not going to retrieve %o from that jerk, %n, take one step backwards. Good choice, %p, because I was going to send you anyway. My other %gp --- 2148,2166 ---- Your sudden shift in surroundings prevents you from hearing the end of %ls curse. %E ! %Cc Rog 00019 "In the time that you've been gone you've only been able to master the arts of %ra? I've trained ten times again as many %Rp in that time. Maybe I should send one of them, no? Where would that leave you, %p? Oh yeah, I remember, I was going to kill you!" %E ! %Cc Rog 00020 "Maybe I should chain you to my perch here for a while. Perhaps watching real %a men at work will bring some sense back to you. I don't think I could stand the sight of you for that long though. Come back when you can be trusted to act properly." %E ! %Cc Rog 00021 "Will everyone not going to retrieve %o from that jerk, %n, take one step backwards. Good choice, %p, because I was going to send you anyway. My other %gp *************** *** 2022,2065 **** and bring it back to me. So simple an assignment even you can understand it." %E ! %Cp Rog 00020 "You don't seem to understand, %o isn't here so neither should you be!" %E ! %Cp Rog 00021 "May %d curse you with lead fingers. Get going!" %E ! %Cp Rog 00022 "We don't have all year. GET GOING!" %E ! %Cp Rog 00023 "How would you like a scar necklace? I'm just the jeweler to do it!" %E ! %Cp Rog 00024 "Lazy S.O.B. Maybe I should call up someone else..." %E ! %Cp Rog 00025 "Maybe I should open your skull and see if my instructions are inside?" %E ! %Cp Rog 00026 "This is not a task you can complete in the afterlife, you know." %E ! %Cp Rog 00027 "Inside every living person is a dead person trying to get out, and I have your key!" %E ! %Cp Rog 00028 "We're almost out of hell-hound chow, so why don't you just get moving!" %E ! %Cp Rog 00029 "You know, %o isn't going to come when you whistle. You must get it yourself." %E ! %Cc Rog 00030 Those damn little hairs tell you that you are nearer to %o. %E ! %Cp Rog 00031 Not wanting to face %l without having stolen %o, you continue. %E --- 2171,2214 ---- and bring it back to me. So simple an assignment even you can understand it." %E ! %Cp Rog 00025 "You don't seem to understand, %o isn't here so neither should you be!" %E ! %Cp Rog 00026 "May %d curse you with lead fingers. Get going!" %E ! %Cp Rog 00027 "We don't have all year. GET GOING!" %E ! %Cp Rog 00028 "How would you like a scar necklace? I'm just the jeweler to do it!" %E ! %Cp Rog 00029 "Lazy S.O.B. Maybe I should call up someone else..." %E ! %Cp Rog 00030 "Maybe I should open your skull and see if my instructions are inside?" %E ! %Cp Rog 00031 "This is not a task you can complete in the afterlife, you know." %E ! %Cp Rog 00032 "Inside every living person is a dead person trying to get out, and I have your key!" %E ! %Cp Rog 00033 "We're almost out of hell-hound chow, so why don't you just get moving!" %E ! %Cp Rog 00034 "You know, %o isn't going to come when you whistle. You must get it yourself." %E ! %Cc Rog 00035 Those damn little hairs tell you that you are nearer to %o. %E ! %Cp Rog 00036 Not wanting to face %l without having stolen %o, you continue. %E *************** *** 2173,2181 **** Even before your senses adjust, you recognize the kami of %H. ! But why is the standard of your teki, %n, flying ! above the town? Why are ninja wandering freely, where are the ! samurai of your daimyo, %l? You quickly say a prayer to Izanagi and Izanami and walk towards town. --- 2322,2330 ---- Even before your senses adjust, you recognize the kami of %H. ! You %x the standard of your teki, %n, flying above ! the town. How could such a thing have happened? Why are ninja ! wandering freely; where are the samurai of your daimyo, %l? You quickly say a prayer to Izanagi and Izanami and walk towards town. *************** *** 2205,2244 **** %Cp Sam 00009 "If %o is not returned, we will all be ninja." %E ! %Cc Sam 00010 "Ah, %p-san, it is good to see you again. I need someone who can lead my samurai against %n. If you are ready, you will be that person." %E ! %Cp Sam 00011 "Once again, %p-san, you kneel before me. Are you yet capable of being my vassal?" %E ! %Cp Sam 00012 "You begin to test my matsu, %p-san. If you cannot determine what I want in a samurai, how can I rely on you to figure out what I need from a samurai?" %E ! %Cc Sam 00013 "You are no longer my samurai, %p. "Hara-kiri is denied. You are ordered to shave your head and then to become a monk. Your fief and family are forfeit. Wakarimasu?" %E ! %Cc Sam 00014 "%p-san, you have learned well and honored your family. I require the skills of %Ra in order to defeat %n. Go and seek out teachers. Learn what they have learned. When you are ready, return to me." %E ! %Cc Sam 00015 "%p-san, you would do better to join the kyokaku. "You have skills, but until you can call upon the bushido to know when and how to use them you are not samurai. When you can think %a and act %a then return." %E ! %Cc Sam 00016 "Domo %p-san, indeed you are ready. I can now tell you what it is that I require of you. --- 2354,2408 ---- %Cp Sam 00009 "If %o is not returned, we will all be ninja." %E ! %Cp Sam 00010 ! "Come, join us in celebrating with some sake." ! %E ! %Cp Sam 00011 ! "Ikaga desu ka?" ! %E ! %Cp Sam 00012 ! "You have brought our clan and %l much honor." ! %E ! %Cp Sam 00013 ! "Please %r, sit for a while and tell us how you overcame the Ninja." ! %E ! %Cp Sam 00014 ! "%lC still lives! You have saved us from becoming ronin." ! %E ! %Cc Sam 00015 "Ah, %p-san, it is good to see you again. I need someone who can lead my samurai against %n. If you are ready, you will be that person." %E ! %Cp Sam 00016 "Once again, %p-san, you kneel before me. Are you yet capable of being my vassal?" %E ! %Cp Sam 00017 "You begin to test my matsu, %p-san. If you cannot determine what I want in a samurai, how can I rely on you to figure out what I need from a samurai?" %E ! %Cc Sam 00018 "You are no longer my samurai, %p. "Hara-kiri is denied. You are ordered to shave your head and then to become a monk. Your fief and family are forfeit. Wakarimasu?" %E ! %Cc Sam 00019 "%p-san, you have learned well and honored your family. I require the skills of %Ra in order to defeat %n. Go and seek out teachers. Learn what they have learned. When you are ready, return to me." %E ! %Cc Sam 00020 "%p-san, you would do better to join the kyokaku. "You have skills, but until you can call upon the bushido to know when and how to use them you are not samurai. When you can think %a and act %a then return." %E ! %Cc Sam 00021 "Domo %p-san, indeed you are ready. I can now tell you what it is that I require of you. *************** *** 2256,2297 **** "Wakarimasu?" %E ! %Cp Sam 00020 "To defeat %n you must overcome the seven emotions: hate, adoration, joy, anxiety, anger, grief, and fear." %E ! %Cp Sam 00021 "Remember your honor is my honor, you perform in my name." %E ! %Cp Sam 00022 "I will go to the temple and burn incense for your safe return." %E ! %Cp Sam 00023 "Sayonara." %E ! %Cp Sam 00024 "There can be honor in defeat, but no gain." %E ! %Cp Sam 00025 "Your kami must be strong in order to succeed." %E ! %Cp Sam 00026 "You are indeed a worthy %R, but now you must be a worthy samurai." %E ! %Cp Sam 00027 "If you fail, %n will be like a tai-fun on the land." %E ! %Cp Sam 00028 "If you are truly %a, %d will listen." %E ! %Cp Sam 00029 "Sharpen your swords and your wits for the task before you." %E ! %Cc Sam 00030 You instinctively reach for your swords. You do not recognize the lay of this land, but you know that your teki are everywhere. %E ! %Cp Sam 00031 Thankful that your %sp at %H cannot see your fear, you prepare again to advance. %E --- 2420,2461 ---- "Wakarimasu?" %E ! %Cp Sam 00025 "To defeat %n you must overcome the seven emotions: hate, adoration, joy, anxiety, anger, grief, and fear." %E ! %Cp Sam 00026 "Remember your honor is my honor, you perform in my name." %E ! %Cp Sam 00027 "I will go to the temple and burn incense for your safe return." %E ! %Cp Sam 00028 "Sayonara." %E ! %Cp Sam 00029 "There can be honor in defeat, but no gain." %E ! %Cp Sam 00030 "Your kami must be strong in order to succeed." %E ! %Cp Sam 00031 "You are indeed a worthy %R, but now you must be a worthy samurai." %E ! %Cp Sam 00032 "If you fail, %n will be like a tai-fun on the land." %E ! %Cp Sam 00033 "If you are truly %a, %d will listen." %E ! %Cp Sam 00034 "Sharpen your swords and your wits for the task before you." %E ! %Cc Sam 00035 You instinctively reach for your swords. You do not recognize the lay of this land, but you know that your teki are everywhere. %E ! %Cp Sam 00036 Thankful that your %sp at %H cannot see your fear, you prepare again to advance. %E *************** *** 2444,2476 **** %Cp Tou 00009 "They told me that this was the off season!" %E ! %Cc Tou 00010 "Is it really you, %p! I had given up hope for your return. As you can %x, we are desperately in need of your talents. Someone must defeat %n if our town is become what it once was. "Let me see if you are ready to be that someone." %E ! %Cp Tou 00011 "Things are getting worse, %p. I hope that this time you are ready." %E ! %Cp Tou 00012 "I hope that for the sake of %H you have prepared yourself this time." %E ! %Cc Tou 00013 "It is too late, %p. You are not even worthy to die amongst us. Leave %H and never return." %E ! %Cc Tou 00014 "There is still too much that you have to learn before you can undertake the next step. Return to us as a proven %R, and perhaps then you will be ready. "Go back now, and may the teachings of %d serve you well." %E ! %Cc Tou 00015 "It would be an affront to %d to have one not true to the %a path undertake her bidding. --- 2608,2655 ---- %Cp Tou 00009 "They told me that this was the off season!" %E ! %Cp Tou 00010 ! "Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me." ! %E ! %Cp Tou 00011 ! "Do you know where I could find some nice postcards of The Gnomish Mines?" ! %E ! %Cp Tou 00012 ! "Have you tried the weird toilets?" ! %E ! %Cp Tou 00013 ! "If you stick around, I'll show you the pictures from my latest trip." ! %E ! %Cp Tou 00014 ! "Did you bring me back any souvenirs?" ! %E ! %Cc Tou 00015 "Is it really you, %p! I had given up hope for your return. As you can %x, we are desperately in need of your talents. Someone must defeat %n if our town is become what it once was. "Let me see if you are ready to be that someone." %E ! %Cp Tou 00016 "Things are getting worse, %p. I hope that this time you are ready." %E ! %Cp Tou 00017 "I hope that for the sake of %H you have prepared yourself this time." %E ! %Cc Tou 00018 "It is too late, %p. You are not even worthy to die amongst us. Leave %H and never return." %E ! %Cc Tou 00019 "There is still too much that you have to learn before you can undertake the next step. Return to us as a proven %R, and perhaps then you will be ready. "Go back now, and may the teachings of %d serve you well." %E ! %Cc Tou 00020 "It would be an affront to %d to have one not true to the %a path undertake her bidding. *************** *** 2478,2484 **** bad influences on your actions. Remember, only by following the %a path can you hope to overcome the obstacles you will face." %E ! %Cc Tou 00016 %E "You have indeed proven yourself a worthy %c, %p. --- 2657,2663 ---- bad influences on your actions. Remember, only by following the %a path can you hope to overcome the obstacles you will face." %E ! %Cc Tou 00021 %E "You have indeed proven yourself a worthy %c, %p. *************** *** 2494,2537 **** "Do not be distracted on your quest. If you do not return quickly I fear that all will be lost. Let us both pray now that %d will guide you and keep you safe." ! %Cp Tou 00020 "Do not be fooled by the false promises of %n." %E ! %Cp Tou 00021 "To enter %i you must pass many traps." %E ! %Cp Tou 00022 "If you do not return with %o, your quest will be in vain." %E ! %Cp Tou 00023 "Do not be afraid to call upon %d if you truly need help." %E ! %Cp Tou 00024 "If you do not destroy %n, he will follow you back here!" %E ! %Cp Tou 00025 "Take %o from %n and you may be able to defeat him." %E ! %Cp Tou 00026 "You must hurry, %p!" %E ! %Cp Tou 00027 "You are like %Sa to me, %p. Do not let me down." %E ! %Cp Tou 00028 "If you are %a at all times you may succeed, %p." %E ! %Cp Tou 00029 "Let all who meet you on your journey know that you are on an quest for %l and grant safe passage." %E ! %Cc Tou 00030 Only your faith in %d keeps you from trembling. You %x the handiwork of %ns henchlings everywhere. %E ! %Cp Tou 00031 You know that this time you must find and destroy %n. %E %Cc Tou 00040 --- 2673,2716 ---- "Do not be distracted on your quest. If you do not return quickly I fear that all will be lost. Let us both pray now that %d will guide you and keep you safe." ! %Cp Tou 00025 "Do not be fooled by the false promises of %n." %E ! %Cp Tou 00026 "To enter %i you must pass many traps." %E ! %Cp Tou 00027 "If you do not return with %o, your quest will be in vain." %E ! %Cp Tou 00028 "Do not be afraid to call upon %d if you truly need help." %E ! %Cp Tou 00029 "If you do not destroy %n, he will follow you back here!" %E ! %Cp Tou 00030 "Take %o from %n and you may be able to defeat him." %E ! %Cp Tou 00031 "You must hurry, %p!" %E ! %Cp Tou 00032 "You are like %Sa to me, %p. Do not let me down." %E ! %Cp Tou 00033 "If you are %a at all times you may succeed, %p." %E ! %Cp Tou 00034 "Let all who meet you on your journey know that you are on an quest for %l and grant safe passage." %E ! %Cc Tou 00035 Only your faith in %d keeps you from trembling. You %x the handiwork of %ns henchlings everywhere. %E ! %Cp Tou 00036 You know that this time you must find and destroy %n. %E %Cc Tou 00040 *************** *** 2678,2717 **** %Cp Val 00009 "I would deal with this foul %n myself, but %d forbids it." %E ! %Cc Val 00010 "Ah, %p, my %S. You have returned to %H at last. We are in dire need of your aid, but I must determine if you are yet ready for such an undertaking. "Let me read your fate..." %E ! %Cp Val 00011 "Let me read the future for you now, %p, perhaps you have managed to change it enough..." %E ! %Cp Val 00012 "Again, I shall read your fate, my %S. Let us both hope that you have made changes to become ready for this task..." %E ! %Cc Val 00013 "No, %p. Your fate is sealed. I must cast about for another champion. Begone from my presence, and never return. Know this, that you shall never succeed in this life, and Valhalla is denied to you." %E ! %Cc Val 00014 "I see you and %n fighting, %p. But you are not prepared and shall die at %ns hand if you proceed. No. This will not do. Go back out into the world, and grow more experienced at the ways of war. Only when you have returned %Ra will you be able to defeat %n." %E ! %Cc Val 00015 "NO! This is terrible. I see you becoming an ally of %n, and leading his armies in the final great battles. This must not come to pass! You have strayed from the %a path. You must purge yourself, and return here only when you have regained a state of purity." %E ! %Cc Val 00016 "It is not clear, %p, for my sight is limited without %o. But it is now likely that you can defeat %n, and recover %o. --- 2857,2911 ---- %Cp Val 00009 "I would deal with this foul %n myself, but %d forbids it." %E ! %Cp Val 00010 ! "Hail, and well met, brave %c." ! %E ! %Cp Val 00011 ! "May %d guide your steps, %p." ! %E ! %Cp Val 00012 ! "%lC told us you had succeeded!" ! %E ! %Cp Val 00013 ! "You recovered %o just in time, %p." ! %E ! %Cp Val 00014 ! "Hail %d, for delivering %o back to us." ! %E ! %Cc Val 00015 "Ah, %p, my %S. You have returned to %H at last. We are in dire need of your aid, but I must determine if you are yet ready for such an undertaking. "Let me read your fate..." %E ! %Cp Val 00016 "Let me read the future for you now, %p, perhaps you have managed to change it enough..." %E ! %Cp Val 00017 "Again, I shall read your fate, my %S. Let us both hope that you have made changes to become ready for this task..." %E ! %Cc Val 00018 "No, %p. Your fate is sealed. I must cast about for another champion. Begone from my presence, and never return. Know this, that you shall never succeed in this life, and Valhalla is denied to you." %E ! %Cc Val 00019 "I see you and %n fighting, %p. But you are not prepared and shall die at %ns hand if you proceed. No. This will not do. Go back out into the world, and grow more experienced at the ways of war. Only when you have returned %Ra will you be able to defeat %n." %E ! %Cc Val 00020 "NO! This is terrible. I see you becoming an ally of %n, and leading his armies in the final great battles. This must not come to pass! You have strayed from the %a path. You must purge yourself, and return here only when you have regained a state of purity." %E ! %Cc Val 00021 "It is not clear, %p, for my sight is limited without %o. But it is now likely that you can defeat %n, and recover %o. *************** *** 2731,2775 **** from there and you will find %ns lair. Defeat him and return %o to me." %E ! %Cp Val 00020 "Go with the blessings of %d." %E ! %Cp Val 00021 "Call upon %d when you are in need." %E ! %Cp Val 00022 "Use %o if you can. It will protect you." %E ! %Cp Val 00023 "Magical cold is very effective against %n." %E ! %Cp Val 00024 "To face %n, you will need to be immune to fire." %E ! %Cp Val 00025 "May %d strengthen your sword-arm." %E ! %Cp Val 00026 "Trust in %d. He will not desert you." %E ! %Cp Val 00027 "It becomes more likely that Ragnarok will come with every passing moment. You must hurry, %p." %E ! %Cp Val 00028 "If %n can master %o, he will be powerful enough to face %d far earlier than is fated. This must not be!" %E ! %Cp Val 00029 "Remember your training, %p. You can succeed." %E ! %Cc Val 00030 The ice and snow gives way to a valley floor. You %x ahead of you a huge round hill surrounded by pools of lava. This then is the entrance to %i. It looks like you're not going to get in without a fight though. %E ! %Cp Val 00031 Once again, you stand before the entrance to %i. %E %Cc Val 00040 --- 2925,2969 ---- from there and you will find %ns lair. Defeat him and return %o to me." %E ! %Cp Val 00025 "Go with the blessings of %d." %E ! %Cp Val 00026 "Call upon %d when you are in need." %E ! %Cp Val 00027 "Use %o if you can. It will protect you." %E ! %Cp Val 00028 "Magical cold is very effective against %n." %E ! %Cp Val 00029 "To face %n, you will need to be immune to fire." %E ! %Cp Val 00030 "May %d strengthen your sword-arm." %E ! %Cp Val 00031 "Trust in %d. He will not desert you." %E ! %Cp Val 00032 "It becomes more likely that Ragnarok will come with every passing moment. You must hurry, %p." %E ! %Cp Val 00033 "If %n can master %o, he will be powerful enough to face %d far earlier than is fated. This must not be!" %E ! %Cp Val 00034 "Remember your training, %p. You can succeed." %E ! %Cc Val 00035 The ice and snow gives way to a valley floor. You %x ahead of you a huge round hill surrounded by pools of lava. This then is the entrance to %i. It looks like you're not going to get in without a fight though. %E ! %Cp Val 00036 Once again, you stand before the entrance to %i. %E %Cc Val 00040 *************** *** 2877,2889 **** %Cc Wiz 00001 You are suddenly in familiar surroundings. You notice what appears to be a large, squat stone structure nearby. Wait! That looks like the ! tower of your old master, %l. However, things are not the same as when you were last here. Mists and areas of unexplained darkness surround the tower. There is movement in the shadows. ! Your master would never allow such unaesthetic forms to surround the tower... unless something were dreadfully wrong! %E %Cp Wiz 00002 --- 3071,3083 ---- %Cc Wiz 00001 You are suddenly in familiar surroundings. You notice what appears to be a large, squat stone structure nearby. Wait! That looks like the ! tower of your former teacher, %l. However, things are not the same as when you were last here. Mists and areas of unexplained darkness surround the tower. There is movement in the shadows. ! Your teacher would never allow such unaesthetic forms to surround the tower... unless something were dreadfully wrong! %E %Cp Wiz 00002 *************** *** 2904,2948 **** portal spell!!" %E %Cp Wiz 00008 ! "We must strive to return balance to the world, or all is lost." %E %Cp Wiz 00009 "I, too, will venture into the world, because %n is but one of many evils to be vanquished." %E ! %Cc Wiz 00010 "Come closer, %p, for my voice falters in my old age. Yes, I see that you have come a long way since you went out into the world, leaving the safe confines of this tower. However, I must first determine if you have all of the skills required to take on the task I require of you." %E ! %Cp Wiz 00011 "Well, %p, you have returned. Perhaps you are now ready..." %E ! %Cp Wiz 00012 "This is getting tedious, %p, but perseverance is a sign of a true mage. I certainly hope that you are truly ready this time!" %E ! %Cc Wiz 00013 "You fool, %p! Why did I waste all of those years teaching you the esoteric arts? Get out of here! I shall find another." %E ! %Cc Wiz 00014 "Alas, %p, you have not yet shown your proficiency as a worthy spellcaster. As %ra, you would surely be overcome in the challenge ahead. Go, now, expand your horizons, and return when you have attained renown as %Ra." %E ! %Cc Wiz 00015 ! "You amaze me, %p! How many times did I tell you that Balance ! requires care. One must use the world with care, lest one leave it in ruins ! and simplify the task of %n. "You must go back and show your worthiness. Do not return until you are truly ready for this quest. May %d guide you in this task." %E ! %Cc Wiz 00016 %E "Yes, %p, you truly are ready for this dire task. Listen, carefully, for what I tell you now will be of vital importance. --- 3098,3158 ---- portal spell!!" %E %Cp Wiz 00008 ! "The spells of %n were just to powerful for us to withstand." %E %Cp Wiz 00009 "I, too, will venture into the world, because %n is but one of many evils to be vanquished." %E ! %Cp Wiz 00010 ! "I have some eye of newt to trade, do you have a spare blind-worm's sting?" ! %E ! %Cp Wiz 00011 ! "The magic portal now seems like it will remain stable for quite some time." ! %E ! %Cp Wiz 00012 ! "Have you noticed how much stronger %l is since %o was recovered?" ! %E ! %Cp Wiz 00013 ! "Thank %d! We weren't positive you would defeat %n." ! %E ! %Cp Wiz 00014 ! "I, too, will venture into the world, because %n was but one of ! many evils to be vanquished." ! %E ! %Cc Wiz 00015 "Come closer, %p, for my voice falters in my old age. Yes, I see that you have come a long way since you went out into the world, leaving the safe confines of this tower. However, I must first determine if you have all of the skills required to take on the task I require of you." %E ! %Cp Wiz 00016 "Well, %p, you have returned. Perhaps you are now ready..." %E ! %Cp Wiz 00017 "This is getting tedious, %p, but perseverance is a sign of a true mage. I certainly hope that you are truly ready this time!" %E ! %Cc Wiz 00018 "You fool, %p! Why did I waste all of those years teaching you the esoteric arts? Get out of here! I shall find another." %E ! %Cc Wiz 00019 "Alas, %p, you have not yet shown your proficiency as a worthy spellcaster. As %ra, you would surely be overcome in the challenge ahead. Go, now, expand your horizons, and return when you have attained renown as %Ra." %E ! %Cc Wiz 00020 ! "You amaze me, %p! How many times did I tell you that the way of a mage ! is an exacting one. One must use the world with care, lest one leave it ! in ruins and simplify the task of %n. "You must go back and show your worthiness. Do not return until you are truly ready for this quest. May %d guide you in this task." %E ! %Cc Wiz 00021 %E "Yes, %p, you truly are ready for this dire task. Listen, carefully, for what I tell you now will be of vital importance. *************** *** 2965,3006 **** "You must travel to %i, and within its dungeons, find and overcome %n, and return %o to me. ! "Go now, with %d, and return Balance to the world." ! %Cp Wiz 00020 "Beware, for %n is immune to most magical attacks." %E ! %Cp Wiz 00021 "To enter %i you must pass many traps." %E ! %Cp Wiz 00022 "%nC may be vulnerable to physical attacks." %E ! %Cp Wiz 00023 "%d will come to your aid when you call." %E ! %Cp Wiz 00024 "You must utterly destroy %n. He will pursue you otherwise." %E ! %Cp Wiz 00025 "%oC is a mighty artifact. With it you can destroy %n." %E ! %Cp Wiz 00026 "Go forth with the blessings of %d." %E ! %Cp Wiz 00027 "I will have my %gP watch for your return." %E ! %Cp Wiz 00028 "Feel free to take any items in that chest that might aid you." %E ! %Cp Wiz 00029 "You will know when %o is near. Proceed with care!" %E ! %Cc Wiz 00030 Wisps of fog swirl nearby. You feel that %ns lair is close. %E ! %Cp Wiz 00031 You believe that you may once again invade %i. %E %Cc Wiz 00040 --- 3175,3216 ---- "You must travel to %i, and within its dungeons, find and overcome %n, and return %o to me. ! "Go now, with %d, and complete this quest before it is too late." ! %Cp Wiz 00025 "Beware, for %n is immune to most magical attacks." %E ! %Cp Wiz 00026 "To enter %i you must pass many traps." %E ! %Cp Wiz 00027 "%nC may be vulnerable to physical attacks." %E ! %Cp Wiz 00028 "%d will come to your aid when you call." %E ! %Cp Wiz 00029 "You must utterly destroy %n. He will pursue you otherwise." %E ! %Cp Wiz 00030 "%oC is a mighty artifact. With it you can destroy %n." %E ! %Cp Wiz 00031 "Go forth with the blessings of %d." %E ! %Cp Wiz 00032 "I will have my %gP watch for your return." %E ! %Cp Wiz 00033 "Feel free to take any items in that chest that might aid you." %E ! %Cp Wiz 00034 "You will know when %o is near. Proceed with care!" %E ! %Cc Wiz 00035 Wisps of fog swirl nearby. You feel that %ns lair is close. %E ! %Cp Wiz 00036 You believe that you may once again invade %i. %E %Cc Wiz 00040 *** nethack-3.3.1/dat/Ranger.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Ranger.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Ranger.des 3.3 1999/11/26 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Ranger.des 3.4 2001/02/01 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. *************** *** 14,47 **** GEOMETRY:left,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ! TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT.. ! TT...................................TT. ! TT..TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT..TT ! T..TT...............F...............TT..T ! T.TT..TTTTTTTTTTTTT.F.TTTTTTTTTTTTT..TT.T ! T.T..TT.............F.............TT..T.T ! T.T.TT..TTTTTTTTTTTTTTTTTTTTTTTTT..TT.T.T ! T.T.T..TT.......................TT..T...T ! T.T.T.TT..TTTTTTTTTTTTTTTTTTTTT..TT.TTTTT ! T...T.T..TT.|.....................T...... ! TFFFT.T.TT..S..................TTTTTTTTTT ! T...T.T..TT.|.................TT....T...T ! T.T.T.TT..TTTTTTTTTTTTTTTTTTTTT..TT.T.T.T ! T.T.T..TT.......................TT..T.T.T ! T.T.TT..TTTTTTTTTTTTTTTTTTTTTTTTT..TT.T.T ! T.T..TT.............F.............TT..T.T ! T.TT..TTTTTTTTTTTTT.F.TTTTTTTTTTTTT..TT.T ! T..TT...............F...............TT..T ! TT..TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT..TT ! TT...................................TT. ! TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT.. ENDMAP # Dungeon Description REGION:(00,00,40,20),lit,"ordinary" # Stairs STAIR:(10,10),down ! # Portal arrival point ! BRANCH:levregion(01,00,79,20),(0,0,40,20) # Orion MONSTER:'@',"Orion",(20,10) # The treasure of Orion --- 14,47 ---- GEOMETRY:left,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ! .. ! ................................... . ! .. .. ! .. ...............F............... .. ! . .. .F. .. . ! . .. .............F............. .. . ! . . .. .. . . ! . . .. ....................... .. ... ! . . . .. .. . ! ... . .. .|..................... ...... ! FFF . . ..S.................. ! ... . .. .|................. .... ... ! . . . .. .. . . . ! . . .. ....................... .. . . ! . . .. .. . . ! . .. .............F............. .. . ! . .. .F. .. . ! .. ...............F............... .. ! .. .. ! ................................... . ! .. ENDMAP # Dungeon Description REGION:(00,00,40,20),lit,"ordinary" # Stairs STAIR:(10,10),down ! # Portal arrival point; just about anywhere on the right hand side of the map ! BRANCH:levregion(51,2,77,18),(0,0,40,20) # Orion MONSTER:'@',"Orion",(20,10) # The treasure of Orion *** nethack-3.3.1/dat/Rogue.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Rogue.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Rogue.des 3.3 93/05/10 # Copyright (c) 1992 by Dean Luick # NetHack may be freely redistributed. See license for details. # --- 1,4 ---- ! # SCCS Id: @(#)Rogue.des 3.4 2002/02/15 # Copyright (c) 1992 by Dean Luick # NetHack may be freely redistributed. See license for details. # *************** *** 10,31 **** MAZE: "Rog-strt",' ' FLAGS: noteleport, hardfloor, nommap GEOMETRY:center,center - MAP # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 ---------------------------------.------------------------------------------ |.....|.||..........|....|......|.|.........|.......+............---.......| ! |.....|..+..........+....---....S.|...-------.-----.|............+.+.......| |.....+.||........---......|....|.|...|.....|.|...|.---.....------.--------| |-----|.-------|..|........------.-----.....|.--..|...-------..............| ! |.....|........------+------..........+.....|..------.........------.-----.. |.....|.------...............-----.}}.--------.|....-------.---....|.+...--| |..-+--.|....|-----.--------.|...|.....+.....|.|....|.....+.+......|.--....| |..|....|....|....+.|......|.|...-----.|.....|.--...|.....|.|......|..|....| ! |..|.----------...|.+....-----...|...|.----..|..|.---....--.---S-----.|----| |..|.|........|...------.|.S.....|...|....-----.+.|......|..|.......|.|....| |---.-------..|...|....|.|.|.....|...----.|...|.|---.....|.|-.......|.---..| ! ...........|..|...|....---.----S----..|...|...+.|..-------.---+-....|...--+| |---------.---------...|......|....S..|.---...|.|..|...........----.---....| |........|.........|...+.------....|---.---...|.--+-.----.----....|.+...--+| |........|.---+---.|----.--........|......-----......|..|..|.--+-.|.-S-.|..| --- 10,31 ---- MAZE: "Rog-strt",' ' FLAGS: noteleport, hardfloor, nommap GEOMETRY:center,center # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 + MAP ---------------------------------.------------------------------------------ |.....|.||..........|....|......|.|.........|.......+............---.......| ! |.....|..+..........+....---....S.|...-S-----.-----.|............+.+.......| |.....+.||........---......|....|.|...|.....|.|...|.---.....------.--------| |-----|.-------|..|........------.-----.....|.--..|...-------..............| ! |.....|........------+------..........+.....|..--S---.........------.-----.. |.....|.------...............-----.}}.--------.|....-------.---....|.+...--| |..-+--.|....|-----.--------.|...|.....+.....|.|....|.....+.+......|.--....| |..|....|....|....+.|......|.|...-----.|.....|.--...|.....|.|......|..|....| ! |..|.-----S----...|.+....-----...|...|.----..|..|.---....--.---S-----.|----| |..|.|........|...------.|.S.....|...|....-----.+.|......|..|.......|.|....| |---.-------..|...|....|.|.|.....|...----.|...|.|---.....|.|-.......|.---..| ! ...........|..S...|....---.----S----..|...|...+.|..-------.---+-....|...--+| |---------.---------...|......|....S..|.---...|.|..|...........----.---....| |........|.........|...+.------....|---.---...|.--+-.----.----....|.+...--+| |........|.---+---.|----.--........|......-----......|..|..|.--+-.|.-S-.|..| *************** *** 58,63 **** --- 58,67 ---- DOOR: locked, (57,17) DOOR: locked, (11,19) DOOR: locked, (37,19) + DOOR: locked, (39, 2) + DOOR: locked, (49, 5) + DOOR: locked, (10, 9) + DOOR: locked, (14,12) # Doors (regular) DOOR: closed, (52, 1) DOOR: closed, ( 9, 2) *************** *** 171,179 **** MAZE: "Rog-loca",' ' GEOMETRY:center,center - MAP # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 ---------------------------------------------------- -------- ---.................................................- --.....| ---...--------........-------.......................--- ---...| --- 175,183 ---- MAZE: "Rog-loca",' ' GEOMETRY:center,center # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 + MAP ---------------------------------------------------- -------- ---.................................................- --.....| ---...--------........-------.......................--- ---...| *************** *** 191,197 **** |.....|..............------.............-----..........|| ||........| |.....|.............-- ---.........................|| |.......|| |.....|.............- ---.....................--| ||......| ! |------------.......---- --.................---- |.....|| |...........|..........--------..............----- ||....| |...........|............................----- |....| ------------------------------------------ ------ --- 195,201 ---- |.....|..............------.............-----..........|| ||........| |.....|.............-- ---.........................|| |.......|| |.....|.............- ---.....................--| ||......| ! |-S----------.......---- --.................---- |.....|| |...........|..........--------..............----- ||....| |...........|............................----- |....| ------------------------------------------ ------ *************** *** 206,212 **** # Non diggable walls NON_DIGGABLE:(00,00,75,20) # Objects ! OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random --- 210,216 ---- # Non diggable walls NON_DIGGABLE:(00,00,75,20) # Objects ! OBJECT:'?',"teleportation",(11,18),cursed,0 OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random *************** *** 264,299 **** MONSTER: ':',"chameleon",random,hostile # ! # The "goal" level for the quest. # ! # Here you meet The Master Assassin your nemesis monster. You have to ! # defeat The Master Assassin in combat to gain the artifact you have ! # been assigned to retrieve. # MAZE: "Rog-goal", ' ' FLAGS: noteleport GEOMETRY:center,center - MAP # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 ----- -------.......................................|-----------------| |...| -----.....|.......................................|.................| |...----...|.....|.......................................|....---------....| |.---......---..--.................................------------.......|....| |...............|..................................|..|...|...----........-| ! |.....-----....--.................................|-..--..-|.....---------| ! |------...|....|.................................|-........-|....|........| |.........---------.............................|-....}}....-|...|...|....| ! |....|.....|......|............................|-.....}}.....-|..--.------| |-----.....--.....|...........................|-...}}}}}}}}...-|....|.....-- ! |...........--....------------...............|-....}}}}}}}}....-|..........| ! |............--........|...|.|..............--.....}}.}}........------------ ! |.............|........|...|.|..............|......}}}}}}}}......|...|.....| ! |--.---.---.---.---.---|...|.------------...--........}}.}}.....--..---....| ! |.---.---.---.---.---..-----.|....|.....|....|-....}}}}}}}}....---..|.|--..| ! |...|.......|..........|...---....---...S.....|-...}}}}}}}}...-|.|..|...|..| ! |...|..|....|..........|............|..--..----|-.....}}.....-|..----...---- ! |...|---....----.......|----- ......|...---| |-....}}....-|...|..-----..| -----.....---.....--.---....--...--------..| |-........-|....|.........| |.............|..........|.............S... |S-------|.....|..-----..| ---------------------------------------- ...... ---------- ---- --- 268,304 ---- MONSTER: ':',"chameleon",random,hostile # ! # The "goal" level for the quest. Teleportation and digging are ! # disallowed. # ! # You have to reach The Master Assassin via some means other than ! # simple searching or digging since there is no path between your ! # arrival point and his location. # MAZE: "Rog-goal", ' ' FLAGS: noteleport GEOMETRY:center,center # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 + MAP ----- -------.......................................|-----------------| |...| -----.....|.......................................|.................| |...----...|.....|.......................................|....---------....| |.---......---..--.................................------------.......|....| |...............|..................................|..|...|...----........-| ! |.....-----....--.................................|-..--..-|.....----S----| ! |--S---...|....|.................................|-........-|....|........| |.........---------.............................|-....}}....-|...|...|....| ! |....|.....S......|............................|-.....}}.....-|..--.------| |-----.....--.....|...........................|-...}}}}}}}}...-|....|.....-- ! |...........--....------S-----...............|-....}}}}}}}}....-|..........| ! |............--........|...| |..............--.....}}.}}........----------S- ! |.............|........|...| |..............|......}}}}}}}}......|...|.....| ! |S-.---.---.---.---.---|...| ------------...--........}}.}}.....--..---....| ! |.---.---.---.---.-S-..----- |....|.....|....|-....}}}}}}}}....---..S.|--..| ! |...|.......|..........|...---....---...S.....|-...}}}}}}}}...-|.S..|...|..| ! |...|..|....|..........|............|..--..----|-.....}}.....-|..----...-S-- ! |...|---....----.......|----- ......|...---| |-....}}....-|...|..--.--..| -----.....---.....--.---....--...--------..| |-........-|....|.........| |.............|..........|.............S... |S-------|.....|..-----..| ---------------------------------------- ...... ---------- ---- *************** *** 301,307 **** # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" # Stairs ! STAIR:random,up # Doors # Non diggable walls NON_DIGGABLE:(00,00,75,20) --- 306,312 ---- # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" # Stairs ! STAIR:levregion(01,00,15,20),(01,18,04,20),up # Doors # Non diggable walls NON_DIGGABLE:(00,00,75,20) *************** *** 309,315 **** TRAP:"spiked pit",(37,07) # Objects OBJECT:'(',"skeleton key",(38,10),blessed,0,"The Master Key of Thievery" ! OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random --- 314,320 ---- TRAP:"spiked pit",(37,07) # Objects OBJECT:'(',"skeleton key",(38,10),blessed,0,"The Master Key of Thievery" ! OBJECT:'%',"tin",(26,12),"chameleon",0 OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random *************** *** 371,376 **** --- 376,385 ---- MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile + MONSTER:';',"shark",(51,14),hostile + MONSTER:';',"shark",(53,09),hostile + MONSTER:';',"shark",(55,15),hostile + MONSTER:';',"shark",(58,10),hostile # # The "fill" level for the quest. *** nethack-3.3.1/dat/rumors.fal Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/rumors.fal Thu Mar 21 07:37:36 2002 *************** *** 60,65 **** --- 60,66 ---- Drop your vanity and get rid of your jewels! Pickpockets about! Eat 10 cloves of garlic and keep all humans at a two-square distance. Eels hide under mud. Use a unicorn to clear the water and make them visible. + Elf has extra speed. Engrave your wishes with a wand of wishing. Eventually you will come to admire the swift elegance of a retreating nymph. Ever heard hissing outside? I *knew* you hadn't! *************** *** 236,241 **** --- 237,243 ---- They say that dipping a bag of tricks in a fountain won't make it an icebox. They say that dipping an eel and brown mold in hot water makes bouillabaisse. They say that donating a doubloon is extremely pious charity. + They say that dungeoneers prefer dark chocolate. They say that eating royal jelly attracts grizzly owlbears. They say that eggs, pancakes and juice are just a mundane breakfast. They say that everyone knows why Medusa stands alone in the dark. *************** *** 300,306 **** They say that the Three Rings are named Vilya, Nenya and Narya. They say that the Wizard of Yendor has a death wish. They say that the `hair of the dog' is sometimes an effective remedy. ! They say that the best time to save your game is now before its too late. They say that the biggest obstacle in NetHack is your mind. They say that the gods are angry when they hit you with objects. They say that the priesthood are specially favored by the gods. --- 302,308 ---- They say that the Three Rings are named Vilya, Nenya and Narya. They say that the Wizard of Yendor has a death wish. They say that the `hair of the dog' is sometimes an effective remedy. ! They say that the best time to save your game is now before it's too late. They say that the biggest obstacle in NetHack is your mind. They say that the gods are angry when they hit you with objects. They say that the priesthood are specially favored by the gods. *************** *** 378,383 **** --- 380,386 ---- You can make holy water by boiling the hell out of it. You can protect yourself from black dragons by doing the following: --More-- You can't get by the snake. + You choke on the fortune cookie. --More-- You feel like someone is pulling your leg. You have to outwit the Sphynx or pay her. You hear the fortune cookie's hissing! *** nethack-3.3.1/dat/rumors.tru Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/rumors.tru Thu Mar 21 07:37:36 2002 *************** *** 50,56 **** Eating a wraith is a rewarding experience! Eating unpaid leprechauns may be advantageous. Elbereth has quite a reputation around these parts. - Elf has extra speed. Elf corpses are incompatible with the sandman, and at times the gods as well. Elven cloaks cannot rust. Even evil players have a guardian angel. --- 50,55 ---- *************** *** 91,96 **** --- 90,96 ---- It is dangerous to visit a graveyard at midnight. It is not always a good idea to whistle for your dog. It is rumored that the Wizard has hired some help. + It is the letter 'c' and not 'e' that changes status to statue. It might be a good idea to offer the unicorn a ruby. It would be peculiarly sad were your dog turned to stone. It's a `d' eats `d' world. *************** *** 144,153 **** Someone once said that what goes up < might come down >. Someone's been spiking the pits! Sometimes monsters are more likely to fight each other than attack you. ! Spinach, carrot, and a melon -- a meal fit for a nurse! Tainted meat is even more sickening than poison! Telepathy is just a trick: once you know how to do it, it's easy. - The darker the warning, the more dire the danger. The Leprechaun Gold Tru$t is no division of the Magic Memory Vault. The Wizard finds death to be quite an experience. The best equipment for your work is, of course, the most expensive. --- 144,152 ---- Someone once said that what goes up < might come down >. Someone's been spiking the pits! Sometimes monsters are more likely to fight each other than attack you. ! Spinach, carrot, and jelly -- a meal fit for a nurse! Tainted meat is even more sickening than poison! Telepathy is just a trick: once you know how to do it, it's easy. The Leprechaun Gold Tru$t is no division of the Magic Memory Vault. The Wizard finds death to be quite an experience. The best equipment for your work is, of course, the most expensive. *************** *** 163,168 **** --- 162,168 ---- There is more magic in this cave than meets the eye. There is no harm in praising a large dog. There is nothing like eating a mimic. + There once was a Knight named Lancelot who liked to ride with his lance a lot. They say a gelatinous cube can paralyze you... They say that Juiblex is afraid of a wand of digging. They say that Medusa would like to put you on a pedestal. *************** *** 213,221 **** They say that disturbing a djinni can be a costly mistake. They say that dragon scales can be quite enchanting. They say that dropping coins into a fountain will not grant you a wish. - They say that dungeoneers prefer dark chocolate. They say that dwarves lawfully mind their own business. ! They say that eating a bat corpse will make you batty, for awhile. They say that eating a cram ration is a smart move. They say that eating blue jelly is cool if you don't fight the feeling. They say that escaping a dungeon is only the beginning of the end. --- 213,220 ---- They say that disturbing a djinni can be a costly mistake. They say that dragon scales can be quite enchanting. They say that dropping coins into a fountain will not grant you a wish. They say that dwarves lawfully mind their own business. ! They say that eating a bat corpse will make you batty, for a while. They say that eating a cram ration is a smart move. They say that eating blue jelly is cool if you don't fight the feeling. They say that escaping a dungeon is only the beginning of the end. *************** *** 314,320 **** They say that you are lucky if you can get a unicorn to catch a ruby. They say that you are what you eat. They say that you can find named weapons at an altar if you're lucky. ! They say that you can safely touch cockatrices eggs but why bother? They say that you can't break an amulet of reflection. They say that you don't always get what you wish for. They say that you should always be prepared for a final challenge. --- 313,319 ---- They say that you are lucky if you can get a unicorn to catch a ruby. They say that you are what you eat. They say that you can find named weapons at an altar if you're lucky. ! They say that you can safely touch cockatrice eggs but why bother? They say that you can't break an amulet of reflection. They say that you don't always get what you wish for. They say that you should always be prepared for a final challenge. *** nethack-3.3.1/dat/Samurai.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Samurai.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Samurai.des 3.3 95/06/29 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-92 by M. Stephenson, P. Winner # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Samurai.des 3.4 1995/06/29 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-92 by M. Stephenson, P. Winner # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/sokoban.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/sokoban.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)sokoban.des 3.3 99/03/15 # Copyright (c) 1998-1999 by Kevin Hugo # NetHack may be freely redistributed. See license for details. # --- 1,4 ---- ! # SCCS Id: @(#)sokoban.des 3.4 1999/03/15 # Copyright (c) 1998-1999 by Kevin Hugo # NetHack may be freely redistributed. See license for details. # *************** *** 508,513 **** --- 508,516 ---- TRAP:"hole",(22,01) TRAP:"hole",(23,01) + MONSTER:'m',"giant mimic", random, m_object "boulder" + MONSTER:'m',"giant mimic", random, m_object "boulder" + # Random objects OBJECT:'%',random,random OBJECT:'%',random,random *************** *** 599,604 **** --- 602,609 ---- TRAP:"hole",(21,01) TRAP:"hole",(22,01) + MONSTER:'m',"giant mimic", random, m_object "boulder" + MONSTER:'m',"giant mimic", random, m_object "boulder" # Random objects OBJECT:'%',random,random *** nethack-3.3.1/dat/Tourist.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Tourist.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Tourist.des 3.3 92/09/26 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991,92 by M. Stephenson, P. Winner # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Tourist.des 3.4 1992/09/26 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991,92 by M. Stephenson, P. Winner # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/tower.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/tower.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)tower.des 3.3 90/02/26 # Copyright (c) 1989 by Jean-Christophe Collet # NetHack may be freely redistributed. See license for details. # --- 1,4 ---- ! # SCCS Id: @(#)tower.des 3.4 1990/02/26 # Copyright (c) 1989 by Jean-Christophe Collet # NetHack may be freely redistributed. See license for details. # *** nethack-3.3.1/dat/Valkyrie.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Valkyrie.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Valkyrie.des 3.3 97/01/31 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)Valkyrie.des 3.4 1997/01/31 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/dat/Wizard.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/Wizard.des Thu Mar 21 07:37:36 2002 *************** *** 1,10 **** ! # SCCS Id: @(#)Wizard.des 3.3 92/07/11 # Copyright (c) 1992 by David Cohrs # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # ! # Here you meet your (besieged) class leader, the Wizard of Balance # and receive your quest assignment. # MAZE: "Wiz-strt",' ' --- 1,10 ---- ! # SCCS Id: @(#)Wizard.des 3.4 1992/07/11 # Copyright (c) 1992 by David Cohrs # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # ! # Here you meet your (besieged) class leader, Neferet the Green # and receive your quest assignment. # MAZE: "Wiz-strt",' ' *************** *** 51,59 **** DOOR:closed,(15,10) DOOR:locked,(19,10) DOOR:locked,(20,10) ! # Wizard of Balance ! MONSTER:'@',"Wizard of Balance",(23,05) ! # The treasure of Wizard of Balance OBJECT:'(',"chest",(24,05) # apprentice guards for the audience chamber MONSTER:'@',"apprentice",(30,07) --- 51,59 ---- DOOR:closed,(15,10) DOOR:locked,(19,10) DOOR:locked,(20,10) ! # Neferet the Green, the quest leader ! MONSTER:'@',"Neferet the Green",(23,05) ! # The treasure of the quest leader OBJECT:'(',"chest",(24,05) # apprentice guards for the audience chamber MONSTER:'@',"apprentice",(30,07) *************** *** 236,244 **** -------|...........-------------------...........| |......S...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| ! |......|...........--+--+--+--+--+--+-...........| --S----|...........S.................+...........| ! |......|...........--+--+--+--+--+--+-...........| |......|...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| -------|...........-------------------...........| --- 236,244 ---- -------|...........-------------------...........| |......S...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| ! |......|...........-F+-F+-F+-F+-F+-F+-...........| --S----|...........S.................+...........| ! |......|...........-F+-F+-F+-F+-F+-F+-...........| |......|...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| -------|...........-------------------...........| *************** *** 349,354 **** --- 349,356 ---- MONSTER:'@',"Grey-elf",(44,11),peaceful MONSTER:'H',"hill giant",(47,11),peaceful,asleep MONSTER:'G',"gnomish wizard",(38,06),peaceful + MONSTER:'@',"prisoner",(35,11),peaceful + MONSTER:'@',"prisoner",(41,11),peaceful,asleep # # The "fill" levels for the quest. *** nethack-3.3.1/dat/wizhelp Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/wizhelp Thu Mar 21 07:37:36 2002 *************** *** 9,11 **** --- 9,22 ---- ^V == do trans-level teleport. ^W == make wish. ^X == show attributes including intrinsic attributes. + + #levelchange == change experience level + #light sources == show mobile light sources + #monpoly_control == control monster polymorphs + #poly == polymorph self + #seenv == show seen vectors + #stats == show memory statistics + #timeout == look at timeout queue + #vision == show vision array + #wmode == show wall modes + *** nethack-3.3.1/dat/yendor.des Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/dat/yendor.des Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)yendor.des 3.3 96/10/20 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by M. Stephenson and Izchak Miller # NetHack may be freely redistributed. See license for details. --- 1,4 ---- ! # SCCS Id: @(#)yendor.des 3.4 1996/10/20 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1992 by M. Stephenson and Izchak Miller # NetHack may be freely redistributed. See license for details. *** nethack-3.3.1/doc/Guidebook.mn Thu Feb 14 07:59:26 2002 --- nethack-3.4.0/doc/Guidebook.mn Thu Mar 21 07:37:36 2002 *************** *** 1,16 **** .ds h0 "NetHack Guidebook .ds h1 .ds h2 % ! .ds vr "NetHack 3.3 .ds f0 "\*(vr .ds f1 ! .ds f2 "August 2, 2000 .mt A Guide to the Mazes of Menace ! (Guidebook for NetHack 3.3) .au Eric S. Raymond ! (Extensively edited and expanded for 3.0 by Mike Threepoint) .hn 1 Introduction --- 1,16 ---- .ds h0 "NetHack Guidebook .ds h1 .ds h2 % ! .ds vr "NetHack 3.4 .ds f0 "\*(vr .ds f1 ! .ds f2 "March 20, 2002 .mt A Guide to the Mazes of Menace ! (Guidebook for NetHack) .au Eric S. Raymond ! (Extensively edited and expanded for 3.4) .hn 1 Introduction *************** *** 189,194 **** --- 189,195 ---- understand what NetHack is doing with the screen. The NetHack screen replaces the ``You see ...'' descriptions of text adventure games. Figure 1 is a sample of what a NetHack screen might look like. + The way the screen looks for you depends on your platform. .TS S center tab(~); *************** *** 205,211 **** ! Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak _ --- 206,212 ---- ! Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak _ *************** *** 227,234 **** experience level, see below). .lp Strength A measure of your character's strength; one of your six basic ! attributes. Your attributes can range from 3 to 18 inclusive ! (occasionally you may get super-strengths of the form 18/xx). The higher your strength, the stronger you are. Strength affects how successfully you perform physical tasks, how much damage you do in combat, and how much loot you can carry. --- 228,237 ---- experience level, see below). .lp Strength A measure of your character's strength; one of your six basic ! attributes. A human character's attributes can range from 3 to 18 inclusive; ! non-humans may exceed these limits ! (occasionally you may get super-strengths of the form 18/xx, and magic can ! also cause attributes to exceed the normal limits). The higher your strength, the stronger you are. Strength affects how successfully you perform physical tasks, how much damage you do in combat, and how much loot you can carry. *************** *** 365,370 **** --- 368,377 ---- Letters and certain other symbols represent the various inhabitants of the Mazes of Menace. Watch out, they can be nasty and vicious. Sometimes, however, they can be helpful. + .lp I + This marks the last known location of an invisible or otherwise unseen + monster. Note that the monster could have moved. The 'F' and 'm' commands + may be useful here. .pg You need not memorize all these symbols; you can ask the game what any symbol represents with the `/' command (see the next section for *************** *** 430,440 **** .lp & Tell what a command does. .lp < ! Go up to the previous level (if you are on the staircase or ladder). .lp > ! Go down to the next level (if you are on the staircase or ladder). .lp [yuhjklbn] ! Go one step in the direction indicated (see Figure 2). If you can sense a monster there, you will fight the monster instead. Only these one-step movement commands cause you to fight monsters; the others (below) are ``safe.'' --- 437,448 ---- .lp & Tell what a command does. .lp < ! Go up to the previous level (if you are on a staircase or ladder). .lp > ! Go down to the next level (if you are on a staircase or ladder). .lp [yuhjklbn] ! Go one step in the direction indicated (see Figure 2). If you sense ! or remember a monster there, you will fight the monster instead. Only these one-step movement commands cause you to fight monsters; the others (below) are ``safe.'' *************** *** 466,471 **** --- 474,484 ---- Prefix: move until something interesting is found. .lp "G[yuhjklbn] or [yuhjklbn] Prefix: same as `g', but forking of corridors is not considered interesting. + .lp _ + Travel to a map location via a shortest-path algorithm. Stops on most of + the same conditions as the `G' command does. For ports with mouse + support, the command is also invoked when a mouse-click takes place on a + location further than 1 cell away from the current position. .lp . Rest, do nothing for one turn. .lp a *************** *** 598,604 **** .lp z Zap a wand. To aim at yourself, use `.' for the direction. .lp Z ! Zap (cast) a spell. .lp ^Z Suspend the game .ux " versions with job control only)." ( --- 611,617 ---- .lp z Zap a wand. To aim at yourself, use `.' for the direction. .lp Z ! Zap (cast) a spell. To cast at yourself, use `.' for the direction. .lp ^Z Suspend the game .ux " versions with job control only)." ( *************** *** 652,658 **** .lp #chat Talk to someone. .lp #conduct ! List which challenges you have adhered to. .lp #dip Dip an object into something. .lp #enhance --- 665,672 ---- .lp #chat Talk to someone. .lp #conduct ! List which challenges you have adhered to. See the section below entitled ! ``Conduct'' for details. .lp #dip Dip an object into something. .lp #enhance *************** *** 679,685 **** .lp #ride Ride (or stop riding) a monster. .lp #rub ! Rub a lamp. .lp #sit Sit down. .lp #turn --- 693,699 ---- .lp #ride Ride (or stop riding) a monster. .lp #rub ! Rub a lamp or a stone. .lp #sit Sit down. .lp #turn *************** *** 706,713 **** .\" on the Amiga set the {\it altmeta\/} option to get this behavior. In NT, OS/2, and PC NetHack, the `Alt' key can be used in this fashion. .lp M-2 ! #twoweapon .lp M-a #adjust .lp M-c --- 720,729 ---- .\" on the Amiga set the {\it altmeta\/} option to get this behavior. In NT, OS/2, and PC NetHack, the `Alt' key can be used in this fashion. + .lp M-? + #? (not supported by all platforms) .lp M-2 ! #twoweapon (unless the number_pad option is enabled) .lp M-a #adjust .lp M-c *************** *** 750,755 **** --- 766,773 ---- If the .op number_pad option is on, some additional letter commands are available: + .lp h + Help menu: display one of several help texts available, like ``?''. .lp j Jump to another location. Same as ``#jump'' or ``M-j''. .lp k *************** *** 758,764 **** Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. Same as ``#loot'' or ``M-l''. .lp N ! Name an item or type of object. Same as ``#name'' or ``M-N''. .lp u Untrap a trap, door, or chest. Same as ``#untrap'' or ``M-u''. --- 776,782 ---- Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. Same as ``#loot'' or ``M-l''. .lp N ! Name an item or type of object. Same as ``#name'' or ``M-n''. .lp u Untrap a trap, door, or chest. Same as ``#untrap'' or ``M-u''. *************** *** 870,875 **** --- 888,902 ---- into it. Many monsters you find will mind their own business unless you attack them. Some of them are very dangerous when angered. Remember: discretion is the better part of valor. + .pg + If you can't see a monster (if it is invisible, or if you are blinded), + the symbol `I' will be shown when you learn of its presence. + If you attempt to walk into it, you will try to fight it just like + a monster that you can see; of course, + if the monster has moved, you will attack empty air. If you guess + that the monster has moved and you don't wish to fight, you can use the `m' + command to move without fighting; likewise, if you don't remember a monster + but want to try fighting anyway, you can use the `F' command. .hn 2 Your pet .pg *************** *** 1032,1038 **** And if you have proficiency in the ``two weapon combat'' skill, you may wield both primary and secondary weapons simultaneously; use the `#twoweapon' extended command to engage or disengage that. Only ! some types of characters (barbarians, for instance), have the necessary skill available. Even with that skill, using two weapons at once incurs a penalty in the chance to hit your target compared to using just one weapon at a time. --- 1059,1065 ---- And if you have proficiency in the ``two weapon combat'' skill, you may wield both primary and secondary weapons simultaneously; use the `#twoweapon' extended command to engage or disengage that. Only ! some types of characters (barbarians, for instance) have the necessary skill available. Even with that skill, using two weapons at once incurs a penalty in the chance to hit your target compared to using just one weapon at a time. *************** *** 1043,1049 **** other worn items. .pg Those of you in the audience who are AD&D players, be aware that each ! weapon which exists in AD&D does roughly the same damage to monsters in NetHack. Some of the more obscure weapons (such as the \fIaklys\fP, \fIlucern hammer\fP, and \fIbec-de-corbin\fP) are defined in an appendix to \fIUnearthed Arcana\fP, an AD&D supplement. --- 1070,1076 ---- other worn items. .pg Those of you in the audience who are AD&D players, be aware that each ! weapon which existed in AD&D does roughly the same damage to monsters in NetHack. Some of the more obscure weapons (such as the \fIaklys\fP, \fIlucern hammer\fP, and \fIbec-de-corbin\fP) are defined in an appendix to \fIUnearthed Arcana\fP, an AD&D supplement. *************** *** 1073,1095 **** which has NetHack choose another item to automatically fill your quiver when the inventory slot used for `Q' runs out. .pg ! Some characters will throw multiple items in a single action. Rangers, ! for instance, or anyone who achieves a high level of proficiency in ! the relevant weapon skill (in bow skill if you're wielding one to ! shoot arrows, or in sling skill if you're wielding one to shoot stones). ! There is little you can do ! to control this; if NetHack decides that you'll be shooting 3 arrows ! on the current shot, then three arrows will travel in the direction ! you've indicated, even if the first or second succeeds in killing the ! target. You can explicitly limit the number of shots by using a numeric ! prefix before the `t' or `f' command. For example, ``2f'' (or ``n2f'' if using .op number_pad mode) would ensure that at most 2 arrows are shot ! even if NetHack decides that your skill warrants 3. If you specify a larger number than would have been shot (``4f'' in this example), you'll just end up shooting the same number (3, here) as if no limit ! had been specified. .hn 3 Weapon proficiency .pg --- 1100,1125 ---- which has NetHack choose another item to automatically fill your quiver when the inventory slot used for `Q' runs out. .pg ! Some characters have the ability to fire a volley of multiple items in a ! single turn. Knowing how to load several rounds of ammunition at ! once -- or hold several missiles in your hand -- and still hit a ! target is not an easy task. Rangers are among those who are adept ! at this task, as are those with a high level of proficiency in the ! relevant weapon skill (in bow skill if you're wielding one to ! shoot arrows, in crossbow skill if you're wielding one to shoot bolts, ! or in sling skill if you're wielding one to shoot stones). ! The number of items that the character has a chance to fire varies from ! turn to turn. You can explicitly limit the number of shots by using a ! numeric prefix before the `t' or `f' command. For example, ``2f'' (or ``n2f'' if using .op number_pad mode) would ensure that at most 2 arrows are shot ! even if you could have fired 3. If you specify a larger number than would have been shot (``4f'' in this example), you'll just end up shooting the same number (3, here) as if no limit ! had been specified. Once the volley is in motion, all of the items ! will travel in the same direction; if the first ones kill a monster, ! the others can still continue beyond that spot. .hn 3 Weapon proficiency .pg *************** *** 1308,1317 **** energy and the time required in casting. .pg Casting a spell calls forth magical energies and focuses them with ! your naked mind. Releasing the magical energy releases some of your ! memory of the spell with it. Each time you cast a spell, your ! familiarity with it will dwindle, until you eventually forget the ! details completely and must relearn it. .pg Just as weapons are divided into groups in which a character can become proficient (to varying degrees), spells are similarly grouped. --- 1338,1354 ---- energy and the time required in casting. .pg Casting a spell calls forth magical energies and focuses them with ! your naked mind. Some of the magical energy released comes from within ! you, and casting several spells in a row may tire you. ! Casting of spells also requires practice. With practice, your ! skill in each category of spell casting will improve. Over time, however, ! your memory of each spell will dim, and you will need to relearn it. ! .pg ! Some spells are ! directional\(emyou must give a direction in which to cast them. You can also ! cast them at yourself (just give a `.' or `s' for the direction). Be warned, ! however, for this is often unwise. Other spells are nondirectional\(emthey ! don't require a direction. .pg Just as weapons are divided into groups in which a character can become proficient (to varying degrees), spells are similarly grouped. *************** *** 1324,1331 **** of armor may interfere with that. .pg The command to read a spellbook is the same as for scrolls, `r' ! (read). The `+' command lists your current spells and the number of ! spell points they require. The `Z' (cast) command casts a spell. .hn 2 Tools (`(') .pg --- 1361,1369 ---- of armor may interfere with that. .pg The command to read a spellbook is the same as for scrolls, `r' ! (read). The `+' command lists your current spells, their levels, ! categories, and chances for failure. ! The `Z' (cast) command casts a spell. .hn 2 Tools (`(') .pg *************** *** 1536,1549 **** Any line in the configuration file starting with ``OPTIONS='' may be filled out with options in the same syntax as in NETHACKOPTIONS. Any line starting with ``DUNGEON='', ``EFFECTS='', ``MONSTERS='', ! ``OBJECTS='', or ``TRAPS='' is taken as defining the corresponding .op dungeon, .op effects, .op monsters, .op objects - or .op traps option in a different syntax, a sequence of decimal numbers giving the character position in the current font to be used in displaying each entry. --- 1574,1588 ---- Any line in the configuration file starting with ``OPTIONS='' may be filled out with options in the same syntax as in NETHACKOPTIONS. Any line starting with ``DUNGEON='', ``EFFECTS='', ``MONSTERS='', ! ``OBJECTS='', ``TRAPS='', or ``BOULDER='' is taken as defining the corresponding .op dungeon, .op effects, .op monsters, .op objects .op traps + or + .op boulder option in a different syntax, a sequence of decimal numbers giving the character position in the current font to be used in displaying each entry. *************** *** 1565,1570 **** --- 1604,1612 ---- or align:chaotic). You may specify just the first letter. The default is to randomly pick an appropriate alignment. Cannot be set with the `O' command. + .lp autodig + Automatically dig if you are wielding a digging tool and moving into a place + that can be dug (default false). .lp "autopickup " Automatically pick up things onto which you move (default on). .lp "autoquiver " *************** *** 1580,1585 **** --- 1622,1629 ---- display quickly and to read the keyboard (allowing the use of arrow keys to move) on machines with an IBM PC compatible BIOS ROM (default off, OS/2, PC, and ST NetHack only). + .lp boulder + Set the character used to display boulders (default is rock class symbol). .lp catname Name your starting cat (ex. ``catname:Morris''). Cannot be set with the `O' command. *************** *** 1596,1604 **** You may have to turn this off if you have more than 2 GB free space on the partition used for your save and level files. Only applies when MFLOPPY was defined during compilation. - .lp "color " - Use color for different monsters, objects, and dungeon features - (default on for microcomputers). .lp "confirm " Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). --- 1640,1645 ---- *************** *** 1610,1620 **** characters for such terminals, so you should specify it when appropriate even if you override the selections with your own graphics strings. .lp disclose ! Offer to disclose various information when the game ends (default all). ! The possibilities are identifying your inventory ('i'), ! disclosing your attributes ('a'), summarizing monsters that have been ! vanquished ('v'), listing monster species that have been genocided ('g'), ! and displaying your conduct ('c'). Note that the vanquished monsters list includes all monsters killed by traps and each other as well as by you. .lp dogname --- 1651,1690 ---- characters for such terminals, so you should specify it when appropriate even if you override the selections with your own graphics strings. .lp disclose ! Controls options for disclosing various information when the game ends (defaults ! to all possibilities being disclosed). ! The possibilities are: ! .sd ! .si ! i - disclose your inventory. ! a - disclose your attributes. ! v - summarize monsters that have been vanquished. ! g - list monster species that have been genocided. ! c - display your conduct. ! .ei ! .ed ! Each disclosure possibility can optionally be preceded by a prefix which ! let you refine how it behaves. Here are the valid prefixes: ! .sd ! .si ! y - prompt you and default to yes on the prompt. ! n - prompt you and default to no on the prompt. ! + - disclose it without prompting. ! - - do not disclose it and do not prompt. ! .ei ! .ed ! (ex. ``disclose:yi na +v -g -c'') ! The example sets ! .op inventory ! to prompt and default to yes, ! .op attributes ! to prompt and default to no, ! .op vanquished ! to disclose without prompting, ! .op genocided ! to not disclose and not to prompt, ! .op conduct ! to not disclose and not to prompt. Note that the vanquished monsters list includes all monsters killed by traps and each other as well as by you. .lp dogname *************** *** 1680,1690 **** or the present ones rearranged. Cannot be set with the `O' command. - .lp eight_bit_tty - Pass eight-bit character values (for example, specified with the - .op traps - option) straight through to your terminal (default off). Only applies - to the tty port. .lp extmenu Changes the extended commands interface to pop-up a menu of available commands. It is keystroke compatible with the traditional interface except that it does --- 1750,1755 ---- *************** *** 1715,1724 **** off makes just looking at things faster, since you aren't interrupted with the ``More info?'' prompt, but it also means that you might miss some interesting and/or important information. - .lp hilite_pet - Visually distinguish pets from similar animals (default off). - In text windowing, use text highlighting when color is turned off; - with X tiles, display a heart symbol near pets. .lp horsename Name your starting horse (ex. ``horsename:Trigger''). Cannot be set with the `O' command. --- 1780,1785 ---- *************** *** 1737,1743 **** Show corridor squares seen by night vision or a light source held by your character as lit (default off). .lp "mail " ! Enable mail delivery during the game. .lp "male " An obsolete synonym for ``gender:male''. Cannot be set with the `O' command. --- 1798,1804 ---- Show corridor squares seen by night vision or a light source held by your character as lit (default off). .lp "mail " ! Enable mail delivery during the game (default on). .lp "male " An obsolete synonym for ``gender:male''. Cannot be set with the `O' command. *************** *** 1756,1802 **** objects for selection. .lp menu_deselect_all Menu character accelerator to deselect all items in a menu. ! Implemented by the X11 and tty ports. Default '-'. .lp menu_deselect_page Menu character accelerator deselect all items on this page of a menu. ! Implemented only by the tty port. Default '\e'. .lp menu_first_page Menu character accelerator to jump to the first page in a menu. ! Implemented only by the tty port. Default '^'. .lp menu_invert_all Menu character accelerator to invert all items in a menu. ! Implemented by the X11 and tty ports. Default '@'. .lp menu_invert_page Menu character accelerator to invert all items on this page of a menu. ! Implemented only by the tty port. Default '~'. .lp menu_last_page Menu character accelerator to jump to the last page in a menu. ! Implemented only by the tty port. Default '|'. .lp menu_next_page Menu character accelerator to goto the next menu page. ! Implemented only by the tty port. Default '>'. .lp menu_previous_page Menu character accelerator to goto the previous menu page. ! Implemented only by the tty port. Default '<'. .lp menu_search Menu character accelerator to search for a menu item. ! Implemented only by the X11 port. Default ':'. .lp menu_select_all Menu character accelerator to select all items in a menu. ! Implemented by the X11 and tty ports. Default '.'. .lp menu_select_page Menu character accelerator to select all items on this page of a menu. ! Implemented only by the tty port. Default ','. .lp monsters Set the characters used to display monster classes (default --- 1817,1863 ---- objects for selection. .lp menu_deselect_all Menu character accelerator to deselect all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default '-'. .lp menu_deselect_page Menu character accelerator deselect all items on this page of a menu. ! Implemented by the Amiga, Gem and tty ports. Default '\e'. .lp menu_first_page Menu character accelerator to jump to the first page in a menu. ! Implemented by the Amiga, Gem and tty ports. Default '^'. .lp menu_invert_all Menu character accelerator to invert all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default '@'. .lp menu_invert_page Menu character accelerator to invert all items on this page of a menu. ! Implemented by the Amiga, Gem and tty ports. Default '~'. .lp menu_last_page Menu character accelerator to jump to the last page in a menu. ! Implemented by the Amiga, Gem and tty ports. Default '|'. .lp menu_next_page Menu character accelerator to goto the next menu page. ! Implemented by the Amiga, Gem and tty ports. Default '>'. .lp menu_previous_page Menu character accelerator to goto the previous menu page. ! Implemented by the Amiga, Gem and tty ports. Default '<'. .lp menu_search Menu character accelerator to search for a menu item. ! Implemented by the Amiga, Gem and X11 ports. Default ':'. .lp menu_select_all Menu character accelerator to select all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default '.'. .lp menu_select_page Menu character accelerator to select all items on this page of a menu. ! Implemented by the Amiga, Gem and tty ports. Default ','. .lp monsters Set the characters used to display monster classes (default *************** *** 1830,1835 **** --- 1891,1899 ---- .lp msghistory The number of top line messages to save (and recall with ^P) (default 20). Cannot be set with the `O' command. + .lp msg_window + Use a screen-size window to show the previous messages with ^P instead of + showing them one at a time. (Currently implemented for tty only.) .lp "name " Set your character's name (defaults to your user name). You can also set your character's role by appending a dash and one or more letters of *************** *** 1868,1874 **** makes sense for windowing system interfaces that implement this feature. .lp pettype Specify the type of your initial pet, if you are playing a character class ! that uses multiple types of pets. Possible values are ``cat'' and ``dog''. Cannot be set with the `O' command. .lp pickup_burden When you pick up an item that would exceed this encumbrance --- 1932,1939 ---- makes sense for windowing system interfaces that implement this feature. .lp pettype Specify the type of your initial pet, if you are playing a character class ! that uses multiple types of pets; or choose to have no initial pet at all. ! Possible values are ``cat'', ``dog'' and ``none''. Cannot be set with the `O' command. .lp pickup_burden When you pick up an item that would exceed this encumbrance *************** *** 1881,1891 **** is on. Default is all types. .lp prayconfirm Prompt for confirmation before praying (default on). - .lp preload_tiles - For the protected mode MSDOS version, control whether tiles - get pre-loaded into RAM at the start of the game. Doing so - enhances performance of the tile graphics, but uses more memory. (default on). - Cannot be set with the `O' command. .lp pushweapon Using the `w' (wield) command when already wielding something pushes the old item into your secondary weapon slot (default off). --- 1946,1951 ---- *************** *** 1919,1924 **** --- 1979,1987 ---- Suppress terminal beeps (default on). .lp sortpack Sort the pack contents by type when displaying inventory (default on). + .lp sparkle + Display a sparkly effect when a monster (including yourself) is hit by an + attack to which it is resistant (default on). .lp standout Boldface monsters and ``\fB--More--\fP'' (default off). .lp suppress_alert *************** *** 1978,1983 **** --- 2041,2135 ---- (default depends on version). Cannot be set with the `O' command. .hn 2 + Window Port Customization options + .pg + Here are explanations of the various options that are + used to customize and change the characteristics of the + windowtype that you have chosen. + Character strings that are too long may be truncated. + Not all window ports will adjust for all settings listed + here. You can safely add any of these options to your config + file, and if the window port is capable of adjusting to + suit your preferences, it will attempt to do so. If it + can't it will silently ignore it. You can find out if an + option is supported by the window port that you are currently + using by checking to see if it shows up in the Options list. + Some options are dynamic and can be specified during the game + with the `O' command. + .lp align_message + Where to align or place the message window (top, bottom, left, or right) + .lp align_status + Where to align or place the status window (top, bottom, left, or right). + .lp ascii_map + NetHack should display an ascii character map if it can. + .lp color + NetHack should display color if it can for different monsters, + objects, and dungeon features + .lp eight_bit_tty + NetHack should pass eight-bit character values (for example, specified with the + .op traps + option) straight through to your terminal (default off). + .lp font_map + NetHack should use a font by the chosen name for the map window. + .lp font_menu + NetHack should use a font by the chosen name for menu windows. + .lp font_message + NetHack should use a font by the chosen name for the message window. + .lp font_status + NetHack should use a font by the chosen name for the status window. + .lp font_text + NetHack should use a font by the chosen name for text windows. + .lp font_size_map + NetHack should use this size font for the map window. + .lp font_size_menu + NetHack should use this size font for menu windows. + .lp font_size_message + NetHack should use this size font for the message window. + .lp font_size_status + NetHack should use this size font for the status window. + .lp font_size_text + NetHack should use this size font for text windows. + .lp hilite_pet + Visually distinguish pets from similar animals (default off). + The behavior of this option depends on the type of windowing you use. + In text windowing, text highlighting or inverse video is often used; + with tiles, generally displays a heart symbol near pets. + .lp large_font + NetHack should use a large font. + .lp map_mode + NetHack should display the map in the manner specified. + .lp player_selection + NetHack should pop up dialog boxes, or use prompts for character selection. + .lp popup_dialog + NetHack should pop up dialog boxes for input. + .lp preload_tiles + NetHack should preload tiles into memory. + For example, in the protected mode MSDOS version, control whether tiles + get pre-loaded into RAM at the start of the game. Doing so + enhances performance of the tile graphics, but uses more memory. (default on). + Cannot be set with the `O' command. + .lp scroll_margin + NetHack should scroll the display when the hero or cursor + is this number of cells away from the edge of the window. + .lp splash_screen + NetHack should display an opening splash screen when it starts up (default yes). + .lp tiled_map + NetHack should display a tiled map if it can. + .lp tile_file + Specify the name of an alternative tile file to override the default. + .lp tile_height + Specify the preferred height of each tile in a tile capable port. + .lp tile_width + Specify the preferred width of each tile in a tile capable port + .lp use_inverse + NetHack should display inverse when the game specifies it. + .lp vary_msgcount + NetHack should display this number of messages at a time in + the message window. + .lp windowcolors + NetHack should display windows with the specified foreground/background + colors if it can. + .hn 2 Configuring NetHack for Play by the Blind .pg NetHack can be set up to use only standard ASCII characters for making *************** *** 2010,2018 **** Disable IBMgraphics by commenting out this option. .lp menustyle:traditional This will assist in the interface to speech synthesizers. ! .lp \!number_pad A lot of speech access programs use the number-pad to review the screen. ! If this is the case, turn off the number_pad option and use the traditional Rogue-like commands. .lp "Character graphics" Comment out all character graphics sets found near the bottom of the --- 2162,2170 ---- Disable IBMgraphics by commenting out this option. .lp menustyle:traditional This will assist in the interface to speech synthesizers. ! .lp number_pad A lot of speech access programs use the number-pad to review the screen. ! If this is the case, disable the number_pad option and use the traditional Rogue-like commands. .lp "Character graphics" Comment out all character graphics sets found near the bottom of the *************** *** 2182,2211 **** Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. .pg ! The 3.3 development team consisted of \fBMichael Allison\fP, \fBKen Arromdee\fP, ! \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, \fBKevin Darcy\fP, \fBTimo Hakulinen\fP, ! \fBKevin Hugo\fP, \fBSteve Linhart\fP, \fBDean Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike ! Stephenson\fP, \fBJanet Walz\fP, and \fBPaul Winner\fP. .pg ! As with version 3.2, various people contributed to the game as a whole as well as supporting ports on the different platforms that NetHack runs on: .pg ! \fBPat Rankin\fP maintained 3.3 for VMS. .pg ! \fBMichael Allison\fP maintained NetHack 3.3 for the MS-DOS platform. \fBPaul Winner\fP and \fBYitzhak Sapir\fP provided encouragement. .pg \fBDean Luick\fP, \fBMark Modrall\fP, and \fBKevin Hugo\fP maintained and enhanced the ! Macintosh port of 3.3. .pg ! \fBMichael Allison\fP maintained and enhanced 3.3 for the Microsoft Windows NT platform. .pg ! \fBRon Van Iwaarden\fP took over responsibility for the OS/2 port. .pg ! The Amiga port of NetHack was resurrected for 3.3.1 by \fBJanne Salmijarvi\fP. .pg ! The Atari port of NetHack was resurrected for 3.3.1 by \fBChristian ``Marvin'' ! Bressler\fP. .pg - - - - - - - - - - .pg --- 2334,2392 ---- Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. .pg ! The final update to 3.2 was the bug fix release 3.2.3, which was released ! simultaneously with 3.3.0 in December 1999 just in time for the Year 2000. .pg ! The 3.3 development team, consisting of \fBMichael Allison\fP, \fBKen Arromdee\fP, ! \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, \fBKevin Darcy\fP, ! \fBTimo Hakulinen\fP, \fBKevin Hugo\fP, \fBSteve Linhart\fP, \fBKen Lorber\fP, ! \fBDean Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike Stephenson\fP, ! \fBJanet Walz\fP, and \fBPaul Winner\fP, released 3.3.0 in ! December 1999 and 3.3.1 in August of 2000. ! .pg ! Version 3.3 offered many firsts. It was the first version to separate race ! and profession. The Elf class was removed in preference to an elf race, ! and the races of dwarves, gnomes, and orcs made their first appearance in ! the game alongside the familiar human race. Monk and Ranger roles joined ! Archeologists, Barbarians, Cavemen, Healers, Knights, Priests, Rogues, Samurai, ! Tourists, Valkyries and of course, Wizards. It was also the first version ! to allow you to ride a steed, and was the first version to have a publicly ! available web-site listing all the bugs that had been discovered. Despite ! that constantly growing bug list, 3.3 proved stable enough to last for ! more than a year and a half. ! .pg ! The 3.4 development team initially consisted of ! \fBMichael Allison\fP, \fBKen Arromdee\fP, ! \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBKevin Hugo\fP, \fBKen Lorber\fP, ! \fBDean Luick\fP, \fBPat Rankin\fP, \fBMike Stephenson\fP, ! \fBJanet Walz\fP, and \fBPaul Winner\fP, with \fB Warwick Allison\fP joining ! just before the release of NetHack 3.4.0 in March 2002. ! .pg ! As with version 3.3, various people contributed to the game as a whole as well as supporting ports on the different platforms that NetHack runs on: .pg ! \fBPat Rankin\fP maintained 3.4 for VMS. .pg ! \fBMichael Allison\fP maintained NetHack 3.4 for the MS-DOS platform. \fBPaul Winner\fP and \fBYitzhak Sapir\fP provided encouragement. .pg \fBDean Luick\fP, \fBMark Modrall\fP, and \fBKevin Hugo\fP maintained and enhanced the ! Macintosh port of 3.4. ! .pg ! \fBMichael Allison\fP, \fBDavid Cohrs\fP, \fBAlex Kompel\fP, \fBDion Nicolaas\fP, and ! \fBYitzhak Sapir\fP maintained and enhanced 3.4 for the Microsoft Windows platform. ! \fBAlex Kompel\fP contributed a new graphical interface for the Windows port. .pg ! \fBRon Van Iwaarden\fP maintained 3.4 for OS/2. .pg ! \fBJanne Salmijarvi\fP and \fBTeemu Suikki\fP maintained and ! enhanced the Amiga port of 3.4 after \fBJanne Salmijarvi\fP resurrected ! it for 3.3.1. .pg ! \fBChristian ``Marvin'' Bressler\fP maintained 3.4 for the Atari after he ! resurrected it for 3.3.1. .pg ! There is a NetHack web site maintained by \fBKen Lorber\fP at http://www.nethack.org/. .pg - - - - - - - - - - .pg *************** *** 2219,2249 **** center; c c c. .\"TABLE_START ! Adam Aronow Irina Rempt-Drijfhout Mike Gallop ! Andy Church Izchak Miller Mike Passaretti ! Andy Swanson Janet Walz Mike Stephenson ! Ari Huttunen Janne Salmijarvi Norm Meluch ! Barton House Jean-Christophe Collet Olaf Seibert ! Benson I. Margulies Jochen Erwied Pat Rankin ! Bill Dyer John Kallen Paul Winner ! Boudewijn Waijers John Rupley Pierre Martineau ! Bruce Cox John S. Bien Ralf Brown ! Bruce Holloway Johnny Lee Richard Addison ! Bruce Mewborne Jon W{tte Richard Beigel ! Carl Schelin Jonathan Handler Richard P. Hughey ! Chris Russo Joshua Delahunty Rob Menke ! David Cohrs Keizo Yamamoto Robin Johnson ! David Damerell Ken Arromdee Roland McGrath ! David Gentzel Ken Lorber Ron Van Iwaarden ! David Hairston Ken Washikita Ronnen Miller ! Dean Luick Kevin Darcy Ross Brown ! Del Lamb Kevin Hugo Sascha Wostmann ! Deron Meranda Kevin Sitze Scott R. Turner ! Dylan O'Donnell Kevin Smolkowski Stephen Spackman ! Eric Backus Kevin Sweet Stephen White ! Eric Hendrickson Lars Huttar Steve Creps ! Eric R. Smith Mark Gooderum Steve Linhart ! Eric S. Raymond Mark Modrall Steve VanDevender Erik Andersen Marvin Bressler Tim Lennan Frederick Roeber Matthew Day Timo Hakulinen Gil Neiger Merlyn LeRoy Tom Almy --- 2400,2433 ---- center; c c c. .\"TABLE_START ! Adam Aronow Helge Hafting Mike Engber ! Alex Kompel Irina Rempt-Drijfhout Mike Gallop ! Andreas Dorn Izchak Miller Mike Passaretti ! Andy Church J. Ali Harlow Mike Stephenson ! Andy Swanson Janet Walz Norm Meluch ! Ari Huttunen Janne Salmijarvi Olaf Seibert ! Barton House Jean-Christophe Collet Pat Rankin ! Benson I. Margulies Jochen Erwied Paul Winner ! Bill Dyer John Kallen Pierre Martineau ! Boudewijn Waijers John Rupley Ralf Brown ! Bruce Cox John S. Bien Richard Addison ! Bruce Holloway Johnny Lee Richard Beigel ! Bruce Mewborne Jon W{tte Richard P. Hughey ! Carl Schelin Jonathan Handler Rob Menke ! Chris Russo Joshua Delahunty Robin Johnson ! David Cohrs Keizo Yamamoto Roland McGrath ! David Damerell Ken Arnold Ron Van Iwaarden ! David Gentzel Ken Arromdee Ronnen Miller ! David Hairston Ken Lorber Ross Brown ! Dean Luick Ken Washikita Sascha Wostmann ! Del Lamb Kevin Darcy Scott Bigham ! Deron Meranda Kevin Hugo Scott R. Turner ! Dion Nicolaas Kevin Sitze Stephen Spackman ! Dylan O'Donnell Kevin Smolkowski Stephen White ! Eric Backus Kevin Sweet Steve Creps ! Eric Hendrickson Lars Huttar Steve Linhart ! Eric R. Smith Mark Gooderum Steve VanDevender ! Eric S. Raymond Mark Modrall Teemu Suikki Erik Andersen Marvin Bressler Tim Lennan Frederick Roeber Matthew Day Timo Hakulinen Gil Neiger Merlyn LeRoy Tom Almy *************** *** 2251,2257 **** Greg Olson Michael Feir Warren Cheung Gregg Wonderly Michael Hamel Warwick Allison Hao-yang Wang Michael Sokolov Yitzhak Sapir - Helge Hafting Mike Engber .\"TABLE_END Do not delete this line. .TE .ed --- 2435,2440 ---- *** nethack-3.3.1/doc/Guidebook.tex Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/doc/Guidebook.tex Thu Mar 21 07:37:36 2002 *************** *** 34,45 **** %.mt \title{\LARGE A Guide to the Mazes of Menace:\\ ! \Large Guidebook for {\it NetHack\/} 3.3} %.au \author{Eric S. Raymond\\ ! (Extensively edited and expanded for 3.0 by Mike Threepoint)} ! \date{August 2, 2000} \maketitle --- 34,45 ---- %.mt \title{\LARGE A Guide to the Mazes of Menace:\\ ! \Large Guidebook for {\it NetHack\/}} %.au \author{Eric S. Raymond\\ ! (Extensively edited and expanded for 3.4)} ! \date{March 20, 2002} \maketitle *************** *** 274,279 **** --- 274,280 ---- understand what {\it NetHack\/} is doing with the screen. The {\it NetHack\/} screen replaces the ``You see \ldots'' descriptions of text adventure games. Figure 1 is a sample of what a {\it NetHack\/} screen might look like. + The way the screen looks for you depends on your platform. \vbox{ \begin{verbatim} *************** *** 288,294 **** ! Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak \end{verbatim} \begin{center} --- 289,295 ---- ! Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak \end{verbatim} \begin{center} *************** *** 315,322 **** %.lp \item[\bb{Strength}] A measure of your character's strength; one of your six basic ! attributes. Your attributes can range from 3 to 18 inclusive ! (occasionally you may get super-strengths of the form 18/xx). The higher your strength, the stronger you are. Strength affects how successfully you perform physical tasks, how much damage you do in combat, and how much loot you can carry. --- 316,325 ---- %.lp \item[\bb{Strength}] A measure of your character's strength; one of your six basic ! attributes. A human character's attributes can range from 3 to 18 inclusive; ! non-humans may exceed these limits ! (occasionally you may get super-strengths of the form 18/xx, and magic can ! also cause attributes to exceed the normal limits). The higher your strength, the stronger you are. Strength affects how successfully you perform physical tasks, how much damage you do in combat, and how much loot you can carry. *************** *** 503,508 **** --- 506,516 ---- Letters and certain other symbols represent the various inhabitants of the Mazes of Menace. Watch out, they can be nasty and vicious. Sometimes, however, they can be helpful. + %.lp + \item[\tb{I}] + This marks the last known location of an invisible or otherwise unseen + monster. Note that the monster could have moved. The `F' and `m' commands + may be useful here. \elist %.pg *************** *** 581,593 **** Tell what a command does. %.lp \item[\tb{<}] ! Go up to the previous level (if you are on the staircase or ladder). %.lp \item[\tb{>}] ! Go down to the next level (if you are on the staircase or ladder). %.lp \item[\tb{[yuhjklbn]}] ! Go one step in the direction indicated (see Figure 2). If you can sense a monster there, you will fight the monster instead. Only these one-step movement commands cause you to fight monsters; the others (below) are ``safe.'' --- 589,602 ---- Tell what a command does. %.lp \item[\tb{<}] ! Go up to the previous level (if you are on a staircase or ladder). %.lp \item[\tb{>}] ! Go down to the next level (if you are on a staircase or ladder). %.lp \item[\tb{[yuhjklbn]}] ! Go one step in the direction indicated (see Figure 2). If you sense ! or remember a monster there, you will fight the monster instead. Only these one-step movement commands cause you to fight monsters; the others (below) are ``safe.'' *************** *** 627,632 **** --- 636,647 ---- Prefix: Same as `{\tt g}', but forking of corridors is not considered interesting. %.lp + \item[\tb{_}] + Travel to a map location via a shortest-path algorithm. Stops on most of + the same conditions as the `G' command does. For ports with mouse + support, the command is also invoked when a mouse-click takes place on a + location further than 1 cell away from the current position. + %.lp \item[\tb{.}] Rest, do nothing for one turn. %.lp *************** *** 797,803 **** Zap a wand. To aim at yourself, use `{\tt .}' for the direction. %.lp \item[\tb{Z}] ! Zap (cast) a spell. %.lp \item[\tb{\^{}Z}] Suspend the game (UNIX versions with job control only). --- 812,818 ---- Zap a wand. To aim at yourself, use `{\tt .}' for the direction. %.lp \item[\tb{Z}] ! Zap (cast) a spell. To cast at yourself, use `{\tt .}' for the direction. %.lp \item[\tb{\^{}Z}] Suspend the game (UNIX versions with job control only). *************** *** 868,874 **** Talk to someone. %.lp \item[\tb{\#conduct}] ! List which challenges you have adhered to. %.lp \item[\tb{\#dip}] Dip an object into something. --- 883,890 ---- Talk to someone. %.lp \item[\tb{\#conduct}] ! List which challenges you have adhered to. See the section below entitled ! ``Conduct'' for details. %.lp \item[\tb{\#dip}] Dip an object into something. *************** *** 908,914 **** Ride (or stop riding) a monster. %.lp \item[\tb{\#rub}] ! Rub a lamp. %.lp \item[\tb{\#sit}] Sit down. --- 924,930 ---- Ride (or stop riding) a monster. %.lp \item[\tb{\#rub}] ! Rub a lamp or a stone. %.lp \item[\tb{\#sit}] Sit down. *************** *** 945,953 **** In {\it NT, OS/2, {\rm and} PC NetHack}, the `Alt' key can be used in this fashion. \blist{} %.lp \item[\tb{M-2}] ! {\tt\#twoweapon} %.lp \item[\tb{M-a}] {\tt\#adjust} --- 961,972 ---- In {\it NT, OS/2, {\rm and} PC NetHack}, the `Alt' key can be used in this fashion. \blist{} + %.lp + \item[\tb{M-?}] + {\tt\#?} (not supported by all platforms) %.lp \item[\tb{M-2}] ! {\tt\#twoweapon} (unless the {\it number\_pad\/} option is enabled) %.lp \item[\tb{M-a}] {\tt\#adjust} *************** *** 1011,1016 **** --- 1030,1038 ---- \nd If the {\it number\_pad\/} option is on, some additional letter commands are available: \blist{} + %.lp + \item[\tb{h}] + Help menu: display one of several help texts available, like ``{\tt ?}''. %.lp \item[\tb{j}] Jump to another location. Same as ``{\tt \#jump}'' or ``{\tt M-j}''. *************** *** 1023,1029 **** from a horse standing next to you. Same as ``{\tt \#loot}'' or ``{\tt M-l}''. %.lp \item[\tb{N}] ! Name an object or type of object. Same as ``{\tt \#name}'' or ``{\tt M-N}''. %.lp \item[\tb{u}] Untrap a trap, door, or chest. Same as ``{\tt \#untrap}'' or ``{\tt M-u}''. --- 1045,1051 ---- from a horse standing next to you. Same as ``{\tt \#loot}'' or ``{\tt M-l}''. %.lp \item[\tb{N}] ! Name an object or type of object. Same as ``{\tt \#name}'' or ``{\tt M-n}''. %.lp \item[\tb{u}] Untrap a trap, door, or chest. Same as ``{\tt \#untrap}'' or ``{\tt M-u}''. *************** *** 1160,1165 **** --- 1182,1197 ---- you attack them. Some of them are very dangerous when angered. Remember: discretion is the better part of valor. + %.pg + If you can't see a monster (if it is invisible, or if you are blinded), + the symbol `I' will be shown when you learn of its presence. + If you attempt to walk into it, you will try to fight it just like + a monster that you can see; of course, + if the monster has moved, you will attack empty air. If you guess + that the monster has moved and you don't wish to fight, you can use the `m' + command to move without fighting; likewise, if you don't remember a monster + but want to try fighting anyway, you can use the `F' command. + %.hn 2 \subsection*{Your pet} *************** *** 1344,1350 **** And if you have proficiency in the ``two weapon combat'' skill, you may wield both primary and secondary weapons simultaneously; use the `{\tt \#twoweapon}' extended command to engage or disengage that. Only ! some types of characters (barbarians, for instance), have the necessary skill available. Even with that skill, using two weapons at once incurs a penalty in the chance to hit your target compared to using just one weapon at a time. --- 1376,1382 ---- And if you have proficiency in the ``two weapon combat'' skill, you may wield both primary and secondary weapons simultaneously; use the `{\tt \#twoweapon}' extended command to engage or disengage that. Only ! some types of characters (barbarians, for instance) have the necessary skill available. Even with that skill, using two weapons at once incurs a penalty in the chance to hit your target compared to using just one weapon at a time. *************** *** 1357,1363 **** %.pg Those of you in the audience who are AD\&D players, be aware that each ! weapon which exists in AD\&D does roughly the same damage to monsters in {\it NetHack}. Some of the more obscure weapons (such as the % {\it aklys}, {\it lucern hammer}, and {\it bec-de-corbin\/}) are defined in an appendix to {\it Unearthed Arcana}, an AD\&D supplement. --- 1389,1395 ---- %.pg Those of you in the audience who are AD\&D players, be aware that each ! weapon which existed in AD\&D does roughly the same damage to monsters in {\it NetHack}. Some of the more obscure weapons (such as the % {\it aklys}, {\it lucern hammer}, and {\it bec-de-corbin\/}) are defined in an appendix to {\it Unearthed Arcana}, an AD\&D supplement. *************** *** 1392,1414 **** quiver when the inventory slot used for `{\tt Q}' runs out. %.pg ! Some characters will throw multiple items in a single action. Rangers, ! for instance, or anyone who achieves a high level of proficiency in ! the relevant weapon skill (in bow skill if you're wielding one to ! shoot arrows, or in sling skill if you're wielding one to shoot stones). ! There is little you can do ! to control this; if {\it NetHack\/} decides that you'll be shooting 3 arrows ! on the current shot, then three arrows will travel in the direction ! you've indicated, even if the first or second succeeds in killing the ! target. You can explicitly limit the number of shots by using a numeric ! prefix before the `{\tt t}' or `{\tt f}' command. For example, ``{\tt 2f}'' (or ``{\tt n2f}'' if using {\it number\_pad\/} mode) would ensure that at most 2 arrows are shot ! even if {\it NetHack\/} decides that your skill warrants 3. If you specify a larger number than would have been shot (``{\tt 4f}'' in this example), you'll just end up shooting the same number (3, here) as if no limit ! had been specified. %.hn 3 \subsection*{Weapon proficiency} --- 1424,1449 ---- quiver when the inventory slot used for `{\tt Q}' runs out. %.pg ! Some characters have the ability to fire a volley of multiple items in a ! single turn. Knowing how to load several rounds of ammunition at ! once---or hold several missiles in your hand---and still hit a ! target is not an easy task. Rangers are among those who are adept ! at this task, as are those with a high level of proficiency in the ! relevant weapon skill (in bow skill if you're wielding one to ! shoot arrows, in crossbow skill if you're wielding one to shoot bolts, ! or in sling skill if you're wielding one to shoot stones). ! The number of items that the character has a chance to fire varies from ! turn to turn. You can explicitly limit the number of shots by using a ! numeric prefix before the `{\tt t}' or `{\tt f}' command. For example, ``{\tt 2f}'' (or ``{\tt n2f}'' if using {\it number\_pad\/} mode) would ensure that at most 2 arrows are shot ! even if you could have fired 3. If you specify a larger number than would have been shot (``{\tt 4f}'' in this example), you'll just end up shooting the same number (3, here) as if no limit ! had been specified. Once the volley is in motion, all of the items ! will travel in the same direction; if the first ones kill a monster, ! the others can still continue beyond that spot. %.hn 3 \subsection*{Weapon proficiency} *************** *** 1663,1672 **** %.pg Casting a spell calls forth magical energies and focuses them with ! your naked mind. Releasing the magical energy releases some of your ! memory of the spell with it. Each time you cast a spell, your ! familiarity with it will dwindle, until you eventually forget the ! details completely and must relearn it. %.pg Just as weapons are divided into groups in which a character can become --- 1698,1715 ---- %.pg Casting a spell calls forth magical energies and focuses them with ! your naked mind. Some of the magical energy released comes from within ! you, and casting several spells in a row may tire you. ! Casting of spells also requires practice. With practice, your ! skill in each category of spell casting will improve. Over time, however, ! your memory of each spell will dim, and you will need to relearn it. ! ! %.pg ! Some spells are ! directional---you must give a direction in which to cast them. You can also ! cast them at yourself (just give a `{\tt .}' or `{\tt s}' for the direction). ! Be warned, however, for this is often unwise. Other spells are ! nondirectional---they don't require a direction. %.pg Just as weapons are divided into groups in which a character can become *************** *** 1682,1689 **** %.pg The command to read a spellbook is the same as for scrolls, `{\tt r}' ! (read). The `{\tt +}' command lists your current spells and the number of ! spell points they require. The `{\tt Z}' (cast) command casts a spell. %.hn 2 \subsection*{Tools (`{\tt (}')} --- 1725,1733 ---- %.pg The command to read a spellbook is the same as for scrolls, `{\tt r}' ! (read). The `{\tt +}' command lists your current spells, their levels, ! categories, and chances for failure. ! The `{\tt Z}' (cast) command casts a spell. %.hn 2 \subsection*{Tools (`{\tt (}')} *************** *** 1940,1949 **** Any line in the configuration file starting with ``{\tt OPTIONS=}'' may be filled out with options in the same syntax as in NETHACKOPTIONS. Any line starting with ``{\tt DUNGEON=}'', ``{\tt EFFECTS=}'', ! ``{\tt MONSTERS=}'', ``{\tt OBJECTS=}'', or ``{\tt TRAPS=}'' is taken as defining the corresponding {\it dungeon}, ! {\it effects}, {\it monsters}, {\it objects}, or ! {\it traps\/} option in a different syntax, a sequence of decimal numbers giving the character position in the current font to be used in displaying each entry. Such a sequence can be continued to multiple lines by putting a --- 1984,1994 ---- Any line in the configuration file starting with ``{\tt OPTIONS=}'' may be filled out with options in the same syntax as in NETHACKOPTIONS. Any line starting with ``{\tt DUNGEON=}'', ``{\tt EFFECTS=}'', ! ``{\tt MONSTERS=}'', ``{\tt OBJECTS=}'', ``{\tt TRAPS=}'', ! or ``{\tt BOULDER=}'' is taken as defining the corresponding {\it dungeon}, ! {\it effects}, {\it monsters}, {\it objects}, {\it traps\/} or ! {\it boulder\/} option in a different syntax, a sequence of decimal numbers giving the character position in the current font to be used in displaying each entry. Such a sequence can be continued to multiple lines by putting a *************** *** 1971,1976 **** --- 2016,2025 ---- The default is to randomly pick an appropriate alignment. Cannot be set with the `{\tt O}' command. %.lp + \item[\ib{autodig}] + Automatically dig if you are wielding a digging tool and moving into a place + that can be dug (default false). + %.lp \item[\ib{autopickup}] Automatically pick up things onto which you move (default on). %.Ip *************** *** 1988,1993 **** --- 2037,2045 ---- (allowing the use of arrow keys to move) on machines with an IBM PC compatible BIOS ROM (default off, {\it OS/2, PC\/ {\rm and} ST NetHack\/} only). %.lp + \item[\ib{boulder}] + Set the character used to display boulders (default is rock class symbol). + %.lp \item[\ib{catname}] Name your starting cat (ex.\ ``{\tt catname:Morris}''). Cannot be set with the `{\tt O}' command. *************** *** 2008,2017 **** on the partition used for your save and level files. Only applies when MFLOPPY was defined during compilation. %.lp - \item[\ib{color}] - Use color for different monsters, objects, and dungeon features - (default on for microcomputers). - %.lp \item[\ib{confirm}] Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). --- 2060,2065 ---- *************** *** 2025,2037 **** even if you override the selections with your own graphics strings. %.lp \item[\ib{disclose}] ! Offer to disclose various information when the game ends (default all). ! The possibilities are identifying your inventory (`{\tt i}'), ! disclosing your attributes (`{\tt a}'), summarizing monsters that have been ! vanquished (`{\tt v}'), listing monster species that have been ! genocided (`{\tt g}'), and displaying your conduct (`{\tt c}'). Note that the vanquished monsters list includes all monsters killed by ! traps and each other as well as by you. %.lp \item[\ib{dogname}] Name your starting dog (ex.\ ``{\tt dogname:Fang}''). --- 2073,2112 ---- even if you override the selections with your own graphics strings. %.lp \item[\ib{disclose}] ! Controls options for disclosing various information when the game ends (defaults ! to all possibilities being disclosed). ! The possibilities are: ! ! %.sd ! %.si ! {\tt i} --- disclose your inventory.\\ ! {\tt a} --- disclose your attributes.\\ ! {\tt v} --- summarize monsters that have been vanquished.\\ ! {\tt g} --- list monster species that have been genocided.\\ ! {\tt c} --- display your conduct. ! %.ei ! %.ed ! ! Each disclosure possibility can optionally be preceded by a prefix which ! let you refine how it behaves. Here are the valid prefixes: ! ! %.sd ! %.si ! {\tt y} --- prompt you and default to yes on the prompt.\\ ! {\tt n} --- prompt you and default to no on the prompt.\\ ! {\tt +} --- disclose it without prompting.\\ ! {\tt -} --- do not disclose it and do not prompt. ! %.ei ! %.ed ! ! (ex.\ ``{\tt disclose:yi na +v -g -c}'') ! The example sets {\it inventory\/} to {\it prompt\/} and default to {\it yes\/}, ! {\it attributes\/} to {\it prompt\/} and default to {\it no\/}, ! {\it vanquished\/} to {\it disclose without prompting\/}, ! {\it genocided\/} to {\it not disclose\/} and not to {\it prompt\/}, and ! {\it conduct\/} to {\it not disclose\/} and not to {\it prompt\/}. Note that the vanquished monsters list includes all monsters killed by ! traps and each other as well as by you. %.lp \item[\ib{dogname}] Name your starting dog (ex.\ ``{\tt dogname:Fang}''). *************** *** 2095,2105 **** Cannot be set with the `{\tt O}' command. %.lp - \item[\ib{eight\_bit\_tty}] - Pass eight-bit character values (for example, specified with the {\it - traps \/} option) straight through to your terminal (default off). - Only applies to the tty port. - %.lp \item[\ib{extmenu}] Changes the extended commands interface to pop-up a menu of available commands. It is keystroke compatible with the traditional interface except that it does --- 2170,2175 ---- *************** *** 2136,2146 **** interrupted with the ``{\tt More info?}'' prompt, but it also means that you might miss some interesting and/or important information. %.lp - \item[\ib{hilite\_pet}] - Visually distinguish pets from similar animals (default off). - In text windowing, use text highlighting when color is turned off; - with X tiles, display a heart symbol near pets. - %.lp \item[\ib{horsename}] Name your starting horse (ex.\ ``{\tt horsename:Trigger}''). Cannot be set with the `{\tt O}' command. --- 2206,2211 ---- *************** *** 2164,2170 **** character as lit (default off). %.lp \item[\ib{mail}] ! Enable mail delivery during the game. %.lp \item[\ib{male}] An obsolete synonym for ``{\tt gender:male}''. Cannot be set with the --- 2229,2235 ---- character as lit (default off). %.lp \item[\ib{mail}] ! Enable mail delivery during the game (default on). %.lp \item[\ib{male}] An obsolete synonym for ``{\tt gender:male}''. Cannot be set with the *************** *** 2185,2231 **** objects for selection. \item[\ib{menu\_deselect\_all}] Menu character accelerator to deselect all items in a menu. ! Implemented by the X11 and tty ports. Default `-'. \item[\ib{menu\_deselect\_page}] Menu character accelerator deselect all items on this page of a menu. ! Implemented only by the tty port. Default `\verb+\+'. \item[\ib{menu\_first\_page}] Menu character accelerator to jump to the first page in a menu. ! Implemented only by the tty port. Default `\verb+^+'. \item[\ib{menu\_invert\_all}] Menu character accelerator to invert all items in a menu. ! Implemented by the X11 and tty ports. Default `@'. \item[\ib{menu\_invert\_page}] Menu character accelerator to invert all items on this page of a menu. ! Implemented only by the tty port. Default `\verb+~+'. \item[\ib{menu\_last\_page}] Menu character accelerator to jump to the last page in a menu. ! Implemented only by the tty port. Default `\verb+|+'. \item[\ib{menu\_next\_page}] Menu character accelerator to goto the next menu page. ! Implemented only by the tty port. Default `\verb+>+'. \item[\ib{menu\_previous\_page}] Menu character accelerator to goto the previous menu page. ! Implemented only by the tty port. Default `\verb+<+'. \item[\ib{menu\_search}] Menu character accelerator to search for a menu item. ! Implemented only by the X11 port. Default `:'. \item[\ib{menu\_select\_all}] Menu character accelerator to select all items in a menu. ! Implemented by the X11 and tty ports. Default `.'. \item[\ib{menu\_select\_page}] Menu character accelerator to select all items on this page of a menu. ! Implemented only by the tty port. Default `,'. %.lp \item[\ib{monsters}] --- 2250,2296 ---- objects for selection. \item[\ib{menu\_deselect\_all}] Menu character accelerator to deselect all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default `-'. \item[\ib{menu\_deselect\_page}] Menu character accelerator deselect all items on this page of a menu. ! Implemented by the Amiga, Gem and tty ports. Default `\verb+\+'. \item[\ib{menu\_first\_page}] Menu character accelerator to jump to the first page in a menu. ! Implemented by the Amiga, Gem and tty ports. Default `\verb+^+'. \item[\ib{menu\_invert\_all}] Menu character accelerator to invert all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default `@'. \item[\ib{menu\_invert\_page}] Menu character accelerator to invert all items on this page of a menu. ! Implemented by the Amiga, Gem and tty ports. Default `\verb+~+'. \item[\ib{menu\_last\_page}] Menu character accelerator to jump to the last page in a menu. ! Implemented by the Amiga, Gem and tty ports. Default `\verb+|+'. \item[\ib{menu\_next\_page}] Menu character accelerator to goto the next menu page. ! Implemented by the Amiga, Gem and tty ports. Default `\verb+>+'. \item[\ib{menu\_previous\_page}] Menu character accelerator to goto the previous menu page. ! Implemented by the Amiga, Gem and tty ports. Default `\verb+<+'. \item[\ib{menu\_search}] Menu character accelerator to search for a menu item. ! Implemented by the Amiga, Gem and X11 ports. Default `:'. \item[\ib{menu\_select\_all}] Menu character accelerator to select all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default `.'. \item[\ib{menu\_select\_page}] Menu character accelerator to select all items on this page of a menu. ! Implemented by the Amiga, Gem and tty ports. Default `,'. %.lp \item[\ib{monsters}] *************** *** 2261,2266 **** --- 2326,2335 ---- The number of top line messages to save (and recall with `{\tt \^{}P}') (default 20). Cannot be set with the `{\tt O}' command. %.lp + \item[\ib{msg\_window}] + Use a screen-size window to show the previous messages with `{\tt \^{}P}' + instead of showing them one at a time. (Currently implemented for tty only.) + %.lp \item[\ib{name}] Set your character's name (defaults to your user name). You can also set your character's role by appending a dash and one or more letters of *************** *** 2303,2310 **** %.lp \item[\ib{pettype}] Specify the type of your initial pet, if you are playing a character class ! that uses multiple types of pets. Possible values are ``{\tt cat}'' ! and ``{\tt dog}''. Cannot be set with the `{\tt O}' command. %.Ip \item[\ib{pickup\_burden}] --- 2372,2379 ---- %.lp \item[\ib{pettype}] Specify the type of your initial pet, if you are playing a character class ! that uses multiple types of pets; or choose to have no initial pet at all. ! Possible values are ``{\tt cat}'', ``{\tt dog}'' and ``{\tt none}''. Cannot be set with the `{\tt O}' command. %.Ip \item[\ib{pickup\_burden}] *************** *** 2320,2331 **** \item[\ib{prayconfirm}] Prompt for confirmation before praying (default on). %.lp - \item[\ib{preload\_tiles}] - For the protected mode MSDOS version, control whether tiles - get pre-loaded into RAM at the start of the game. Doing so - enhances performance of the tile graphics, but uses more memory. (default on). - Cannot be set with the `{\tt O}' command. - %.lp \item[\ib{pushweapon}] Using the `w' (wield) command when already wielding something pushes the old item into your secondary weapon slot (default off). --- 2389,2394 ---- *************** *** 2373,2378 **** --- 2436,2445 ---- \item[\ib{standout}] Boldface monsters and ``{\tt --More--}'' (default off). %.lp + \item[\ib{sparkle}] + Display a sparkly effect when a monster (including yourself) is hit by an + attack to which it is resistant (default on). + %.lp \item[\ib{suppress\_alert}] This option may be set to a NetHack version level to suppress alert notification messages about feature changes for that *************** *** 2439,2444 **** --- 2506,2633 ---- \elist %.hn 2 + \subsection*{Window Port Customization options} + + %.pg + Here are explanations of the various options that are + used to customize and change the characteristics of the + windowtype that you have chosen. + Character strings that are too long may be truncated. + Not all window ports will adjust for all settings listed + here. You can safely add any of these options to your + config file, and if the window port is capable of adjusting + to suit your preferences, it will attempt to do so. If it + can't it will silently ignore it. You can find out if an + option is supported by the window port that you are currently + using by checking to see if it shows up in the Options list. + Some options are dynamic and can be specified during the game + with the `{\tt O}' command. + + \blist{} + %.lp + \item[\ib{align\_message}] + Where to align or place the message window (top, bottom, left, or right) + %.lp + \item[\ib{align\_status}] + Where to align or place the status window (top, bottom, left, or right). + %.lp + \item[\ib{ascii\_map}] + NetHack should display an ascii map if it can. + %.lp + \item[\ib{color}] + NetHack should display color if it can for different monsters, + objects, and dungeon features + %.lp + \item[\ib{eight\_bit\_tty}] + Pass eight-bit character values (for example, specified with the {\it + traps \/} option) straight through to your terminal (default off). + %.lp + \item[\ib{font\_map}] + NetHack should use a font by the chosen name for the map window. + %.lp + \item[\ib{font\_menu}] + NetHack should use a font by the chosen name for menu windows. + %.lp + \item[\ib{font\_message}] + NetHack should use a font by the chosen name for the message window. + %.lp + \item[\ib{font\_status}] + NetHack should use a font by the chosen name for the status window. + %.lp + \item[\ib{font\_text}] + NetHack should use a font by the chosen name for text windows. + %.lp + \item[\ib{font\_size\_map}] + NetHack should use this size font for the map window. + %.lp + \item[\ib{font\_size\_menu}] + NetHack should use this size font for menu windows. + %.lp + \item[\ib{font\_size\_message}] + NetHack should use this size font for the message window. + %.lp + \item[\ib{font\_size\_status}] + NetHack should use this size font for the status window. + %.lp + \item[\ib{font\_size\_text}] + NetHack should use this size font for text windows. + %.lp + \item[\ib{hilite\_pet}] + Visually distinguish pets from similar animals (default off). + The behavior of this option depends on the type of windowing you use. + In text windowing, text highlighting or inverse video is often used; + with tiles, generally displays a heart symbol near pets. + %.lp + \item[\ib{large\_font}] + NetHack should use a large font. + %.lp + \item[\ib{map\_mode}] + NetHack should display the map in the manner specified. + %.lp + \item[\ib{player\_selection}] + NetHack should pop up dialog boxes or use prompts for character selection. + %.lp + \item[\ib{popup\_dialog}] + NetHack should pop up dialog boxes for input. + %.lp + \item[\ib{preload\_tiles}] + NetHack should preload tiles into memory. + For example, in the protected mode MSDOS version, control whether tiles + get pre-loaded into RAM at the start of the game. Doing so + enhances performance of the tile graphics, but uses more memory. (default on). + Cannot be set with the `{\tt O}' command. + %.lp + \item[\ib{scroll\_margin}] + NetHack should scroll the display when the hero or cursor + is this number of cells away from the edge of the window. + %.lp + \item[\ib{splash\_screen}] + NetHack should display an opening splash screen when it starts up (default yes). + %.lp + \item[\ib{tiled\_map}] + NetHack should display a tiled map if it can. + %.lp + \item[\ib{tile\_file}] + Specify the name of an alternative tile file to override the default. + %.lp + \item[\ib{tile\_height}] + Specify the preferred height of each tile in a tile capable port. + %.lp + \item[\ib{tile\_width}] + Specify the preferred width of each tile in a tile capable port + %.lp + \item[\ib{use\_inverse}] + NetHack should display inverse when the game specifies it. + %.lp + \item[\ib{vary\_msgcount}] + NetHack should display this number of messages at a time in the message window. + %.lp + \item[\ib{windowcolors}] + NetHack should display windows with the specified foreground/background + colors if it can. + \elist + + %.hn 2 \subsection*{Configuring NetHack for Play by the Blind} %.pg *************** *** 2476,2484 **** \item[\ib{menustyle:traditional}] This will assist in the interface to speech synthesizers. %.lp ! \item[\ib{!number\_pad}] A lot of speech access programs use the number-pad to review the screen. ! If this is the case, turn off the number\_pad option and use the traditional Rogue-like commands. %.lp \item[\ib{Character graphics}] --- 2665,2673 ---- \item[\ib{menustyle:traditional}] This will assist in the interface to speech synthesizers. %.lp ! \item[\ib{number\_pad}] A lot of speech access programs use the number-pad to review the screen. ! If this is the case, disable the number\_pad option and use the traditional Rogue-like commands. %.lp \item[\ib{Character graphics}] *************** *** 2703,2751 **** %.pg \medskip ! The 3.3 development team consisted of {\it Michael Allison}, {\it Ken Arromdee}, ! {\it David Cohrs}, {\it Jessie Collet}, {\it Steve Creps}, {\it Kevin Darcy}, ! {\it Timo Hakulinen}, ! {\it Kevin Hugo}, {\it Steve Linhart}, {\it Dean Luick}, {\it Pat Rankin}, ! {\it Eric Smith}, {\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}. %.pg \medskip ! As with version 3.2, various people contributed to the game as a whole as well as supporting ports on the different platforms that {\it NetHack\/} runs on: %.pg \medskip ! \nd{\it Pat Rankin} maintained 3.3 for VMS. %.pg \medskip ! \nd {\it Michael Allison} maintained NetHack 3.3 for the MS-DOS platform. {\it Paul Winner} and {\it Yitzhak Sapir} provided encouragement. %.pg \medskip \nd {\it Dean Luick}, {\it Mark Modrall}, and {\it Kevin Hugo} maintained and ! enhanced the Macintosh port of 3.3. %.pg \medskip ! \nd {\it Michael Allison} maintained and enhanced 3.3 for the Microsoft Windows NT platform. %.pg \medskip ! \nd {\it Ron Van Iwaarden} took over responsibility for the OS/2 port. %.pg \medskip ! \nd The Amiga port of NetHack was resurrected for 3.3.1 by {\it Janne ! Salmij\"{a}rvi}. %.pg \medskip ! \nd The Atari port of NetHack was resurrected for 3.3.1 by {\it Christian ! ``Marvin'' Bressler}. %.pg \bigskip --- 2892,2976 ---- %.pg \medskip ! The final update to 3.2 was the bug fix release 3.2.3, which was released ! simultaneously with 3.3.0 in December 1999 just in time for the Year 2000. %.pg \medskip ! The 3.3 development team, consisting of {\it Michael Allison}, {\it Ken Arromdee}, ! {\it David Cohrs}, {\it Jessie Collet}, {\it Steve Creps}, {\it Kevin Darcy}, ! {\it Timo Hakulinen}, {\it Kevin Hugo}, {\it Steve Linhart}, {\it Ken Lorber}, ! {\it Dean Luick}, {\it Pat Rankin}, {\it Eric Smith}, {\it Mike Stephenson}, ! {\it Janet Walz}, and {\it Paul Winner}, released 3.3.0 in ! December 1999 and 3.3.1 in August of 2000. ! ! %.pg ! \medskip ! Version 3.3 offered many firsts. It was the first version to separate race ! and profession. The Elf class was removed in preference to an elf race, ! and the races of dwarves, gnomes, and orcs made their first appearance in ! the game alongside the familiar human race. Monk and Ranger roles joined ! Archeologists, Barbarians, Cavemen, Healers, Knights, Priests, Rogues, Samurai, ! Tourists, Valkyries and of course, Wizards. It was also the first version ! to allow you to ride a steed, and was the first version to have a publicly ! available web-site listing all the bugs that had been discovered. Despite ! that constantly growing bug list, 3.3 proved stable enough to last for ! more than a year and a half. ! ! %.pg ! \medskip ! The 3.4 development team initially consisted of ! {\it Michael Allison}, {\it Ken Arromdee}, ! {\it David Cohrs}, {\it Jessie Collet}, {\it Kevin Hugo}, {\it Ken Lorber}, ! {\it Dean Luick}, {\it Pat Rankin}, {\it Mike Stephenson}, ! {\it Janet Walz}, and {\it Paul Winner}, with {\it Warwick Allison} joining ! just before the release of NetHack 3.4.0 in March 2002. ! ! %.pg ! \medskip ! As with version 3.3, various people contributed to the game as a whole as well as supporting ports on the different platforms that {\it NetHack\/} runs on: %.pg \medskip ! \nd{\it Pat Rankin} maintained 3.4 for VMS. %.pg \medskip ! \nd {\it Michael Allison} maintained NetHack 3.4 for the MS-DOS platform. {\it Paul Winner} and {\it Yitzhak Sapir} provided encouragement. %.pg \medskip \nd {\it Dean Luick}, {\it Mark Modrall}, and {\it Kevin Hugo} maintained and ! enhanced the Macintosh port of 3.4. ! ! %.pg ! \medskip ! \nd {\it Michael Allison}, {\it David Cohrs}, {\it Alex Kompel}, {\it Dion Nicolaas}, and ! {\it Yitzhak Sapir} maintained and enhanced 3.4 for the Microsoft Windows platform. ! {\it Alex Kompel} contributed a new graphical interface for the Windows port. %.pg \medskip ! \nd {\it Ron Van Iwaarden} maintained 3.4 for OS/2. %.pg \medskip ! \nd {\it Janne Salmij\"{a}rvi} and {\it Teemu Suikki} maintained ! and enhanced the Amiga port of 3.4 after {\it Janne Salmij\"{a}rvi} resurrected ! it for 3.3.1. %.pg \medskip ! \nd {\it Christian ``Marvin'' Bressler} maintained 3.4 for the Atari after he ! resurrected it for 3.3.1. %.pg \medskip ! \nd There is a NetHack web site maintained by {\it Ken Lorber} at ! http:{\tt /}{\tt /}www.nethack.org{\tt /}. %.pg \bigskip *************** *** 2758,2796 **** \begin{center} \begin{tabular}{lll} %TABLE_START ! Adam Aronow & Irina Rempt-Drijfhout & Mike Gallop\\ ! Andy Church & Izchak Miller & Mike Passaretti\\ ! Andy Swanson & Janet Walz & Mike Stephenson\\ ! Ari Huttunen & Janne Salmij\"{a}rvi & Norm Meluch\\ ! Barton House & Jean-Christophe Collet & Olaf Seibert\\ ! Benson I. Margulies & Jochen Erwied & Pat Rankin\\ ! Bill Dyer & John Kallen & Paul Winner\\ ! Boudewijn Waijers & John Rupley & Pierre Martineau\\ ! Bruce Cox & John S. Bien & Ralf Brown\\ ! Bruce Holloway & Johnny Lee & Richard Addison\\ ! Bruce Mewborne & Jon W\{tte & Richard Beigel\\ ! Carl Schelin & Jonathan Handler & Richard P. Hughey\\ ! Chris Russo & Joshua Delahunty & Rob Menke\\ ! David Cohrs & Keizo Yamamoto & Robin Johnson\\ ! David Damerell & Ken Arromdee & Roland McGrath\\ ! David Gentzel & Ken Lorber & Ron Van Iwaarden\\ ! David Hairston & Ken Washikita & Ronnen Miller\\ ! Dean Luick & Kevin Darcy & Ross Brown\\ ! Del Lamb & Kevin Hugo & Sascha Wostmann\\ ! Deron Meranda & Kevin Sitze & Scott R. Turner\\ ! Dylan O'Donnell & Kevin Smolkowski & Stephen Spackman\\ ! Eric Backus & Kevin Sweet & Stephen White\\ ! Eric Hendrickson & Lars Huttar & Steve Creps\\ ! Eric R. Smith & Mark Gooderum & Steve Linhart\\ ! Eric S. Raymond & Mark Modrall & Steve VanDevender\\ Erik Andersen & Marvin Bressler & Tim Lennan\\ Frederick Roeber & Matthew Day & Timo Hakulinen\\ Gil Neiger & Merlyn LeRoy & Tom Almy\\ Greg Laskin & Michael Allison & Tom West\\ Greg Olson & Michael Feir & Warren Cheung\\ Gregg Wonderly & Michael Hamel & Warwick Allison\\ ! Hao-yang Wang & Michael Sokolov & Yitzhak Sapir\\ ! Helge Hafting & Mike Engber %TABLE_END Do not delete this line. \end{tabular} \end{center} --- 2983,3023 ---- \begin{center} \begin{tabular}{lll} %TABLE_START ! Adam Aronow & Helge Hafting & Mike Engber\\ ! Alex Kompel & Irina Rempt-Drijfhout & Mike Gallop\\ ! Andreas Dorn & Izchak Miller & Mike Passaretti\\ ! Andy Church & J. Ali Harlow & Mike Stephenson\\ ! Andy Swanson & Janet Walz & Norm Meluch\\ ! Ari Huttunen & Janne Salmij\"{a}rvi & Olaf Seibert\\ ! Barton House & Jean-Christophe Collet & Pat Rankin\\ ! Benson I. Margulies & Jochen Erwied & Paul Winner\\ ! Bill Dyer & John Kallen & Pierre Martineau\\ ! Boudewijn Waijers & John Rupley & Ralf Brown\\ ! Bruce Cox & John S. Bien & Richard Addison\\ ! Bruce Holloway & Johnny Lee & Richard Beigel\\ ! Bruce Mewborne & Jon W\{tte & Richard P. Hughey\\ ! Carl Schelin & Jonathan Handler & Rob Menke\\ ! Chris Russo & Joshua Delahunty & Robin Johnson\\ ! David Cohrs & Keizo Yamamoto & Roland McGrath\\ ! David Damerell & Ken Arnold & Ron Van Iwaarden\\ ! David Gentzel & Ken Arromdee & Ronnen Miller\\ ! David Hairston & Ken Lorber & Ross Brown\\ ! Dean Luick & Ken Washikita & Sascha Wostmann\\ ! Del Lamb & Kevin Darcy & Scott Bigham\\ ! Deron Meranda & Kevin Hugo & Scott R. Turner\\ ! Dion Nicolaas & Kevin Sitze & Stephen Spackman\\ ! Dylan O'Donnell & Kevin Smolkowski & Stephen White\\ ! Eric Backus & Kevin Sweet & Steve Creps\\ ! Eric Hendrickson & Lars Huttar & Steve Linhart\\ ! Eric R. Smith & Mark Gooderum & Steve VanDevender\\ ! Eric S. Raymond & Mark Modrall & Teemu Suikki\\ Erik Andersen & Marvin Bressler & Tim Lennan\\ Frederick Roeber & Matthew Day & Timo Hakulinen\\ Gil Neiger & Merlyn LeRoy & Tom Almy\\ Greg Laskin & Michael Allison & Tom West\\ Greg Olson & Michael Feir & Warren Cheung\\ Gregg Wonderly & Michael Hamel & Warwick Allison\\ ! Hao-yang Wang & Michael Sokolov & Yitzhak Sapir %TABLE_END Do not delete this line. \end{tabular} \end{center} *** nethack-3.3.1/doc/Guidebook.txt Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/doc/Guidebook.txt Thu Mar 21 07:37:36 2002 *************** *** 9,41 **** A Guide to the Mazes of Menace ! (Guidebook for NetHack 3.3) Eric S. Raymond ! (Extensively edited and expanded for 3.0 by Mike Threepoint) 1. Introduction Recently, you have begun to find yourself unfulfilled and distant ! in your daily occupation. Strange dreams of prospecting, steal- ! ing, crusading, and combat have haunted you in your sleep for ! many months, but you aren't sure of the reason. You wonder ! whether you have in fact been having those dreams all your life, ! and somehow managed to forget about them until now. Some nights you awaken suddenly and cry out, terrified at the vivid recollec- ! tion of the strange and powerful creatures that seem to be lurk- ! ing behind every corner of the dungeon in your dream. Could ! these details haunting your dreams be real? As each night passes, ! you feel the desire to enter the mysterious caverns near the ! ruins grow stronger. Each morning, however, you quickly put the ! idea out of your head as you recall the tales of those who en- ! tered the caverns before you and did not return. Eventually you ! can resist the yearning to seek out the fantastic place in your ! dreams no longer. After all, when other adventurers came back ! this way after spending time in the caverns, they usually seemed better off than when they passed through the first time. And who was to say that all of those who did not return had not just kept going? --- 9,41 ---- A Guide to the Mazes of Menace ! (Guidebook for NetHack) Eric S. Raymond ! (Extensively edited and expanded for 3.4) 1. Introduction Recently, you have begun to find yourself unfulfilled and distant ! in your daily occupation. Strange dreams of prospecting, steal- ! ing, crusading, and combat have haunted you in your sleep for ! many months, but you aren't sure of the reason. You wonder ! whether you have in fact been having those dreams all your life, ! and somehow managed to forget about them until now. Some nights you awaken suddenly and cry out, terrified at the vivid recollec- ! tion of the strange and powerful creatures that seem to be lurk- ! ing behind every corner of the dungeon in your dream. Could ! these details haunting your dreams be real? As each night pass- ! es, you feel the desire to enter the mysterious caverns near the ! ruins grow stronger. Each morning, however, you quickly put the ! idea out of your head as you recall the tales of those who en- ! tered the caverns before you and did not return. Eventually you ! can resist the yearning to seek out the fantastic place in your ! dreams no longer. After all, when other adventurers came back ! this way after spending time in the caverns, they usually seemed better off than when they passed through the first time. And who was to say that all of those who did not return had not just kept going? *************** *** 66,88 **** - NetHack Guidebook 2 In the morning you awake, collect your belongings, and set ! off for the dungeon. After several days of uneventful travel, ! you see the ancient ruins that mark the entrance to the Mazes of ! Menace. It is late at night, so you make camp at the entrance ! and spend the night sleeping under the open skies. In the morn- ! ing, you gather your gear, eat what may be your last meal out- side, and enter the dungeon... 2. What is going on here? You have just begun a game of NetHack. Your goal is to grab ! as much treasure as you can, retrieve the Amulet of Yendor, and escape the Mazes of Menace alive. Your abilities and strengths for dealing with the hazards of --- 66,88 ---- NetHack Guidebook 2 + In the morning you awake, collect your belongings, and set ! off for the dungeon. After several days of uneventful travel, ! you see the ancient ruins that mark the entrance to the Mazes of ! Menace. It is late at night, so you make camp at the entrance ! and spend the night sleeping under the open skies. In the morn- ! ing, you gather your gear, eat what may be your last meal out- side, and enter the dungeon... 2. What is going on here? You have just begun a game of NetHack. Your goal is to grab ! as much treasure as you can, retrieve the Amulet of Yendor, and escape the Mazes of Menace alive. Your abilities and strengths for dealing with the hazards of *************** *** 92,118 **** them to move quickly and sneak up on the local nasties. They start equipped with the tools for a proper scientific expedition. ! Barbarians are warriors out of the hinterland, hardened to battle. They begin their quests with naught but uncommon strength, a trusty hauberk, and a great two-handed sword. ! Cavemen and Cavewomen start with exceptional strength but, unfortunately, with neolithic weapons. Healers are wise in medicine and apothecary. They know the ! herbs and simples that can restore vitality, ease pain, anesthe- ! tize, and neutralize poisons; and with their instruments, they can divine a being's state of health or sickness. Their medical practice earns them quite reasonable amounts of money, with which they enter the dungeon. ! Knights are distinguished from the common skirmisher by ! their devotion to the ideals of chivalry and by the surpassing excellence of their armor. Monks are ascetics, who by rigorous practice of physical and mental disciplines have become capable of fighting as effectively ! without weapons as with. They wear no armor but make up for it with increased mobility. Priests and Priestesses are clerics militant, crusaders ad- --- 92,118 ---- them to move quickly and sneak up on the local nasties. They start equipped with the tools for a proper scientific expedition. ! Barbarians are warriors out of the hinterland, hardened to battle. They begin their quests with naught but uncommon strength, a trusty hauberk, and a great two-handed sword. ! Cavemen and Cavewomen start with exceptional strength but, unfortunately, with neolithic weapons. Healers are wise in medicine and apothecary. They know the ! herbs and simples that can restore vitality, ease pain, anes- ! thetize, and neutralize poisons; and with their instruments, they can divine a being's state of health or sickness. Their medical practice earns them quite reasonable amounts of money, with which they enter the dungeon. ! Knights are distinguished from the common skirmisher by ! their devotion to the ideals of chivalry and by the surpassing excellence of their armor. Monks are ascetics, who by rigorous practice of physical and mental disciplines have become capable of fighting as effectively ! without weapons as with. They wear no armor but make up for it with increased mobility. Priests and Priestesses are clerics militant, crusaders ad- *************** *** 126,133 **** as well as tracking and stealthy movement. ! NetHack 3.3 August 2, 2000 ! --- 126,132 ---- as well as tracking and stealthy movement. ! NetHack 3.4 March 20, 2002 *************** *** 136,141 **** --- 135,141 ---- NetHack Guidebook 3 + Rogues are agile and stealthy thieves, with knowledge of locks, traps, and poisons. Their advantage lies in surprise, which they employ to great advantage. *************** *** 153,167 **** cold, and instills in them stealth and cunning. Wizards start out with a knowledge of magic, a selection of ! magical items, and a particular affinity for dweomercraft. ! Although seemingly weak and easy to overcome at first sight, an ! experienced Wizard is a deadly foe. You may also choose the race of your character: Dwarves are smaller than humans or elves, but are stocky and ! solid individuals. Dwarves' most notable trait is their great ! expertise in mining and metalwork. Dwarvish armor is said to be second in quality not even to the mithril armor of the Elves. Elves are agile, quick, and perceptive; very little of what --- 153,167 ---- cold, and instills in them stealth and cunning. Wizards start out with a knowledge of magic, a selection of ! magical items, and a particular affinity for dweomercraft. Al- ! though seemingly weak and easy to overcome at first sight, an ex- ! perienced Wizard is a deadly foe. You may also choose the race of your character: Dwarves are smaller than humans or elves, but are stocky and ! solid individuals. Dwarves' most notable trait is their great ! expertise in mining and metalwork. Dwarvish armor is said to be second in quality not even to the mithril armor of the Elves. Elves are agile, quick, and perceptive; very little of what *************** *** 169,181 **** often gives them an advantage in arms and armor. Gnomes are smaller than but generally similar to dwarves. ! Gnomes are known to be expert miners, and it is known that a ! secret underground mine complex built by this race exists within the Mazes of Menace, filled with both riches and danger. Humans are by far the most common race of the surface world, ! and are thus the norm by which other races are often compared. ! Although they have no special abilities, they can succeed in any role. Orcs are a cruel and barbaric race that hate every living --- 169,181 ---- often gives them an advantage in arms and armor. Gnomes are smaller than but generally similar to dwarves. ! Gnomes are known to be expert miners, and it is known that a se- ! cret underground mine complex built by this race exists within the Mazes of Menace, filled with both riches and danger. Humans are by far the most common race of the surface world, ! and are thus the norm by which other races are often compared. ! Although they have no special abilities, they can succeed in any role. Orcs are a cruel and barbaric race that hate every living *************** *** 192,199 **** ! NetHack 3.3 August 2, 2000 ! --- 192,198 ---- ! NetHack 3.4 March 20, 2002 *************** *** 202,207 **** --- 201,207 ---- NetHack Guidebook 4 + When NetHack's ancestor rogue first appeared, its screen orientation was almost unique among computer fantasy games. Since then, screen orientation has become the norm rather than *************** *** 214,226 **** will be used for the map. NetHack can even be played by blind players, with the assis- ! tance of Braille readers or speech synthesisers. Instructions ! for configuring NetHack for the blind are included later in this document. NetHack generates a new dungeon every time you play it; even ! the authors still find it an entertaining and exciting game ! despite having won several times. NetHack offers a variety of display options. The options available to you will vary from port to port, depending on the --- 214,226 ---- will be used for the map. NetHack can even be played by blind players, with the assis- ! tance of Braille readers or speech synthesisers. Instructions ! for configuring NetHack for the blind are included later in this document. NetHack generates a new dungeon every time you play it; even ! the authors still find it an entertaining and exciting game de- ! spite having won several times. NetHack offers a variety of display options. The options available to you will vary from port to port, depending on the *************** *** 230,250 **** ter interface, a color character interface, and a graphical in- terface using small pictures called tiles. The two character in- terfaces allow fonts with other characters to be substituted, but ! the default assignments use standard ASCII characters to ! represent everything. There is no difference between the various ! display options with respect to game play. Because we cannot ! reproduce the tiles or colors in the Guidebook, and because it is ! common to all ports, we will use the default ASCII characters ! from the monochrome character display when referring to things ! you might see on the screen during your game. In order to understand what is going on in NetHack, first you must understand what NetHack is doing with the screen. The NetHack screen replaces the ``You see ...'' descriptions of text adventure games. Figure 1 is a sample of what a NetHack screen ! might look like. ! _______________________________________________________________________ The bat bites! ------ --- 230,251 ---- ter interface, a color character interface, and a graphical in- terface using small pictures called tiles. The two character in- terfaces allow fonts with other characters to be substituted, but ! the default assignments use standard ASCII characters to repre- ! sent everything. There is no difference between the various dis- ! play options with respect to game play. Because we cannot repro- ! duce the tiles or colors in the Guidebook, and because it is com- ! mon to all ports, we will use the default ASCII characters from ! the monochrome character display when referring to things you ! might see on the screen during your game. In order to understand what is going on in NetHack, first you must understand what NetHack is doing with the screen. The NetHack screen replaces the ``You see ...'' descriptions of text adventure games. Figure 1 is a sample of what a NetHack screen ! might look like. The way the screen looks for you depends on ! your platform. ! -------------------------------------------------------------------- The bat bites! ------ *************** *** 256,265 **** - Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral - - NetHack 3.3 August 2, 2000 --- 257,264 ---- + NetHack 3.4 March 20, 2002 *************** *** 268,284 **** NetHack Guidebook 5 Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak ! _______________________________________________________________________ Figure 1 3.1. The status lines (bottom) ! The bottom two lines of the screen contain several cryptic ! pieces of information describing your current status. If either ! status line becomes longer than the width of the screen, you might not see all of it. Here are explanations of what the vari- ous status items mean (though your configuration may not have all the status items listed below): --- 267,287 ---- NetHack Guidebook 5 + + + + Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak ! -------------------------------------------------------------------- Figure 1 3.1. The status lines (bottom) ! The bottom two lines of the screen contain several cryptic ! pieces of information describing your current status. If either ! status line becomes longer than the width of the screen, you might not see all of it. Here are explanations of what the vari- ous status items mean (though your configuration may not have all the status items listed below): *************** *** 288,308 **** experience level, see below). Strength ! A measure of your character's strength; one of your six ! basic attributes. Your attributes can range from 3 to 18 ! inclusive (occasionally you may get super-strengths of the ! form 18/xx). The higher your strength, the stronger you ! are. Strength affects how successfully you perform physical ! tasks, how much damage you do in combat, and how much loot you can carry. Dexterity ! Dexterity affects your chances to hit in combat, to avoid ! traps, and do other tasks requiring agility or manipulation of objects. Constitution ! Constitution affects your ability to recover from injuries and other strains on your stamina. Intelligence --- 291,313 ---- experience level, see below). Strength ! A measure of your character's strength; one of your six ba- ! sic attributes. A human character's attributes can range ! from 3 to 18 inclusive; non-humans may exceed these limits ! (occasionally you may get super-strengths of the form 18/xx, ! and magic can also cause attributes to exceed the normal ! limits). The higher your strength, the stronger you are. ! Strength affects how successfully you perform physical ! tasks, how much damage you do in combat, and how much loot you can carry. Dexterity ! Dexterity affects your chances to hit in combat, to avoid ! traps, and do other tasks requiring agility or manipulation of objects. Constitution ! Constitution affects your ability to recover from injuries and other strains on your stamina. Intelligence *************** *** 315,331 **** Charisma Charisma affects how certain creatures react toward you. In ! particular, it can affect the prices shopkeepers offer you. - Alignment - Lawful, Neutral, or Chaotic. Often, Lawful is taken as good - and Chaotic as evil, but legal and ethical do not always - coincide. Your alignment influences how other monsters - react toward you. Monsters of a like alignment are more - likely to be non-aggressive, while those of an opposing - NetHack 3.3 August 2, 2000 --- 320,330 ---- Charisma Charisma affects how certain creatures react toward you. In ! particular, it can affect the prices shopkeepers offer you. + NetHack 3.4 March 20, 2002 *************** *** 334,351 **** NetHack Guidebook 6 ! alignment are more likely to be seriously offended at your ! presence. Dungeon Level How deep you are in the dungeon. You start at level one and ! the number increases as you go deeper into the dungeon. ! Some levels are special, and are identified by a name and ! not a number. The Amulet of Yendor is reputed to be some- where beneath the twentieth level. Gold ! The number of gold pieces you are openly carrying. Gold which you have concealed in containers is not counted. Hit Points --- 333,356 ---- NetHack Guidebook 6 ! ! Alignment ! Lawful, Neutral, or Chaotic. Often, Lawful is taken as good ! and Chaotic as evil, but legal and ethical do not always co- ! incide. Your alignment influences how other monsters react ! toward you. Monsters of a like alignment are more likely to ! be non-aggressive, while those of an opposing alignment are ! more likely to be seriously offended at your presence. Dungeon Level How deep you are in the dungeon. You start at level one and ! the number increases as you go deeper into the dungeon. ! Some levels are special, and are identified by a name and ! not a number. The Amulet of Yendor is reputed to be some- where beneath the twentieth level. Gold ! The number of gold pieces you are openly carrying. Gold which you have concealed in containers is not counted. Hit Points *************** *** 357,369 **** your hit points can reach. Power ! Spell points. This tells you how much mystic energy (mana) ! you have available for spell casting. Again, resting will regenerate the amount available. Armor Class A measure of how effectively your armor stops blows from un- ! friendly creatures. The lower this number is, the more ef- fective the armor; it is quite possible to have negative ar- mor class. --- 362,374 ---- your hit points can reach. Power ! Spell points. This tells you how much mystic energy (mana) ! you have available for spell casting. Again, resting will regenerate the amount available. Armor Class A measure of how effectively your armor stops blows from un- ! friendly creatures. The lower this number is, the more ef- fective the armor; it is quite possible to have negative ar- mor class. *************** *** 376,420 **** here. Time ! The number of turns elapsed so far, displayed if you have the time option set. Hunger status Your current hunger status, ranging from Satiated down to ! Fainting. If your hunger status is normal, it is not ! displayed. ! ! Additional status flags may appear after the hunger status: ! Conf when you're confused, FoodPois or Ill when sick, Blind when ! you can't see, Stun when stunned, and Hallu when hallucinating. - NetHack 3.3 August 2, 2000 - NetHack Guidebook 7 3.2. The message line (top) ! The top line of the screen is reserved for messages that ! describe things that are impossible to represent visually. If ! you see a ``--More--'' on the top line, this means that NetHack ! has another message to display on the screen, but it wants to ! make certain that you've read the one that is there first. To ! read the next message, just press the space bar. 3.3. The map (rest of the screen) ! The rest of the screen is the map of the level as you have ! explored it so far. Each symbol on the screen represents some- ! thing. You can set various graphics options to change some of ! the symbols the game uses; otherwise, the game will use default symbols. Here is a list of what the default symbols mean: - and | --- 381,424 ---- here. Time ! The number of turns elapsed so far, displayed if you have the time option set. Hunger status Your current hunger status, ranging from Satiated down to ! Fainting. If your hunger status is normal, it is not dis- ! played. + NetHack 3.4 March 20, 2002 + NetHack Guidebook 7 + Additional status flags may appear after the hunger status: + Conf when you're confused, FoodPois or Ill when sick, Blind when + you can't see, Stun when stunned, and Hallu when hallucinating. 3.2. The message line (top) ! The top line of the screen is reserved for messages that de- ! scribe things that are impossible to represent visually. If you ! see a ``--More--'' on the top line, this means that NetHack has ! another message to display on the screen, but it wants to make ! certain that you've read the one that is there first. To read ! the next message, just press the space bar. 3.3. The map (rest of the screen) ! The rest of the screen is the map of the level as you have ! explored it so far. Each symbol on the screen represents some- ! thing. You can set various graphics options to change some of ! the symbols the game uses; otherwise, the game will use default symbols. Here is a list of what the default symbols mean: - and | *************** *** 422,428 **** . The floor of a room, ice, or a doorless doorway. ! # A corridor, or iron bars, or a tree, or possibly a kitchen sink (if your dungeon has sinks), or a drawbridge. > Stairs down: a way to the next level. --- 426,432 ---- . The floor of a room, ice, or a doorless doorway. ! # A corridor, or iron bars, or a tree, or possibly a kitchen sink (if your dungeon has sinks), or a drawbridge. > Stairs down: a way to the next level. *************** *** 450,470 **** = A ring. - ! A potion. - ( A useful item (pick-axe, key, lamp...). - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 8 " An amulet or a spider web. --- 454,474 ---- = A ring. + NetHack 3.4 March 20, 2002 + NetHack Guidebook 8 ! ! A potion. + ( A useful item (pick-axe, key, lamp...). " An amulet or a spider web. *************** *** 483,492 **** \ An opulent throne. a-zA-Z and other symbols ! Letters and certain other symbols represent the various in- ! habitants of the Mazes of Menace. Watch out, they can be nasty and vicious. Sometimes, however, they can be helpful. You need not memorize all these symbols; you can ask the game what any symbol represents with the `/' command (see the next section for more info). --- 487,500 ---- \ An opulent throne. a-zA-Z and other symbols ! Letters and certain other symbols represent the various in- ! habitants of the Mazes of Menace. Watch out, they can be nasty and vicious. Sometimes, however, they can be helpful. + I This marks the last known location of an invisible or other- + wise unseen monster. Note that the monster could have + moved. The 'F' and 'm' commands may be useful here. + You need not memorize all these symbols; you can ask the game what any symbol represents with the `/' command (see the next section for more info). *************** *** 500,508 **** additional information, for example a direction, or an object to be used. For those commands that require additional information, NetHack will present you with either a menu of choices or with a ! command line prompt requesting information. Which you are ! presented with will depend chiefly on how you have set the menus- ! tyle option. For example, a common question, in the form ``What do you want to use? [a-zA-Z ?*]'', asks you to choose an object you are --- 508,516 ---- additional information, for example a direction, or an object to be used. For those commands that require additional information, NetHack will present you with either a menu of choices or with a ! command line prompt requesting information. Which you are pre- ! sented with will depend chiefly on how you have set the menustyle ! option. For example, a common question, in the form ``What do you want to use? [a-zA-Z ?*]'', asks you to choose an object you are *************** *** 512,537 **** example, there is also a `*' indicating that you may choose an object not on the list, if you wanted to use something unexpect- ed. Typing a `*' lists your entire inventory, so you can see the - inventory letters of every object you're carrying. Finally, if - you change your mind and decide you don't want to do this command - after all, you can press the ESC key to abort the command. - You can put a number before some commands to repeat them - that many times; for example, ``10s'' will search ten times. If - you have the number_pad option set, you must type `n' to prefix a - count, so the example above would be typed ``n10s'' instead. - NetHack 3.3 August 2, 2000 - NetHack Guidebook 9 Commands for which counts make no sense ignore them. In addi- tion, movement commands can be prefixed for greater control (see below). To cancel a count or a prefix, press the ESC key. --- 520,545 ---- example, there is also a `*' indicating that you may choose an object not on the list, if you wanted to use something unexpect- ed. Typing a `*' lists your entire inventory, so you can see the + NetHack 3.4 March 20, 2002 + NetHack Guidebook 9 + inventory letters of every object you're carrying. Finally, if + you change your mind and decide you don't want to do this command + after all, you can press the ESC key to abort the command. + You can put a number before some commands to repeat them + that many times; for example, ``10s'' will search ten times. If + you have the number_pad option set, you must type `n' to prefix a + count, so the example above would be typed ``n10s'' instead. Commands for which counts make no sense ignore them. In addi- tion, movement commands can be prefixed for greater control (see below). To cancel a count or a prefix, press the ESC key. *************** *** 543,605 **** ? Help menu: display one of several help texts available. ! / Tell what a symbol represents. You may choose to specify a location or type a symbol (or even a whole word) to explain. Specifying a location is done by moving the cursor to a par- ! ticular spot on the map and then pressing one of `.', `,', ! `;', or `:'. `.' will explain the symbol at the chosen lo- ! cation, conditionally check for ``More info?'' depending ! upon whether the help option is on, and then you will be ! asked to pick another location; `,' will explain the symbol ! but skip any additional information; `;' will skip addition- ! al info and also not bother asking you to choose another lo- ! cation to examine; `:' will show additional info, if any, ! without asking for confirmation. When picking a location, ! pressing the ESC key will terminate this command, or press- ! ing `?' will give a brief reminder about how it works. Specifying a name rather than a location always gives any additional information available about that name. & Tell what a command does. ! < Go up to the previous level (if you are on the staircase or ladder). ! > Go down to the next level (if you are on the staircase or ! ladder). [yuhjklbn] ! Go one step in the direction indicated (see Figure 2). If ! you can sense a monster there, you will fight the monster ! instead. Only these one-step movement commands cause you to ! fight monsters; the others (below) are ``safe.'' ! ! y k u 7 8 9 ! \ | / \ | / ! h- . -l 4- . -6 ! / | \ / | \ ! b j n 1 2 3 ! (if number_pad is set) - Figure 2 - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 10 [YUHJKLBN] ! Go in that direction until you hit a wall or run into some- thing. m[yuhjklbn] --- 551,615 ---- ? Help menu: display one of several help texts available. ! / Tell what a symbol represents. You may choose to specify a location or type a symbol (or even a whole word) to explain. Specifying a location is done by moving the cursor to a par- ! ticular spot on the map and then pressing one of `.', `,', ! `;', or `:'. `.' will explain the symbol at the chosen lo- ! cation, conditionally check for ``More info?'' depending up- ! on whether the help option is on, and then you will be asked ! to pick another location; `,' will explain the symbol but ! skip any additional information; `;' will skip additional ! info and also not bother asking you to choose another loca- ! tion to examine; `:' will show additional info, if any, ! without asking for confirmation. When picking a location, ! pressing the ESC key will terminate this command, or press- ! ing `?' will give a brief reminder about how it works. Specifying a name rather than a location always gives any additional information available about that name. & Tell what a command does. ! < Go up to the previous level (if you are on a staircase or ladder). ! > Go down to the next level (if you are on a staircase or lad- ! der). [yuhjklbn] ! Go one step in the direction indicated (see Figure 2). If ! you sense or remember a monster there, you will fight the ! monster instead. Only these one-step movement commands ! cause you to fight monsters; the others (below) are ! ``safe.'' ! + NetHack 3.4 March 20, 2002 + NetHack Guidebook 10 ! y k u 7 8 9 ! \ | / \ | / ! h- . -l 4- . -6 ! / | \ / | \ ! b j n 1 2 3 ! (if number_pad is set) ! ! Figure 2 [YUHJKLBN] ! Go in that direction until you hit a wall or run into some- thing. m[yuhjklbn] *************** *** 607,613 **** if you remember a monster there) F[yuhjklbn] ! Prefix: fight a monster (even if you only guess one is there) M[yuhjklbn] --- 617,623 ---- if you remember a monster there) F[yuhjklbn] ! Prefix: fight a monster (even if you only guess one is there) M[yuhjklbn] *************** *** 620,631 **** Prefix: same as `g', but forking of corridors is not con- sidered interesting. . Rest, do nothing for one turn. a Apply (use) a tool (pick-axe, key, lamp...). A Remove one or more worn items, such as armor. Use `T' (take ! off) to take off only one piece of armor or `R' (remove) to take off only one accessory. ^A Redo the previous command. --- 630,647 ---- Prefix: same as `g', but forking of corridors is not con- sidered interesting. + _ Travel to a map location via a shortest-path algorithm. + Stops on most of the same conditions as the `G' command + does. For ports with mouse support, the command is also in- + voked when a mouse-click takes place on a location further + than 1 cell away from the current position. + . Rest, do nothing for one turn. a Apply (use) a tool (pick-axe, key, lamp...). A Remove one or more worn items, such as armor. Use `T' (take ! off) to take off only one piece of armor or `R' (remove) to take off only one accessory. ^A Redo the previous command. *************** *** 636,692 **** ^C Panic button. Quit the game. - d Drop something. Ex. ``d7a'' means drop seven items of ob- - ject a. - D Drop several things. In answer to the question ``What kinds - of things do you want to drop? [!%= aium]'' you should type - zero or more object symbols possibly followed by `a' and/or - `i' and/or `u' and/or `m'. ! Da - drop all objects, without asking for confirmation. ! Di - examine your inventory before dropping anything. ! Du - drop only unpaid objects (when in a shop). ! Dm - use a menu to pick which object(s) to drop. ! D%u - drop only unpaid food. - ^D Kick something (usually a door). - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 11 e Eat food. ! E Engrave a message on the floor. Engraving the word ``El- ! bereth'' will cause most monsters to not attack you hand- ! to-hand (but if you attack, you will rub it out); this is ! often useful to give yourself a breather. (This feature may ! be compiled out of the game, so your version might not have it.) ! E- - write in the dust with your fingers. ! f Fire one of the objects placed in your quiver. You may ! select ammunition with a previous `Q' command, or let the ! computer pick something appropriate if autoquiver is true. i List your inventory (everything you're carrying). I List selected parts of your inventory. ! I* - list all gems in inventory; ! Iu - list all unpaid items; ! Ix - list all used up items that are on your shopping bill; ! I$ - count your money. o Open a door. --- 652,708 ---- ^C Panic button. Quit the game. ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 11 + d Drop something. Ex. ``d7a'' means drop seven items of ob- + ject a. + D Drop several things. In answer to the question ``What kinds + of things do you want to drop? [!%= aium]'' you should type + zero or more object symbols possibly followed by `a' and/or + `i' and/or `u' and/or `m'. ! Da - drop all objects, without asking for confirmation. ! Di - examine your inventory before dropping anything. ! Du - drop only unpaid objects (when in a shop). ! Dm - use a menu to pick which object(s) to drop. ! D%u - drop only unpaid food. + ^D Kick something (usually a door). e Eat food. ! E Engrave a message on the floor. Engraving the word ``El- ! bereth'' will cause most monsters to not attack you hand-to- ! hand (but if you attack, you will rub it out); this is often ! useful to give yourself a breather. (This feature may be ! compiled out of the game, so your version might not have it.) ! E- - write in the dust with your fingers. ! f Fire one of the objects placed in your quiver. You may se- ! lect ammunition with a previous `Q' command, or let the com- ! puter pick something appropriate if autoquiver is true. i List your inventory (everything you're carrying). I List selected parts of your inventory. ! I* - list all gems in inventory; ! Iu - list all unpaid items; ! Ix - list all used up items that are on your shopping bill; ! I$ - count your money. o Open a door. *************** *** 702,741 **** p Pay your shopping bill. - P Put on a ring or other accessory (amulet, blindfold). - ^P Repeat previous message (subsequent ^P's repeat earlier mes- - sages). ! q Quaff (drink) a potion. - Q Select an object for your quiver. You can then throw this - using the `f' command. (In versions prior to 3.3 this was - the command to quit the game, which has now been moved to - `#quit'.) - r Read a scroll or spellbook. - R Remove an accessory (ring, amulet, etc). - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 12 ^R Redraw the screen. s Search for secret doors and traps around you. It usually takes several tries to find something. ! S Save (and suspend) the game. The game will be restored au- tomatically the next time you play. t Throw an object or shoot a projectile. --- 718,757 ---- p Pay your shopping bill. ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 12 + P Put on a ring or other accessory (amulet, blindfold). + ^P Repeat previous message (subsequent ^P's repeat earlier mes- + sages). + q Quaff (drink) a potion. + Q Select an object for your quiver. You can then throw this + using the `f' command. (In versions prior to 3.3 this was + the command to quit the game, which has now been moved to + `#quit'.) ! r Read a scroll or spellbook. + R Remove an accessory (ring, amulet, etc). ^R Redraw the screen. s Search for secret doors and traps around you. It usually takes several tries to find something. ! S Save (and suspend) the game. The game will be restored au- tomatically the next time you play. t Throw an object or shoot a projectile. *************** *** 750,756 **** w Wield weapon. ! w- - wield nothing, use your bare hands. W Wear armor. --- 766,772 ---- w Wield weapon. ! w- - wield nothing, use your bare hands. W Wear armor. *************** *** 765,800 **** ^X Display your name, role, race, gender, and alignment as well as the various deities in your game. ! z Zap a wand. To aim at yourself, use `.' for the direction. - Z Zap (cast) a spell. - ^Z Suspend the game (UNIX(R) versions with job control only). - : Look at what is here. ! ; Show what type of thing a visible symbol corresponds to. - , Pick up some things. - @ Toggle the autopickup option on and off. - ^ Ask for the type of a trap you found earlier. ! __________ ! (R)UNIX is a registered trademark of AT&T. - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 13 ) Tell what weapon you are wielding. --- 781,815 ---- ^X Display your name, role, race, gender, and alignment as well as the various deities in your game. ! z Zap a wand. To aim at yourself, use `.' for the direction. ! NetHack 3.4 March 20, 2002 ! NetHack Guidebook 13 + Z Zap (cast) a spell. To cast at yourself, use `.' for the + direction. + ^Z Suspend the game (UNIX(R) versions with job control only). + : Look at what is here. + ; Show what type of thing a visible symbol corresponds to. + , Pick up some things. ! @ Toggle the autopickup option on and off. + ^ Ask for the type of a trap you found earlier. ) Tell what weapon you are wielding. *************** *** 806,812 **** ( Tell what tools you are using. ! * Tell what equipment you are using; combines the preceding five type-specific commands into one. $ Count your gold pieces. --- 821,827 ---- ( Tell what tools you are using. ! * Tell what equipment you are using; combines the preceding five type-specific commands into one. $ Count your gold pieces. *************** *** 823,872 **** ! Escape to a shell. # Perform an extended command. As you can see, the authors of ! NetHack used up all the letters, so this is a way to intro- ! duce the less frequently used commands. What extended com- ! mands are available depends on what features the game was compiled with. #adjust Adjust inventory letters (most useful when the fixinv option is ``on''). - #chat - Talk to someone. ! #conduct ! List which challenges you have adhered to. - #dip Dip an object into something. ! #enhance ! Advance or check weapons and spell skills. - #force - Force a lock. - #invoke - Invoke an object's special powers. - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 14 #jump Jump to another location. #loot ! Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. #monster --- 838,890 ---- ! Escape to a shell. # Perform an extended command. As you can see, the authors of ! NetHack used up all the letters, so this is a way to intro- ! duce the less frequently used commands. What extended com- ! mands are available depends on what features the game was compiled with. #adjust Adjust inventory letters (most useful when the fixinv option is ``on''). ! __________ ! (R)UNIX is a registered trademark of AT&T. ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 14 + #chat + Talk to someone. + #conduct + List which challenges you have adhered to. See the section + below entitled ``Conduct'' for details. + #dip Dip an object into something. + #enhance + Advance or check weapons and spell skills. ! #force ! Force a lock. + #invoke + Invoke an object's special powers. #jump Jump to another location. #loot ! Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. #monster *************** *** 888,894 **** #ride Ride (or stop riding) a monster. ! #rub Rub a lamp. #sit Sit down. --- 906,912 ---- #ride Ride (or stop riding) a monster. ! #rub Rub a lamp or a stone. #sit Sit down. *************** *** 896,904 **** Turn undead. #twoweapon ! Toggle two-weapon combat on or off. Note that you must use ! suitable weapons for this type of combat, or it will be au- ! tomatically turned off. #untrap Untrap something (trap, door, or chest). --- 914,934 ---- Turn undead. #twoweapon ! Toggle two-weapon combat on or off. Note that you must use ! suitable weapons for this type of combat, or it will be ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 15 ! ! ! ! automatically turned off. #untrap Untrap something (trap, door, or chest). *************** *** 912,934 **** #? Help menu: get the list of available extended commands. If your keyboard has a meta key (which, when pressed in com- ! bination with another key, modifies it by setting the `meta' ! [8th, or `high'] bit), you can invoke many extended commands by ! meta-ing the first letter of the command. In NT, OS/2, and PC NetHack, the `Alt' key can be used in this fashion. ! NetHack 3.3 August 2, 2000 ! ! ! ! ! ! ! NetHack Guidebook 15 ! ! ! M-2 #twoweapon M-a #adjust --- 942,955 ---- #? Help menu: get the list of available extended commands. If your keyboard has a meta key (which, when pressed in com- ! bination with another key, modifies it by setting the `meta' ! [8th, or `high'] bit), you can invoke many extended commands by ! meta-ing the first letter of the command. In NT, OS/2, and PC NetHack, the `Alt' key can be used in this fashion. + M-? #? (not supported by all platforms) ! M-2 #twoweapon (unless the number_pad option is enabled) M-a #adjust *************** *** 960,998 **** M-s #sit - M-t #turn - M-u #untrap - M-v #version ! M-w #wipe - If the number_pad option is on, some additional letter com- - mands are available: - j Jump to another location. Same as ``#jump'' or ``M-j''. - k Kick something (usually a door). Same as `^D'. - l Loot a box or bag on the floor beneath you, or the saddle - from a horse standing next to you. Same as ``#loot'' or - ``M-l''. ! N Name an item or type of object. Same as ``#name'' or ``M- ! N''. ! NetHack 3.3 August 2, 2000 ! NetHack Guidebook 16 u Untrap a trap, door, or chest. Same as ``#untrap'' or ``M- u''. --- 981,1023 ---- M-s #sit ! NetHack 3.4 March 20, 2002 ! NetHack Guidebook 16 ! M-t #turn + M-u #untrap + M-v #version + M-w #wipe + If the number_pad option is on, some additional letter com- + mands are available: + h Help menu: display one of several help texts available, + like ``?''. ! j Jump to another location. Same as ``#jump'' or ``M-j''. ! ! k Kick something (usually a door). Same as `^D'. ! ! l Loot a box or bag on the floor beneath you, or the saddle ! from a horse standing next to you. Same as ``#loot'' or ! ``M-l''. + N Name an item or type of object. Same as ``#name'' or ``M- + n''. u Untrap a trap, door, or chest. Same as ``#untrap'' or ``M- u''. *************** *** 1000,1008 **** 5. Rooms and corridors ! Rooms and corridors in the dungeon are either lit or dark. ! Any lit areas within your line of sight will be displayed; dark ! areas are only displayed if they are within one space of you. Walls and corridors remain on the map as you explore them. Secret corridors are hidden. You can find them with the `s' --- 1025,1033 ---- 5. Rooms and corridors ! Rooms and corridors in the dungeon are either lit or dark. ! Any lit areas within your line of sight will be displayed; dark ! areas are only displayed if they are within one space of you. Walls and corridors remain on the map as you explore them. Secret corridors are hidden. You can find them with the `s' *************** *** 1011,1065 **** 5.1. Doorways Doorways connect rooms and corridors. Some doorways have no ! doors; you can walk right through. Others have doors in them, which may be open, closed, or locked. To open a closed door, use ! the `o' (open) command; to close it again, use the `c' (close) command. ! You can get through a locked door by using a tool to pick the lock with the `a' (apply) command, or by kicking it open with the `^D' (kick) command. ! Open doors cannot be entered diagonally; you must approach ! them straight on, horizontally or vertically. Doorways without doors are not restricted in this fashion. ! Doors can be useful for shutting out monsters. Most mon- sters cannot open doors, although a few don't need to (ex. ghosts can walk through doors). ! Secret doors are hidden. You can find them with the `s' ! (search) command. Once found they are in all ways equivalent to normal doors. 5.2. Traps (`^') ! There are traps throughout the dungeon to snare the unwary ! delver. For example, you may suddenly fall into a pit and be stuck for a few turns trying to climb out. Traps don't appear on your map until you see one triggered by moving onto it, see some- thing fall into it, or you discover it with the `s' (search) com- ! mand. Monsters can fall prey to traps, too, which can be a very useful defensive strategy. There is a special pre-mapped branch of the dungeon based on ! the classic computer game ``Sokoban.'' The goal is to push the ! boulders into the pits or holes. With careful foresight, it is ! possible to complete all of the levels according to the tradi- ! tional rules of Sokoban. Some allowances are permitted in case the player gets stuck; however, they will lower your luck. - - NetHack 3.3 August 2, 2000 - - - - - - - NetHack Guidebook 17 - - 5.3. Stairs (`<', `>') In general, each level in the dungeon will have a staircase --- 1036,1090 ---- 5.1. Doorways Doorways connect rooms and corridors. Some doorways have no ! doors; you can walk right through. Others have doors in them, which may be open, closed, or locked. To open a closed door, use ! the `o' (open) command; to close it again, use the `c' (close) command. ! You can get through a locked door by using a tool to pick the lock with the `a' (apply) command, or by kicking it open with the `^D' (kick) command. ! Open doors cannot be entered diagonally; you must approach ! them straight on, horizontally or vertically. Doorways without doors are not restricted in this fashion. ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 17 ! ! ! ! Doors can be useful for shutting out monsters. Most mon- sters cannot open doors, although a few don't need to (ex. ghosts can walk through doors). ! Secret doors are hidden. You can find them with the `s' ! (search) command. Once found they are in all ways equivalent to normal doors. 5.2. Traps (`^') ! There are traps throughout the dungeon to snare the unwary ! delver. For example, you may suddenly fall into a pit and be stuck for a few turns trying to climb out. Traps don't appear on your map until you see one triggered by moving onto it, see some- thing fall into it, or you discover it with the `s' (search) com- ! mand. Monsters can fall prey to traps, too, which can be a very useful defensive strategy. There is a special pre-mapped branch of the dungeon based on ! the classic computer game ``Sokoban.'' The goal is to push the ! boulders into the pits or holes. With careful foresight, it is ! possible to complete all of the levels according to the tradi- ! tional rules of Sokoban. Some allowances are permitted in case the player gets stuck; however, they will lower your luck. 5.3. Stairs (`<', `>') In general, each level in the dungeon will have a staircase *************** *** 1069,1087 **** two down staircases, one continuing into the dungeon and the oth- er branching into an area known as the Gnomish Mines. Those mines eventually hit a dead end, so after exploring them (if you ! choose to do so), you'll need to climb back up to the main ! dungeon. When you traverse a set of stairs, or trigger a trap which ! sends you to another level, the level you're leaving will be ! deactivated and stored in a file on disk. If you're moving to a previously visited level, it will be loaded from its file on disk and reactivated. If you're moving to a level which has not yet been visited, it will be created (from scratch for most random levels, from a template for some ``special'' levels, or loaded from the remains of an earlier game for a ``bones'' level as ! briefly described below). Monsters are only active on the ! current level; those on other levels are essentially placed into stasis. Ordinarily when you climb a set of stairs, you will arrive --- 1094,1112 ---- two down staircases, one continuing into the dungeon and the oth- er branching into an area known as the Gnomish Mines. Those mines eventually hit a dead end, so after exploring them (if you ! choose to do so), you'll need to climb back up to the main dun- ! geon. When you traverse a set of stairs, or trigger a trap which ! sends you to another level, the level you're leaving will be de- ! activated and stored in a file on disk. If you're moving to a previously visited level, it will be loaded from its file on disk and reactivated. If you're moving to a level which has not yet been visited, it will be created (from scratch for most random levels, from a template for some ``special'' levels, or loaded from the remains of an earlier game for a ``bones'' level as ! briefly described below). Monsters are only active on the cur- ! rent level; those on other levels are essentially placed into stasis. Ordinarily when you climb a set of stairs, you will arrive *************** *** 1089,1094 **** --- 1114,1131 ---- pets (see below) and some other monsters will follow along if they're close enough when you travel up or down stairs, and occa- sionally one of these creatures will displace you during the + + + NetHack 3.4 March 20, 2002 + + + + + + NetHack Guidebook 18 + + + climb. When that occurs, the pet or other monster will arrive on the staircase and you will end up nearby. *************** *** 1106,1131 **** magic items can help you locate them before they locate you (which some monsters can do very well). ! The commands `/' and `;' may be used to obtain information ! about those monsters who are displayed on the screen. The com- ! mand `C' allows you to assign a name to a monster, which may be ! useful to help distinguish one from another when multiple mon- ! sters are present. Assigning a name which is just a space will remove any prior name. - - - - NetHack 3.3 August 2, 2000 - - - - - - - NetHack Guidebook 18 - - The extended command ``#chat'' can be used to interact with an adjacent monster. There is no actual dialog (in other words, you don't get to choose what you'll say), but chatting with some --- 1143,1155 ---- magic items can help you locate them before they locate you (which some monsters can do very well). ! The commands `/' and `;' may be used to obtain information ! about those monsters who are displayed on the screen. The com- ! mand `C' allows you to assign a name to a monster, which may be ! useful to help distinguish one from another when multiple mon- ! sters are present. Assigning a name which is just a space will remove any prior name. The extended command ``#chat'' can be used to interact with an adjacent monster. There is no actual dialog (in other words, you don't get to choose what you'll say), but chatting with some *************** *** 1139,1144 **** --- 1163,1178 ---- business unless you attack them. Some of them are very dangerous when angered. Remember: discretion is the better part of valor. + If you can't see a monster (if it is invisible, or if you + are blinded), the symbol `I' will be shown when you learn of its + presence. If you attempt to walk into it, you will try to fight + it just like a monster that you can see; of course, if the mon- + ster has moved, you will attack empty air. If you guess that the + monster has moved and you don't wish to fight, you can use the + `m' command to move without fighting; likewise, if you don't re- + member a monster but want to try fighting anyway, you can use the + `F' command. + 6.2. Your pet You start the game with a little dog (`d'), cat (`f'), or *************** *** 1146,1166 **** sters with you. Like you, your pet needs food to survive. It usually feeds itself on fresh carrion and other meats. If you're worried about it or want to train it, you can feed it, too, by ! throwing it food. A properly trained pet can be very useful ! under certain circumstances. Your pet also gains experience from killing monsters, and can grow over time, gaining hit points and doing more damage. Initially, your pet may even be better at killing things than you, which makes pets useful for low-level characters. ! Your pet will follow you up and down staircases if it is ! next to you when you move. Otherwise your pet will be stranded ! and may become wild. Similarly, when you trigger certain types ! of traps which alter your location (for instance, a trap door ! which drops you to a lower dungeon level), any adjacent pet will accompany you and any non-adjacent pet will be left behind. Your ! pet may trigger such traps itself; you will not be carried along with it even if adjacent at the time. 6.3. Steeds --- 1180,1212 ---- sters with you. Like you, your pet needs food to survive. It usually feeds itself on fresh carrion and other meats. If you're worried about it or want to train it, you can feed it, too, by ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 19 ! ! ! ! throwing it food. A properly trained pet can be very useful un- ! der certain circumstances. Your pet also gains experience from killing monsters, and can grow over time, gaining hit points and doing more damage. Initially, your pet may even be better at killing things than you, which makes pets useful for low-level characters. ! Your pet will follow you up and down staircases if it is ! next to you when you move. Otherwise your pet will be stranded ! and may become wild. Similarly, when you trigger certain types ! of traps which alter your location (for instance, a trap door ! which drops you to a lower dungeon level), any adjacent pet will accompany you and any non-adjacent pet will be left behind. Your ! pet may trigger such traps itself; you will not be carried along with it even if adjacent at the time. 6.3. Steeds *************** *** 1168,1175 **** Some types of creatures in the dungeon can actually be rid- den if you have the right equipment and skill. Convincing a wild beast to let you saddle it up is difficult to say the least. ! Many a dungeoneer has had to resort to magic and wizardry in ord- ! er to forge the alliance. Once you do have the beast under your control however, you can easily climb in and out of the saddle with the `#ride' command. Lead the beast around the dungeon when riding, in the same manner as you would move yourself. It is the --- 1214,1221 ---- Some types of creatures in the dungeon can actually be rid- den if you have the right equipment and skill. Convincing a wild beast to let you saddle it up is difficult to say the least. ! Many a dungeoneer has had to resort to magic and wizardry in or- ! der to forge the alliance. Once you do have the beast under your control however, you can easily climb in and out of the saddle with the `#ride' command. Lead the beast around the dungeon when riding, in the same manner as you would move yourself. It is the *************** *** 1178,1224 **** Riding skill is managed by the `#enhance' command. See the section on Weapon proficiency for more information about that. ! NetHack 3.3 August 2, 2000 ! ! - NetHack Guidebook 19 - 6.4. Bones levels - You may encounter the shades and corpses of other adventur- - ers (or even former incarnations of yourself!) and their personal - effects. Ghosts are hard to kill, but easy to avoid, since - they're slow and do little damage. You can plunder the deceased - adventurer's possessions; however, they are likely to be cursed. - Beware of whatever killed the former player; it is probably still - lurking around, gloating over its last victory. - 7. Objects - When you find something in the dungeon, it is common to want - to pick it up. In NetHack, this is accomplished automatically by - walking over the object (unless you turn off the autopickup op- - tion (see below), or move with the `m' prefix (see above)), or - manually by using the `,' command. - If you're carrying too many items, NetHack will tell you so - and you won't be able to pick up anything more. Otherwise, it - will add the object(s) to your pack and tell you what you just picked up. As you add items to your inventory, you also add the weight ! of that object to your load. The amount that you can carry ! depends on your strength and your constitution. The stronger you are, the less the additional load will affect you. There comes a point, though, when the weight of all of that stuff you are car- rying around with you through the dungeon will encumber you. --- 1224,1268 ---- Riding skill is managed by the `#enhance' command. See the section on Weapon proficiency for more information about that. + 6.4. Bones levels + You may encounter the shades and corpses of other adventur- + ers (or even former incarnations of yourself!) and their personal + effects. Ghosts are hard to kill, but easy to avoid, since + they're slow and do little damage. You can plunder the deceased + adventurer's possessions; however, they are likely to be cursed. + Beware of whatever killed the former player; it is probably still + lurking around, gloating over its last victory. + 7. Objects ! When you find something in the dungeon, it is common to want ! to pick it up. In NetHack, this is accomplished automatically by ! walking over the object (unless you turn off the autopickup op- ! tion (see below), or move with the `m' prefix (see above)), or ! manually by using the `,' command. + If you're carrying too many items, NetHack will tell you so + and you won't be able to pick up anything more. Otherwise, it + will add the object(s) to your pack and tell you what you just + NetHack 3.4 March 20, 2002 + NetHack Guidebook 20 picked up. As you add items to your inventory, you also add the weight ! of that object to your load. The amount that you can carry de- ! pends on your strength and your constitution. The stronger you are, the less the additional load will affect you. There comes a point, though, when the weight of all of that stuff you are car- rying around with you through the dungeon will encumber you. *************** *** 1227,1287 **** you'll be so overloaded that you'll either have to discard some of what you're carrying or collapse under its weight. ! NetHack will tell you how badly you have loaded yourself. ! The symbols `Burdened', `Stressed', `Strained', `Overtaxed' and `Overloaded' are displayed on the bottom line display to indicate your condition. ! When you pick up an object, it is assigned an inventory ! letter. Many commands that operate on objects must ask you to ! find out which object you want to use. When NetHack asks you to ! choose a particular object you are carrying, you are usually ! presented with a list of inventory letters to choose from (see ! Commands, above). ! ! Some objects, such as weapons, are easily differentiated. ! Others, like scrolls and potions, are given descriptions which ! vary according to type. During a game, any two objects with the ! same description are the same type. However, the descriptions will vary from game to game. ! NetHack 3.3 August 2, 2000 - NetHack Guidebook 20 - When you use one of these objects, if its effect is obvious, - NetHack will remember what it is for you. If its effect isn't - extremely obvious, you will be asked what you want to call this - type of object so you will recognize it later. You can also use - the ``#name'' command for the same purpose at any time, to name - all objects of a particular type or just an individual object. - When you use ``#name'' on an object which has already been named, - specifying a space as the value will remove the prior name in- - stead of assigning a new one. - 7.1. Curses and Blessings ! Any object that you find may be cursed, even if the object ! is otherwise helpful. The most common effect of a curse is being ! stuck with (and to) the item. Cursed weapons weld themselves to ! your hand when wielded, so you cannot unwield them. Any cursed ! item you wear is not removable by ordinary means. In addition, ! cursed arms and armor usually, but not always, bear negative en- ! chantments that make them less effective in combat. Other cursed ! objects may act poorly or detrimentally in other ways. ! ! Objects can also be blessed. Blessed items usually work ! better or more beneficially than normal uncursed items. For ex- ! ample, a blessed weapon will do more damage against demons. There are magical means of bestowing or removing curses upon objects, so even if you are stuck with one, you can still have --- 1271,1330 ---- you'll be so overloaded that you'll either have to discard some of what you're carrying or collapse under its weight. ! NetHack will tell you how badly you have loaded yourself. ! The symbols `Burdened', `Stressed', `Strained', `Overtaxed' and `Overloaded' are displayed on the bottom line display to indicate your condition. ! When you pick up an object, it is assigned an inventory let- ! ter. Many commands that operate on objects must ask you to find ! out which object you want to use. When NetHack asks you to ! choose a particular object you are carrying, you are usually pre- ! sented with a list of inventory letters to choose from (see Com- ! mands, above). ! ! Some objects, such as weapons, are easily differentiated. ! Others, like scrolls and potions, are given descriptions which ! vary according to type. During a game, any two objects with the ! same description are the same type. However, the descriptions will vary from game to game. + When you use one of these objects, if its effect is obvious, + NetHack will remember what it is for you. If its effect isn't + extremely obvious, you will be asked what you want to call this + type of object so you will recognize it later. You can also use + the ``#name'' command for the same purpose at any time, to name + all objects of a particular type or just an individual object. + When you use ``#name'' on an object which has already been named, + specifying a space as the value will remove the prior name in- + stead of assigning a new one. + 7.1. Curses and Blessings + Any object that you find may be cursed, even if the object + is otherwise helpful. The most common effect of a curse is being + stuck with (and to) the item. Cursed weapons weld themselves to + your hand when wielded, so you cannot unwield them. Any cursed + item you wear is not removable by ordinary means. In addition, + cursed arms and armor usually, but not always, bear negative en- + chantments that make them less effective in combat. Other cursed + objects may act poorly or detrimentally in other ways. ! Objects can also be blessed. Blessed items usually work ! better or more beneficially than normal uncursed items. For + NetHack 3.4 March 20, 2002 + NetHack Guidebook 21 ! example, a blessed weapon will do more damage against demons. There are magical means of bestowing or removing curses upon objects, so even if you are stuck with one, you can still have *************** *** 1290,1307 **** they can more easily avoid cursed objects than other character roles. ! An item with unknown status will be reported in your inven- tory with no prefix. An item which you know the state of will be ! distinguished in your inventory by the presence of the word ``cursed'', ``uncursed'' or ``blessed'' in the description of the item. 7.2. Weapons (`)') ! Given a chance, most monsters in the Mazes of Menace will ! gratuitously try to kill you. You need weapons for self-defense ! (killing them first). Without a weapon, you do only 1-2 hit ! points of damage (plus bonuses, if any). Monk characters are an exception; they normally do much more damage with bare hands than they do with weapons. --- 1333,1350 ---- they can more easily avoid cursed objects than other character roles. ! An item with unknown status will be reported in your inven- tory with no prefix. An item which you know the state of will be ! distinguished in your inventory by the presence of the word ``cursed'', ``uncursed'' or ``blessed'' in the description of the item. 7.2. Weapons (`)') ! Given a chance, most monsters in the Mazes of Menace will ! gratuitously try to kill you. You need weapons for self-defense ! (killing them first). Without a weapon, you do only 1-2 hit ! points of damage (plus bonuses, if any). Monk characters are an exception; they normally do much more damage with bare hands than they do with weapons. *************** *** 1309,1334 **** weapons, like arrows and spears. To hit monsters with a weapon, you must wield it and attack them, or throw it at them. You can simply elect to throw a spear. To shoot an arrow, you should ! first wield a bow, then throw the arrow. Crossbows shoot ! crossbow bolts. Slings hurl rocks and (other) stones (like ! gems). ! ! ! NetHack 3.3 August 2, 2000 ! ! ! ! ! ! ! NetHack Guidebook 21 ! Enchanted weapons have a ``plus'' (or ``to hit enhancement'' ! which can be either positive or negative) that adds to your ! chance to hit and the damage you do to a monster. The only way to determine a weapon's enchantment is to have it magically iden- ! tified somehow. Most weapons are subject to some type of damage like rust. Such ``erosion'' damage can be repaired. The chance that an attack will successfully hit a monster, --- 1352,1365 ---- weapons, like arrows and spears. To hit monsters with a weapon, you must wield it and attack them, or throw it at them. You can simply elect to throw a spear. To shoot an arrow, you should ! first wield a bow, then throw the arrow. Crossbows shoot cross- ! bow bolts. Slings hurl rocks and (other) stones (like gems). Enchanted weapons have a ``plus'' (or ``to hit enhancement'' ! which can be either positive or negative) that adds to your ! chance to hit and the damage you do to a monster. The only way to determine a weapon's enchantment is to have it magically iden- ! tified somehow. Most weapons are subject to some type of damage like rust. Such ``erosion'' damage can be repaired. The chance that an attack will successfully hit a monster, *************** *** 1340,1366 **** of armor - is a factor too; also, some monsters are particularly vulnerable to certain types of weapons. ! Many weapons can be wielded in one hand; some require both ! hands. When wielding a two-handed weapon, you can not wear a ! shield, and vice versa. When wielding a one-handed weapon, you ! can have another weapon ready to use by setting things up with ! the `x' command, which exchanges your primary (the one being ! wielded) and secondary weapons. And if you have proficiency in ! the ``two weapon combat'' skill, you may wield both primary and ! secondary weapons simultaneously; use the `#twoweapon' extended ! command to engage or disengage that. Only some types of charac- ! ters (barbarians, for instance), have the necessary skill avail- ! able. Even with that skill, using two weapons at once incurs a ! penalty in the chance to hit your target compared to using just one weapon at a time. ! There might be times when you'd rather not wield any weapon ! at all. To accomplish that, wield `-', or else use the `A' com- ! mand which allows you to unwield the current weapon in addition to taking off other worn items. Those of you in the audience who are AD&D players, be aware ! that each weapon which exists in AD&D does roughly the same dam- age to monsters in NetHack. Some of the more obscure weapons (such as the aklys, lucern hammer, and bec-de-corbin) are defined in an appendix to Unearthed Arcana, an AD&D supplement. --- 1371,1409 ---- of armor - is a factor too; also, some monsters are particularly vulnerable to certain types of weapons. ! Many weapons can be wielded in one hand; some require both ! hands. When wielding a two-handed weapon, you can not wear a ! shield, and vice versa. When wielding a one-handed weapon, you ! can have another weapon ready to use by setting things up with ! the `x' command, which exchanges your primary (the one being ! wielded) and secondary weapons. And if you have proficiency in ! the ``two weapon combat'' skill, you may wield both primary and ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 22 ! ! ! ! secondary weapons simultaneously; use the `#twoweapon' extended ! command to engage or disengage that. Only some types of charac- ! ters (barbarians, for instance) have the necessary skill avail- ! able. Even with that skill, using two weapons at once incurs a ! penalty in the chance to hit your target compared to using just one weapon at a time. ! There might be times when you'd rather not wield any weapon ! at all. To accomplish that, wield `-', or else use the `A' com- ! mand which allows you to unwield the current weapon in addition to taking off other worn items. Those of you in the audience who are AD&D players, be aware ! that each weapon which existed in AD&D does roughly the same dam- age to monsters in NetHack. Some of the more obscure weapons (such as the aklys, lucern hammer, and bec-de-corbin) are defined in an appendix to Unearthed Arcana, an AD&D supplement. *************** *** 1376,1421 **** in your inventory which are considered likely to be thrown, or picking `*' will list your entire inventory. After you've chosen what to throw, you will be prompted for a direction rather than ! for a specific target. The distance something can be thrown ! depends mainly on the type of object and your strength. Arrows ! NetHack 3.3 August 2, 2000 - NetHack Guidebook 22 - can be thrown by hand, but can be thrown much farther and will be - more likely to hit when thrown while you are wielding a bow. - You can simplify the throwing operation by using the `Q' - command to select your preferred ``missile'', then using the `f' - command to throw it. You'll be prompted for a direction as - above, but you don't have to specify which item to throw each - time you use `f'. There is also an option, autoquiver, which has - NetHack choose another item to automatically fill your quiver - when the inventory slot used for `Q' runs out. ! Some characters will throw multiple items in a single ac- ! tion. Rangers, for instance, or anyone who achieves a high level ! of proficiency in the relevant weapon skill (in bow skill if ! you're wielding one to shoot arrows, or in sling skill if you're ! wielding one to shoot stones). There is little you can do to ! control this; if NetHack decides that you'll be shooting 3 arrows ! on the current shot, then three arrows will travel in the direc- ! tion you've indicated, even if the first or second succeeds in ! killing the target. You can explicitly limit the number of shots ! by using a numeric prefix before the `t' or `f' command. For ex- ! ample, ``2f'' (or ``n2f'' if using number_pad mode) would ensure ! that at most 2 arrows are shot even if NetHack decides that your ! skill warrants 3. If you specify a larger number than would have ! been shot (``4f'' in this example), you'll just end up shooting ! the same number (3, here) as if no limit had been specified. 7.2.2. Weapon proficiency --- 1419,1468 ---- in your inventory which are considered likely to be thrown, or picking `*' will list your entire inventory. After you've chosen what to throw, you will be prompted for a direction rather than ! for a specific target. The distance something can be thrown de- ! pends mainly on the type of object and your strength. Arrows can ! be thrown by hand, but can be thrown much farther and will be ! more likely to hit when thrown while you are wielding a bow. + You can simplify the throwing operation by using the `Q' + command to select your preferred ``missile'', then using the `f' + command to throw it. You'll be prompted for a direction as + above, but you don't have to specify which item to throw each + time you use `f'. There is also an option, autoquiver, which has + NetHack choose another item to automatically fill your quiver + when the inventory slot used for `Q' runs out. ! Some characters have the ability to fire a volley of multi- ! ple items in a single turn. Knowing how to load several rounds ! of ammunition at once -- or hold several missiles in your hand -- ! and still hit a target is not an easy task. Rangers are among ! those who are adept at this task, as are those with a high level ! of proficiency in the relevant weapon skill (in bow skill if ! you're wielding one to shoot arrows, in crossbow skill if you're ! wielding one to shoot bolts, or in sling skill if you're wielding ! one to shoot stones). The number of items that the character has ! a chance to fire varies from turn to turn. You can explicitly ! limit the number of shots by using a numeric prefix before the ! `t' or `f' command. For example, ``2f'' (or ``n2f'' if using + NetHack 3.4 March 20, 2002 + NetHack Guidebook 23 ! number_pad mode) would ensure that at most 2 arrows are shot even ! if you could have fired 3. If you specify a larger number than ! would have been shot (``4f'' in this example), you'll just end up ! shooting the same number (3, here) as if no limit had been speci- ! fied. Once the volley is in motion, all of the items will travel ! in the same direction; if the first ones kill a monster, the oth- ! ers can still continue beyond that spot. 7.2.2. Weapon proficiency *************** *** 1432,1461 **** become highly skilled in daggers or staves but not in swords or bows. ! The `#enhance' extended command is used to review current ! weapons proficiency (also spell proficiency) and to choose which skill(s) to improve when you've used one or more skills enough to become eligible to do so. The skill rankings are ``none'' (some- ! times also referred to as ``restricted'', because you won't be ! able to advance), ``unskilled'', ``basic'', ``skilled'', and ``expert''. Restricted skills simply will not appear in the list ! shown by `#enhance'. (Divine intervention might unrestrict a particular skill, in which case it will start at unskilled and be ! limited to basic.) Some characters can enhance their barehanded ! combat or martial arts skill beyond expert to ``master'' or ``grand master''. - - NetHack 3.3 August 2, 2000 - - - - - - - NetHack Guidebook 23 - - Use of a weapon in which you're restricted or unskilled will incur a modest penalty in the chance to hit a monster and also in the amount of damage done when you do hit; at basic level, there --- 1479,1497 ---- become highly skilled in daggers or staves but not in swords or bows. ! The `#enhance' extended command is used to review current ! weapons proficiency (also spell proficiency) and to choose which skill(s) to improve when you've used one or more skills enough to become eligible to do so. The skill rankings are ``none'' (some- ! times also referred to as ``restricted'', because you won't be ! able to advance), ``unskilled'', ``basic'', ``skilled'', and ``expert''. Restricted skills simply will not appear in the list ! shown by `#enhance'. (Divine intervention might unrestrict a particular skill, in which case it will start at unskilled and be ! limited to basic.) Some characters can enhance their barehanded ! combat or martial arts skill beyond expert to ``master'' or ``grand master''. Use of a weapon in which you're restricted or unskilled will incur a modest penalty in the chance to hit a monster and also in the amount of damage done when you do hit; at basic level, there *************** *** 1471,1484 **** tal overall skills, so you need to actively choose which skills to enhance and which to ignore. 7.3. Armor (`[') Lots of unfriendly things lurk about; you need armor to pro- tect yourself from their blows. Some types of armor offer better ! protection than others. Your armor class is a measure of this protection. Armor class (AC) is measured as in AD&D, with 10 be- ! ing the equivalent of no armor, and lower numbers meaning better ! armor. Each suit of armor which exists in AD&D gives the same protection in NetHack. Here is an (incomplete) list of the armor classes provided by various suits of armor: --- 1507,1535 ---- tal overall skills, so you need to actively choose which skills to enhance and which to ignore. + + + + + + NetHack 3.4 March 20, 2002 + + + + + + NetHack Guidebook 24 + + + 7.3. Armor (`[') Lots of unfriendly things lurk about; you need armor to pro- tect yourself from their blows. Some types of armor offer better ! protection than others. Your armor class is a measure of this protection. Armor class (AC) is measured as in AD&D, with 10 be- ! ing the equivalent of no armor, and lower numbers meaning better ! armor. Each suit of armor which exists in AD&D gives the same protection in NetHack. Here is an (incomplete) list of the armor classes provided by various suits of armor: *************** *** 1505,1546 **** can only wear one item of each category (one suit of armor, one cloak, one helmet, one shield, and so on) at a time. ! If a piece of armor is enchanted, its armor protection will ! be better (or worse) than normal, and its ``plus'' (or minus) ! will subtract from your armor class. For example, a +1 chain ! mail would give you better protection than normal chain mail, lowering your armor class one unit further to 4. When you put on - NetHack 3.3 August 2, 2000 - NetHack Guidebook 24 - a piece of armor, you immediately find out the armor class and - any ``plusses'' it provides. Cursed pieces of armor usually have - negative enchantments (minuses) in addition to being unremovable. - Many types of armor are subject to some kind of damage like - rust. Such damage can be repaired. Some types of armor may in- - hibit spell casting. ! The commands to use armor are `W' (wear) and `T' (take off). ! The `A' command can also be used to take off armor as well as ! other worn items. 7.4. Food (`%') ! Food is necessary to survive. If you go too long without ! eating you will faint, and eventually die of starvation. Some ! types of food will spoil, and become unhealthy to eat, if not protected. Food stored in ice boxes or tins (``cans'') will usu- ! ally stay fresh, but ice boxes are heavy, and tins take a while to open. When you kill monsters, they usually leave corpses which are --- 1556,1600 ---- can only wear one item of each category (one suit of armor, one cloak, one helmet, one shield, and so on) at a time. ! If a piece of armor is enchanted, its armor protection will ! be better (or worse) than normal, and its ``plus'' (or minus) ! will subtract from your armor class. For example, a +1 chain ! mail would give you better protection than normal chain mail, lowering your armor class one unit further to 4. When you put on + a piece of armor, you immediately find out the armor class and + any ``plusses'' it provides. Cursed pieces of armor usually have + negative enchantments (minuses) in addition to being unremovable. + + Many types of armor are subject to some kind of damage like + rust. Such damage can be repaired. Some types of armor may in- + hibit spell casting. + The commands to use armor are `W' (wear) and `T' (take off). + The `A' command can also be used to take off armor as well as + other worn items. + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 25 ! ! 7.4. Food (`%') ! Food is necessary to survive. If you go too long without ! eating you will faint, and eventually die of starvation. Some ! types of food will spoil, and become unhealthy to eat, if not protected. Food stored in ice boxes or tins (``cans'') will usu- ! ally stay fresh, but ice boxes are heavy, and tins take a while to open. When you kill monsters, they usually leave corpses which are *************** *** 1548,1557 **** give you special powers when you eat them. A good rule of thumb is ``you are what you eat.'' ! Some character roles and some monsters are vegetarian. ! Vegetarian monsters will typically never eat animal corpses, ! while vegetarian players can, but with some rather unpleasant ! side-effects. You can name one food item after something you like to eat with the fruit option. --- 1602,1611 ---- give you special powers when you eat them. A good rule of thumb is ``you are what you eat.'' ! Some character roles and some monsters are vegetarian. Veg- ! etarian monsters will typically never eat animal corpses, while ! vegetarian players can, but with some rather unpleasant side-ef- ! fects. You can name one food item after something you like to eat with the fruit option. *************** *** 1560,1567 **** 7.5. Scrolls (`?') ! Scrolls are labeled with various titles, probably chosen by ! ancient wizards for their amusement value (ex. ``READ ME,'' or ``THANX MAUD'' backwards). Scrolls disappear after you read them (except for blank ones, without magic spells on them). --- 1614,1621 ---- 7.5. Scrolls (`?') ! Scrolls are labeled with various titles, probably chosen by ! ancient wizards for their amusement value (ex. ``READ ME,'' or ``THANX MAUD'' backwards). Scrolls disappear after you read them (except for blank ones, without magic spells on them). *************** *** 1576,1606 **** feature on versions where NetHack mail delivery is triggered by electronic mail appearing in your system mailbox, you must let NetHack know where to look for new mail by setting the ``MAIL'' - NetHack 3.3 August 2, 2000 - NetHack Guidebook 25 - environment variable to the file name of your mailbox. You may - also want to set the ``MAILREADER'' environment variable to the - file name of your favorite reader, so NetHack can shell to it - when you read the scroll. On versions of NetHack where mail is - randomly generated internal to the game, these environment vari- - ables are ignored. You can disable the mail daemon by turning - off the mail option. ! The command to read a scroll is `r'. 7.6. Potions (`!') ! Potions are distinguished by the color of the liquid inside the flask. They disappear after you quaff them. Clear potions are potions of water. Sometimes these are --- 1630,1662 ---- feature on versions where NetHack mail delivery is triggered by electronic mail appearing in your system mailbox, you must let NetHack know where to look for new mail by setting the ``MAIL'' + environment variable to the file name of your mailbox. You may + also want to set the ``MAILREADER'' environment variable to the + file name of your favorite reader, so NetHack can shell to it + when you read the scroll. On versions of NetHack where mail is + randomly generated internal to the game, these environment vari- + ables are ignored. You can disable the mail daemon by turning + off the mail option. + The command to read a scroll is `r'. + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 26 ! ! 7.6. Potions (`!') ! Potions are distinguished by the color of the liquid inside the flask. They disappear after you quaff them. Clear potions are potions of water. Sometimes these are *************** *** 1614,1623 **** 7.7. Wands (`/') Magic wands usually have multiple magical charges. Some ! wands are directional-you must give a direction in which to zap them. You can also zap them at yourself (just give a `.' or `s' for the direction). Be warned, however, for this is often unwise. ! Other wands are nondirectional-they don't require a direction. The number of charges in a wand is random and decreases by one whenever you use it. --- 1670,1679 ---- 7.7. Wands (`/') Magic wands usually have multiple magical charges. Some ! wands are directional--you must give a direction in which to zap them. You can also zap them at yourself (just give a `.' or `s' for the direction). Be warned, however, for this is often unwise. ! Other wands are nondirectional--they don't require a direction. The number of charges in a wand is random and decreases by one whenever you use it. *************** *** 1631,1638 **** the wand is recharged. In a truly desperate situation, when your back is up against ! the wall, you might decide to go for broke and break your wand. ! This is not for the faint of heart. Doing so will almost cer- tainly cause a catastrophic release of magical energies. When you have fully identified a particular wand, inventory --- 1687,1694 ---- the wand is recharged. In a truly desperate situation, when your back is up against ! the wall, you might decide to go for broke and break your wand. ! This is not for the faint of heart. Doing so will almost cer- tainly cause a catastrophic release of magical energies. When you have fully identified a particular wand, inventory *************** *** 1641,1672 **** then by its current number of charges. A current charge count of -1 is a special case indicating that the wand has been cancelled. ! NetHack 3.3 August 2, 2000 ! - NetHack Guidebook 26 ! The command to use a wand is `z' (zap). To break one, use ! the `a' (apply) command. - 7.8. Rings (`=') - Rings are very useful items, since they are relatively per- - manent magic, unlike the usually fleeting effects of potions, - scrolls, and wands. - - Putting on a ring activates its magic. You can wear only - two rings, one on each ring finger. ! Most rings also cause you to grow hungry more rapidly, the rate varying with the type of ring. The commands to use rings are `P' (put on) and `R' (remove). --- 1697,1726 ---- then by its current number of charges. A current charge count of -1 is a special case indicating that the wand has been cancelled. + The command to use a wand is `z' (zap). To break one, use + the `a' (apply) command. + 7.8. Rings (`=') + Rings are very useful items, since they are relatively per- + manent magic, unlike the usually fleeting effects of potions, + scrolls, and wands. ! Putting on a ring activates its magic. You can wear only ! two rings, one on each ring finger. + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 27 ! Most rings also cause you to grow hungry more rapidly, the rate varying with the type of ring. The commands to use rings are `P' (put on) and `R' (remove). *************** *** 1674,1696 **** 7.9. Spellbooks (`+') Spellbooks are tomes of mighty magic. When studied with the ! `r' (read) command, they transfer to the reader the knowledge of ! a spell (and therefore eventually become unreadable) - unless the ! attempt backfires. Reading a cursed spellbook or one with mystic ! runes beyond your ken can be harmful to your health! ! ! A spell (even when learned) can also backfire when you cast ! it. If you attempt to cast a spell well above your experience ! level, or if you have little skill with the appropriate spell ! type, or cast it at a time when your luck is particularly bad, ! you can end up wasting both the energy and the time required in casting. Casting a spell calls forth magical energies and focuses ! them with your naked mind. Releasing the magical energy releases ! some of your memory of the spell with it. Each time you cast a ! spell, your familiarity with it will dwindle, until you eventual- ! ly forget the details completely and must relearn it. Just as weapons are divided into groups in which a character can become proficient (to varying degrees), spells are similarly --- 1728,1758 ---- 7.9. Spellbooks (`+') Spellbooks are tomes of mighty magic. When studied with the ! `r' (read) command, they transfer to the reader the knowledge of ! a spell (and therefore eventually become unreadable) -- unless ! the attempt backfires. Reading a cursed spellbook or one with ! mystic runes beyond your ken can be harmful to your health! ! ! A spell (even when learned) can also backfire when you cast ! it. If you attempt to cast a spell well above your experience ! level, or if you have little skill with the appropriate spell ! type, or cast it at a time when your luck is particularly bad, ! you can end up wasting both the energy and the time required in casting. Casting a spell calls forth magical energies and focuses ! them with your naked mind. Some of the magical energy released ! comes from within you, and casting several spells in a row may ! tire you. Casting of spells also requires practice. With prac- ! tice, your skill in each category of spell casting will improve. ! Over time, however, your memory of each spell will dim, and you ! will need to relearn it. ! ! Some spells are directional--you must give a direction in ! which to cast them. You can also cast them at yourself (just ! give a `.' or `s' for the direction). Be warned, however, for ! this is often unwise. Other spells are nondirectional--they ! don't require a direction. Just as weapons are divided into groups in which a character can become proficient (to varying degrees), spells are similarly *************** *** 1703,1731 **** various types of armor may interfere with that. The command to read a spellbook is the same as for scrolls, ! `r' (read). The `+' command lists your current spells and the ! number of spell points they require. The `Z' (cast) command ! casts a spell. ! - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 27 - 7.10. Tools (`(') ! Tools are miscellaneous objects with various purposes. Some ! tools have a limited number of uses, akin to wand charges. For ! example, lamps burn out after a while. Other tools are con- ! tainers, which objects can be placed into or taken out of. The command to use tools is `a' (apply). --- 1765,1792 ---- various types of armor may interfere with that. The command to read a spellbook is the same as for scrolls, ! `r' (read). The `+' command lists your current spells, their ! levels, categories, and chances for failure. The `Z' (cast) com- ! mand casts a spell. + 7.10. Tools (`(') + Tools are miscellaneous objects with various purposes. Some + tools have a limited number of uses, akin to wand charges. For + example, lamps burn out after a while. Other tools are + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 28 ! containers, which objects can be placed into or taken out of. The command to use tools is `a' (apply). *************** *** 1758,1765 **** 7.12. Gems (`*') ! Some gems are valuable, and can be sold for a lot of gold. ! They are also a far more efficient way of carrying your riches. Valuable gems increase your score if you bring them with you when you exit. --- 1819,1826 ---- 7.12. Gems (`*') ! Some gems are valuable, and can be sold for a lot of gold. ! They are also a far more efficient way of carrying your riches. Valuable gems increase your score if you bring them with you when you exit. *************** *** 1770,1793 **** 7.13. Large rocks (``') ! Statues and boulders are not particularly useful, and are ! generally heavy. It is rumored that some statues are not what they seem. - NetHack 3.3 August 2, 2000 - NetHack Guidebook 28 ! Very large humanoids (giants and their ilk) have been known ! to use boulders as weapons. 7.14. Gold (`$') --- 1831,1856 ---- 7.13. Large rocks (``') ! Statues and boulders are not particularly useful, and are ! generally heavy. It is rumored that some statues are not what they seem. + Very large humanoids (giants and their ilk) have been known + to use boulders as weapons. + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 29 ! ! 7.14. Gold (`$') *************** *** 1799,1877 **** 8. Conduct ! As if winning NetHack were not difficult enough, certain ! players seek to challenge themselves by imposing restrictions on ! the way they play the game. The game automatically tracks some ! of these challenges, which can be checked at any time with the ! #conduct command or at the end of the game. When you perform an ! action which breaks a challenge, it will no longer be listed. This gives players extra ``bragging rights'' for winning the game ! with these challenges. Note that it is perfectly acceptable to ! win the game without resorting to these restrictions and that it ! is unusual for players to adhere to challenges the first time they win the game. ! Several of the challenges are related to eating behavior. ! The most difficult of these is the foodless challenge. Although creatures can survive long periods of time without food, there is ! a physiological need for water; thus there is no restriction on ! drinking beverages, even if they provide some minor food bene- ! fits. Calling upon your god for help with starvation does not violate any food challenges either. ! A strict vegan diet is one which avoids any food derived ! from animals. The primary source of nutrition is fruits and ! vegetables. The corpses and tins of blobs (`b'), jellies (`j'), ! and fungi (`F') are also considered to be vegetable matter. Cer- ! tain human food is prepared without animal products; namely, lem- ! bas wafers, cram rations, food rations (gunyoki), K-rations, and ! C-rations. Metal or another normally indigestible material eaten while polymorphed into a creature that can digest it is also con- ! sidered vegan food. Note however that eating such items still counts against foodless conduct. ! Vegetarians do not eat animals; however, they are less ! selective about eating animal byproducts than vegans. In addi- ! tion to the vegan items listed above, they may eat any kind of ! pudding (`P') other than the black puddings, eggs and food made ! from eggs (fortune cookies and pancakes), food made with milk ! (cream pies and candy bars), and lumps of royal jelly. Monks are ! expected to observe a vegetarian diet. Eating any kind of meat violates the vegetarian, vegan, and foodless conducts. This includes tripe rations, the corpses or ! NetHack 3.3 August 2, 2000 - NetHack Guidebook 29 ! tins of any monsters not mentioned above, and the various other ! chunks of meat found in the dungeon. Swallowing and digesting a ! monster while polymorphed is treated as if you ate the creature's ! corpse. Eating leather, dragon hide, or bone items while po- ! lymorphed into a creature that can digest it, or eating monster ! brains while polymorphed into a (master) mind flayer, is con- ! sidered eating an animal, although wax is only an animal bypro- ! duct. ! Regardless of conduct, there will be some items which are ! indigestible, and others which are hazardous to eat. Using a swallow-and-digest attack against a monster is equivalent to eat- ing the monster's corpse. Please note that the term ``vegan'' is ! used here only in the context of diet. You are still free to ! choose not to use or wear items derived from animals (e.g. leath- ! er, dragon hide, bone, horns, coral), but the game will not keep ! track of this for you. Also note that ``milky'' potions may be a ! translucent white, but they do not contain milk, so they are com- ! patible with a vegan diet. Slime molds or player-defined ! ``fruits'', although they could be anything from ``cherries'' to ``pork chops'', are also assumed to be vegan. An atheist is one who rejects religion. This means that you --- 1862,1939 ---- 8. Conduct ! As if winning NetHack were not difficult enough, certain ! players seek to challenge themselves by imposing restrictions on ! the way they play the game. The game automatically tracks some ! of these challenges, which can be checked at any time with the ! #conduct command or at the end of the game. When you perform an ! action which breaks a challenge, it will no longer be listed. This gives players extra ``bragging rights'' for winning the game ! with these challenges. Note that it is perfectly acceptable to ! win the game without resorting to these restrictions and that it ! is unusual for players to adhere to challenges the first time they win the game. ! Several of the challenges are related to eating behavior. ! The most difficult of these is the foodless challenge. Although creatures can survive long periods of time without food, there is ! a physiological need for water; thus there is no restriction on ! drinking beverages, even if they provide some minor food bene- ! fits. Calling upon your god for help with starvation does not violate any food challenges either. ! A strict vegan diet is one which avoids any food derived ! from animals. The primary source of nutrition is fruits and veg- ! etables. The corpses and tins of blobs (`b'), jellies (`j'), and ! fungi (`F') are also considered to be vegetable matter. Certain ! human food is prepared without animal products; namely, lembas ! wafers, cram rations, food rations (gunyoki), K-rations, and C- ! rations. Metal or another normally indigestible material eaten while polymorphed into a creature that can digest it is also con- ! sidered vegan food. Note however that eating such items still counts against foodless conduct. ! Vegetarians do not eat animals; however, they are less se- ! lective about eating animal byproducts than vegans. In addition ! to the vegan items listed above, they may eat any kind of pudding ! (`P') other than the black puddings, eggs and food made from eggs ! (fortune cookies and pancakes), food made with milk (cream pies ! and candy bars), and lumps of royal jelly. Monks are expected to ! observe a vegetarian diet. Eating any kind of meat violates the vegetarian, vegan, and foodless conducts. This includes tripe rations, the corpses or + tins of any monsters not mentioned above, and the various other + chunks of meat found in the dungeon. Swallowing and digesting a + monster while polymorphed is treated as if you ate the creature's ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 30 ! corpse. Eating leather, dragon hide, or bone items while poly- ! morphed into a creature that can digest it, or eating monster ! brains while polymorphed into a (master) mind flayer, is consid- ! ered eating an animal, although wax is only an animal byproduct. ! Regardless of conduct, there will be some items which are ! indigestible, and others which are hazardous to eat. Using a swallow-and-digest attack against a monster is equivalent to eat- ing the monster's corpse. Please note that the term ``vegan'' is ! used here only in the context of diet. You are still free to ! choose not to use or wear items derived from animals (e.g. ! leather, dragon hide, bone, horns, coral), but the game will not ! keep track of this for you. Also note that ``milky'' potions may ! be a translucent white, but they do not contain milk, so they are ! compatible with a vegan diet. Slime molds or player-defined ! ``fruits'', although they could be anything from ``cherries'' to ``pork chops'', are also assumed to be vegan. An atheist is one who rejects religion. This means that you *************** *** 1885,1899 **** figure; a true atheist would hear the words but attach no special meaning to them. ! Most players fight with a wielded weapon (or tool intended to be wielded as a weapon). Another challenge is to win the game ! without using such a wielded weapon. You are still permitted to ! throw, fire, and kick weapons; use a wand, spell, or other type of item; or fight with your hands and feet. ! In NetHack, a pacifist refuses to cause the death of any ! other monster (i.e. if you would get experience for the death). ! This is a particularly difficult challenge, although it is still possible to gain experience by other means. An illiterate character cannot read or write. This includes --- 1947,1961 ---- figure; a true atheist would hear the words but attach no special meaning to them. ! Most players fight with a wielded weapon (or tool intended to be wielded as a weapon). Another challenge is to win the game ! without using such a wielded weapon. You are still permitted to ! throw, fire, and kick weapons; use a wand, spell, or other type of item; or fight with your hands and feet. ! In NetHack, a pacifist refuses to cause the death of any ! other monster (i.e. if you would get experience for the death). ! This is a particularly difficult challenge, although it is still possible to gain experience by other means. An illiterate character cannot read or write. This includes *************** *** 1906,1927 **** starting inventory is assumed to be learned from your teachers prior to the start of the game and isn't counted. ! NetHack 3.3 August 2, 2000 - NetHack Guidebook 30 - There are several other minor challenges. It is possible to - eliminate a species of monsters by genocide; playing without this - feature is considered a challenge. You can change the form of - any object into another object of the same type (``polypiling'') or the form of your own body into another creature (``polyself'') by wand, spell, or potion of polymorph; avoiding these effects are each considered challenges. Finally, you may sometimes re- --- 1968,1989 ---- starting inventory is assumed to be learned from your teachers prior to the start of the game and isn't counted. + There are several other minor challenges. It is possible to + eliminate a species of monsters by genocide; playing without this + feature is considered a challenge. You can change the form of + any object into another object of the same type (``polypiling'') ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 31 or the form of your own body into another creature (``polyself'') by wand, spell, or potion of polymorph; avoiding these effects are each considered challenges. Finally, you may sometimes re- *************** *** 1932,1964 **** 9. Options ! Due to variations in personal tastes and conceptions of how NetHack should do things, there are options you can set to change how NetHack behaves. 9.1. Setting the options ! Options may be set in a number of ways. Within the game, the `O' command allows you to view all options and change most of ! them. You can also set options automatically by placing them in ! the NETHACKOPTIONS environment variable or in a configuration file. Some versions of NetHack also have front-end programs that allow you to set options before starting the game. 9.2. Using the NETHACKOPTIONS environment variable ! The NETHACKOPTIONS variable is a comma-separated list of in- ! itial values for the various options. Some can only be turned on ! or off. You turn one of these on by adding the name of the op- ! tion to the list, and turn it off by typing a `!' or ``no'' be- fore the name. Others take a character string as a value. You can set string options by typing the option name, a colon or equals sign, and then the value of the string. The value is ter- minated by the next comma or the end of string. For example, to set up an environment variable so that ``au- ! toquiver'' is on, ``autopickup'' is off, the name is set to ! ``Blue Meanie'', and the fruit is set to ``papaya'', you would enter the command % setenv NETHACKOPTIONS "autoquiver,\!autopickup,name:Blue Meanie,fruit:papaya" --- 1994,2026 ---- 9. Options ! Due to variations in personal tastes and conceptions of how NetHack should do things, there are options you can set to change how NetHack behaves. 9.1. Setting the options ! Options may be set in a number of ways. Within the game, the `O' command allows you to view all options and change most of ! them. You can also set options automatically by placing them in ! the NETHACKOPTIONS environment variable or in a configuration file. Some versions of NetHack also have front-end programs that allow you to set options before starting the game. 9.2. Using the NETHACKOPTIONS environment variable ! The NETHACKOPTIONS variable is a comma-separated list of ! initial values for the various options. Some can only be turned ! on or off. You turn one of these on by adding the name of the ! option to the list, and turn it off by typing a `!' or ``no'' be- fore the name. Others take a character string as a value. You can set string options by typing the option name, a colon or equals sign, and then the value of the string. The value is ter- minated by the next comma or the end of string. For example, to set up an environment variable so that ``au- ! toquiver'' is on, ``autopickup'' is off, the name is set to ! ``Blue Meanie'', and the fruit is set to ``papaya'', you would enter the command % setenv NETHACKOPTIONS "autoquiver,\!autopickup,name:Blue Meanie,fruit:papaya" *************** *** 1971,2005 **** in sh or ksh. ! NetHack 3.3 August 2, 2000 ! ! NetHack Guidebook 31 - 9.3. Using a configuration file ! Any line in the configuration file starting with ``OP- ! TIONS='' may be filled out with options in the same syntax as in ! NETHACKOPTIONS. Any line starting with ``DUNGEON='', ``EF- ! FECTS='', ``MONSTERS='', ``OBJECTS='', or ``TRAPS='' is taken as ! defining the corresponding dungeon, effects, monsters, objects or ! traps option in a different syntax, a sequence of decimal numbers ! giving the character position in the current font to be used in ! displaying each entry. Such a sequence can be continued to mul- ! tiple lines by putting a `\' at the end of each line to be con- ! tinued. Any line starting with `#' is treated as a comment. ! ! The default name of the configuration file varies on dif- ! ferent operating systems, but NETHACKOPTIONS can also be set to ! the full name of a file you want to use (possibly preceded by an `@'). 9.4. Customization options --- 2033,2067 ---- in sh or ksh. + 9.3. Using a configuration file + Any line in the configuration file starting with ``OP- + TIONS='' may be filled out with options in the same syntax as in + NETHACKOPTIONS. Any line starting with ``DUNGEON='', ! NetHack 3.4 March 20, 2002 ! NetHack Guidebook 32 ! ``EFFECTS='', ``MONSTERS='', ``OBJECTS='', ``TRAPS='', or ``BOUL- ! DER='' is taken as defining the corresponding dungeon, effects, ! monsters, objects traps or boulder option in a different syntax, ! a sequence of decimal numbers giving the character position in ! the current font to be used in displaying each entry. Such a se- ! quence can be continued to multiple lines by putting a `\' at the ! end of each line to be continued. Any line starting with `#' is ! treated as a comment. ! ! The default name of the configuration file varies on differ- ! ent operating systems, but NETHACKOPTIONS can also be set to the ! full name of a file you want to use (possibly preceded by an `@'). 9.4. Customization options *************** *** 2014,2031 **** default is to randomly pick an appropriate alignment. Can- not be set with the `O' command. autopickup Automatically pick up things onto which you move (default on). autoquiver ! This option controls what happens when you attempt the `f' (fire) command with an empty quiver. When true, the comput- ! er will fill your quiver with some suitable weapon. Note ! that it will not take into account the blessed/cursed ! status, enchantment, damage, or quality of the weapon; you ! are free to manually fill your quiver with the `Q' command ! instead. If no weapon is found or the option is false, the `t' (throw) command is executed instead. (default false) BIOS --- 2076,2097 ---- default is to randomly pick an appropriate alignment. Can- not be set with the `O' command. + autodig + Automatically dig if you are wielding a digging tool and + moving into a place that can be dug (default false). + autopickup Automatically pick up things onto which you move (default on). autoquiver ! This option controls what happens when you attempt the `f' (fire) command with an empty quiver. When true, the comput- ! er will fill your quiver with some suitable weapon. Note ! that it will not take into account the blessed/cursed sta- ! tus, enchantment, damage, or quality of the weapon; you are ! free to manually fill your quiver with the `Q' command in- ! stead. If no weapon is found or the option is false, the `t' (throw) command is executed instead. (default false) BIOS *************** *** 2034,2079 **** on machines with an IBM PC compatible BIOS ROM (default off, OS/2, PC, and ST NetHack only). ! catname ! Name your starting cat (ex. ``catname:Morris''). Cannot be ! set with the `O' command. ! NetHack 3.3 August 2, 2000 - NetHack Guidebook 32 character ! Pick your type of character (ex. ``character:Monk''); ! synonym for ``role''. See ``name'' for an alternate method ! of specifying your role. Normally only the first letter of ! the value is examined; the string ``random'' is an excep- ! tion. checkpoint ! Save game state after each level change, for possible ! recovery after program crash (default on). checkspace ! Check free disk space before writing files to disk (default ! on). You may have to turn this off if you have more than 2 ! GB free space on the partition used for your save and level ! files. Only applies when MFLOPPY was defined during compi- lation. - color - Use color for different monsters, objects, and dungeon - features (default on for microcomputers). - confirm ! Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). DECgraphics --- 2100,2144 ---- on machines with an IBM PC compatible BIOS ROM (default off, OS/2, PC, and ST NetHack only). ! boulder ! Set the character used to display boulders (default is rock ! class symbol). ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 33 + + catname + Name your starting cat (ex. ``catname:Morris''). Cannot be + set with the `O' command. character ! Pick your type of character (ex. ``character:Monk''); syn- ! onym for ``role''. See ``name'' for an alternate method of ! specifying your role. Normally only the first letter of the ! value is examined; the string ``random'' is an exception. checkpoint ! Save game state after each level change, for possible recov- ! ery after program crash (default on). checkspace ! Check free disk space before writing files to disk (default ! on). You may have to turn this off if you have more than 2 ! GB free space on the partition used for your save and level ! files. Only applies when MFLOPPY was defined during compi- lation. confirm ! Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). DECgraphics *************** *** 2086,2204 **** override the selections with your own graphics strings. disclose ! Offer to disclose various information when the game ends ! (default all). The possibilities are identifying your in- ! ventory ('i'), disclosing your attributes ('a'), summarizing ! monsters that have been vanquished ('v'), listing monster ! species that have been genocided ('g'), and displaying your ! conduct ('c'). Note that the vanquished monsters list in- ! cludes all monsters killed by traps and each other as well ! as by you. ! dogname ! Name your starting dog (ex. ``dogname:Fang''). Cannot be ! set with the `O' command. ! dungeon ! Set the graphics symbols for displaying the dungeon (default ! `` |--------||.-|++##.##<><>_|\\#{}.}..## #}''). The ! dungeon option should be followed by a string of 1-41 char- ! acters to be used instead of the default map-drawing - NetHack 3.3 August 2, 2000 - NetHack Guidebook 33 ! characters. The dungeon map will use the characters you ! specify instead of the default symbols, and default symbols ! for any you do not specify. Remember that you may need to ! escape some of these characters on a command line if they ! are special to your shell. ! ! Note that NetHack escape-processes this option string in ! conventional C fashion. This means that `\' is a prefix to ! take the following character literally. Thus `\' needs to ! be represented as `\\'. The special escape form `\m' switches on the meta bit in the following character, and the `^' prefix causes the following character to be treated as a control character. ! The order of the symbols is: solid rock, vertical wall, ! horizontal wall, upper left corner, upper right corner, ! lower left corner, lower right corner, cross wall, upward T wall, downward T wall, leftward T wall, rightward T wall, no ! door, vertical open door, horizontal open door, vertical ! closed door, horizontal closed door, iron bars, tree, floor ! of a room, dark corridor, lit corridor, stairs up, stairs ! down, ladder up, ladder down, altar, grave, throne, kitchen ! sink, fountain, pool or moat, ice, lava, vertical lowered ! drawbridge, horizontal lowered drawbridge, vertical raised ! drawbridge, horizontal raised drawbridge, air, cloud, under water. You might want to use `+' for the corners and T walls for a ! more aesthetic, boxier display. Note that in the next ! release, new symbols may be added, or the present ones rear- ranged. Cannot be set with the `O' command. effects Set the graphics symbols for displaying special effects (de- ! fault ``|-\\/*!)(0#@*/-\\||\\-//-\\| |\\-/''). The effects ! option should be followed by a string of 1-29 characters to ! be used instead of the default special-effects characters. ! This string is subjected to the same processing as the ! dungeon option. - The order of the symbols is: vertical beam, horizontal - beam, left slant, right slant, digging beam, camera flash - beam, left boomerang, right boomerang, four glyphs giving - the sequence for magic resistance displays, the eight sur- - rounding glyphs for swallowed display, nine glyphs for ex- - plosions. An explosion consists of three rows (top, middle, - and bottom) of three characters. The explosion is centered - in the center of this 3 by 3 array. ! Note that in the next release, new symbols may be added, or ! the present ones rearranged. - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 34 Cannot be set with the `O' command. - eight_bit_tty - Pass eight-bit character values (for example, specified with - the traps option) straight through to your terminal (default - off). Only applies to the tty port. - extmenu Changes the extended commands interface to pop-up a menu of ! available commands. It is keystroke compatible with the traditional interface except that it does not require that you hit Enter. It is implemented only by the tty port (de- fault off), when the game has been compiled to support tty graphics. female ! An obsolete synonym for ``gender:female''. Cannot be set with the `O' command. fixinv --- 2151,2282 ---- override the selections with your own graphics strings. disclose ! Controls options for disclosing various information when the ! game ends (defaults to all possibilities being disclosed). ! The possibilities are: ! i - disclose your inventory. ! a - disclose your attributes. ! v - summarize monsters that have been vanquished. ! g - list monster species that have been genocided. ! c - display your conduct. ! Each disclosure possibility can optionally be preceded by a ! prefix which let you refine how it behaves. Here are the ! valid prefixes: + y - prompt you and default to yes on the prompt. + n - prompt you and default to no on the prompt. + + - disclose it without prompting. + - - do not disclose it and do not prompt. + NetHack 3.4 March 20, 2002 + NetHack Guidebook 34 + + + + (ex. ``disclose:yi na +v -g -c'') The example sets inventory + to prompt and default to yes, attributes to prompt and de- + fault to no, vanquished to disclose without prompting, geno- + cided to not disclose and not to prompt, conduct to not dis- + close and not to prompt. Note that the vanquished monsters + list includes all monsters killed by traps and each other as + well as by you. + + dogname + Name your starting dog (ex. ``dogname:Fang''). Cannot be + set with the `O' command. ! dungeon ! Set the graphics symbols for displaying the dungeon (default ! `` |--------||.-|++##.##<><>_|\\#{}.}..## #}''). The dun- ! geon option should be followed by a string of 1-41 charac- ! ters to be used instead of the default map-drawing charac- ! ters. The dungeon map will use the characters you specify ! instead of the default symbols, and default symbols for any ! you do not specify. Remember that you may need to escape ! some of these characters on a command line if they are spe- ! cial to your shell. ! ! Note that NetHack escape-processes this option string in ! conventional C fashion. This means that `\' is a prefix to ! take the following character literally. Thus `\' needs to ! be represented as `\\'. The special escape form `\m' switches on the meta bit in the following character, and the `^' prefix causes the following character to be treated as a control character. ! The order of the symbols is: solid rock, vertical wall, ! horizontal wall, upper left corner, upper right corner, low- ! er left corner, lower right corner, cross wall, upward T wall, downward T wall, leftward T wall, rightward T wall, no ! door, vertical open door, horizontal open door, vertical ! closed door, horizontal closed door, iron bars, tree, floor ! of a room, dark corridor, lit corridor, stairs up, stairs ! down, ladder up, ladder down, altar, grave, throne, kitchen ! sink, fountain, pool or moat, ice, lava, vertical lowered ! drawbridge, horizontal lowered drawbridge, vertical raised ! drawbridge, horizontal raised drawbridge, air, cloud, under water. You might want to use `+' for the corners and T walls for a ! more aesthetic, boxier display. Note that in the next re- ! lease, new symbols may be added, or the present ones rear- ranged. Cannot be set with the `O' command. effects Set the graphics symbols for displaying special effects (de- ! fault ``|-\\/*!)(0#@*/-\\||\\-//-\\| |\\-/''). The effects ! NetHack 3.4 March 20, 2002 + NetHack Guidebook 35 + option should be followed by a string of 1-29 characters to + be used instead of the default special-effects characters. + This string is subjected to the same processing as the dun- + geon option. ! The order of the symbols is: vertical beam, horizontal ! beam, left slant, right slant, digging beam, camera flash ! beam, left boomerang, right boomerang, four glyphs giving ! the sequence for magic resistance displays, the eight sur- ! rounding glyphs for swallowed display, nine glyphs for ex- ! plosions. An explosion consists of three rows (top, middle, ! and bottom) of three characters. The explosion is centered ! in the center of this 3 by 3 array. + Note that in the next release, new symbols may be added, or + the present ones rearranged. Cannot be set with the `O' command. extmenu Changes the extended commands interface to pop-up a menu of ! available commands. It is keystroke compatible with the traditional interface except that it does not require that you hit Enter. It is implemented only by the tty port (de- fault off), when the game has been compiled to support tty graphics. female ! An obsolete synonym for ``gender:female''. Cannot be set with the `O' command. fixinv *************** *** 2215,2255 **** ready exist in NetHack, so don't use those. gender ! Your starting gender (gender:male or gender:female). You ! may specify just the first letter. Although you can still ! denote your gender using the ``male'' and ``female'' op- ! tions, the ``gender'' option will take precedence. The de- ! fault is to randomly pick an appropriate gender. Cannot be set with the `O' command. help If more information is available for an object looked at with the `/' command, ask if you want to see it (default - on). Turning help off makes just looking at things faster, - since you aren't interrupted with the ``More info?'' prompt, - but it also means that you might miss some interesting - and/or important information. - hilite_pet - Visually distinguish pets from similar animals (default - off). In text windowing, use text highlighting when color - is turned off; with X tiles, display a heart symbol near - pets. - NetHack 3.3 August 2, 2000 - ! NetHack Guidebook 35 ! horsename ! Name your starting horse (ex. ``horsename:Trigger''). Can- not be set with the `O' command. IBMgraphics --- 2293,2326 ---- ready exist in NetHack, so don't use those. gender ! Your starting gender (gender:male or gender:female). You ! may specify just the first letter. Although you can still ! denote your gender using the ``male'' and ``female'' op- ! tions, the ``gender'' option will take precedence. The de- ! fault is to randomly pick an appropriate gender. Cannot be set with the `O' command. help If more information is available for an object looked at with the `/' command, ask if you want to see it (default + NetHack 3.4 March 20, 2002 + NetHack Guidebook 36 ! on). Turning help off makes just looking at things faster, ! since you aren't interrupted with the ``More info?'' prompt, ! but it also means that you might miss some interesting ! and/or important information. horsename ! Name your starting horse (ex. ``horsename:Trigger''). Can- not be set with the `O' command. IBMgraphics *************** *** 2273,2407 **** held by your character as lit (default off). mail ! Enable mail delivery during the game. male An obsolete synonym for ``gender:male''. Cannot be set with the `O' command. menustyle ! Controls the interface used when you need to choose various ! objects (in response to the Drop command, for instance). The value specified should be the first letter of one of the following: traditional, combination, partial, or full. ! Traditional was the only interface available for earlier ! versions; it consists of a prompt for object class charac- ! ters, followed by an object-by-object prompt for all items ! matching the selected object class(es). Combination starts ! with a prompt for object class(es) of interest, but then ! displays a menu of matching objects rather than prompting ! one-by-one. Partial skips the object class filtering and immediately displays a menu of all objects. Full displays a ! menu of object classes rather than a character prompt, and then a menu of matching objects for selection. menu_deselect_all Menu character accelerator to deselect all items in a menu. - Implemented by the X11 and tty ports. Default '-'. - menu_deselect_page - Menu character accelerator deselect all items on this page - of a menu. Implemented only by the tty port. Default '\'. - NetHack 3.3 August 2, 2000 - NetHack Guidebook 36 menu_first_page Menu character accelerator to jump to the first page in a ! menu. Implemented only by the tty port. Default '^'. menu_invert_all Menu character accelerator to invert all items in a menu. ! Implemented by the X11 and tty ports. Default '@'. menu_invert_page Menu character accelerator to invert all items on this page ! of a menu. Implemented only by the tty port. Default '~'. menu_last_page Menu character accelerator to jump to the last page in a ! menu. Implemented only by the tty port. Default '|'. menu_next_page Menu character accelerator to goto the next menu page. Im- ! plemented only by the tty port. Default '>'. menu_previous_page ! Menu character accelerator to goto the previous menu page. ! Implemented only by the tty port. Default '<'. menu_search Menu character accelerator to search for a menu item. Im- ! plemented only by the X11 port. Default ':'. menu_select_all ! Menu character accelerator to select all items in a menu. ! Implemented by the X11 and tty ports. Default '.'. menu_select_page ! Menu character accelerator to select all items on this page ! of a menu. Implemented only by the tty port. Default ','. monsters ! Set the characters used to display monster classes (default ! ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX- ! YZ@ '&;:~]''). This string is subjected to the same pro- ! cessing as the dungeon option. The order of the symbols is ! ant or other insect, blob, cockatrice, dog or other canine, ! eye or sphere, feline, gremlin, humanoid, imp or minor ! demon, jelly, kobold, leprechaun, mimic, nymph, orc, pi- ! ercer, quadruped, rodent, spider, trapper or lurker above, ! horse or unicorn, vortex, worm, xan or other ! mythical/fantastic insect, light, zruty, angelic being, bat ! or bird, centaur, dragon, elemental, fungus or mold, gnome, ! giant humanoid, invisible monster, jabberwock, Keystone Kop, ! lich, mummy, naga, ogre, pudding or ooze, quantum mechanic, ! rust monster, snake, troll, umber hulk, vampire, wraith, ! xorn, yeti or ape or other large beast, zombie, human, ! ghost, golem, demon, sea monster, lizard, long worm tail, ! and mimic. Cannot be set with the `O' command. - NetHack 3.3 August 2, 2000 - NetHack Guidebook 37 msghistory The number of top line messages to save (and recall with ^P) (default 20). Cannot be set with the `O' command. name Set your character's name (defaults to your user name). You can also set your character's role by appending a dash and one or more letters of the role (that is, by suffixing one of -A -B -C -H -K -M -P -Ra -Ro -S -T -V -W). If -@ is used ! for the role, then a random one will be automatically ! chosen. Cannot be set with the `O' command. news ! Read the NetHack news file, if present (default on). Since ! the news is shown at the beginning of the game, there's no point in setting this with the `O' command. null Send padding nulls to the terminal (default off). number_pad ! Use the number keys to move instead of [yuhjklbn] (default off). objects --- 2344,2493 ---- held by your character as lit (default off). mail ! Enable mail delivery during the game (default on). male An obsolete synonym for ``gender:male''. Cannot be set with the `O' command. menustyle ! Controls the interface used when you need to choose various ! objects (in response to the Drop command, for instance). The value specified should be the first letter of one of the following: traditional, combination, partial, or full. ! Traditional was the only interface available for earlier ! versions; it consists of a prompt for object class charac- ! ters, followed by an object-by-object prompt for all items ! matching the selected object class(es). Combination starts ! with a prompt for object class(es) of interest, but then ! displays a menu of matching objects rather than prompting ! one-by-one. Partial skips the object class filtering and immediately displays a menu of all objects. Full displays a ! menu of object classes rather than a character prompt, and then a menu of matching objects for selection. menu_deselect_all Menu character accelerator to deselect all items in a menu. + NetHack 3.4 March 20, 2002 + NetHack Guidebook 37 + Implemented by the Amiga, Gem, X11 and tty ports. Default + '-'. + + menu_deselect_page + Menu character accelerator deselect all items on this page + of a menu. Implemented by the Amiga, Gem and tty ports. + Default '\'. menu_first_page Menu character accelerator to jump to the first page in a ! menu. Implemented by the Amiga, Gem and tty ports. Default ! '^'. menu_invert_all Menu character accelerator to invert all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default ! '@'. menu_invert_page Menu character accelerator to invert all items on this page ! of a menu. Implemented by the Amiga, Gem and tty ports. ! Default '~'. menu_last_page Menu character accelerator to jump to the last page in a ! menu. Implemented by the Amiga, Gem and tty ports. Default ! '|'. menu_next_page Menu character accelerator to goto the next menu page. Im- ! plemented by the Amiga, Gem and tty ports. Default '>'. menu_previous_page ! Menu character accelerator to goto the previous menu page. ! Implemented by the Amiga, Gem and tty ports. Default '<'. menu_search Menu character accelerator to search for a menu item. Im- ! plemented by the Amiga, Gem and X11 ports. Default ':'. menu_select_all ! Menu character accelerator to select all items in a menu. ! Implemented by the Amiga, Gem, X11 and tty ports. Default ! '.'. menu_select_page ! Menu character accelerator to select all items on this page ! of a menu. Implemented by the Amiga, Gem and tty ports. ! Default ','. monsters ! Set the characters used to display monster classes (default ! ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU- ! VWXYZ@ '&;:~]''). This string is subjected to the same ! + NetHack 3.4 March 20, 2002 + NetHack Guidebook 38 + processing as the dungeon option. The order of the symbols + is ant or other insect, blob, cockatrice, dog or other ca- + nine, eye or sphere, feline, gremlin, humanoid, imp or minor + demon, jelly, kobold, leprechaun, mimic, nymph, orc, + piercer, quadruped, rodent, spider, trapper or lurker above, + horse or unicorn, vortex, worm, xan or other mythical/fan- + tastic insect, light, zruty, angelic being, bat or bird, + centaur, dragon, elemental, fungus or mold, gnome, giant hu- + manoid, invisible monster, jabberwock, Keystone Kop, lich, + mummy, naga, ogre, pudding or ooze, quantum mechanic, rust + monster, snake, troll, umber hulk, vampire, wraith, xorn, + yeti or ape or other large beast, zombie, human, ghost, + golem, demon, sea monster, lizard, long worm tail, and mim- + ic. Cannot be set with the `O' command. msghistory The number of top line messages to save (and recall with ^P) (default 20). Cannot be set with the `O' command. + msg_window + Use a screen-size window to show the previous messages with + ^P instead of showing them one at a time. (Currently imple- + mented for tty only.) + name Set your character's name (defaults to your user name). You can also set your character's role by appending a dash and one or more letters of the role (that is, by suffixing one of -A -B -C -H -K -M -P -Ra -Ro -S -T -V -W). If -@ is used ! for the role, then a random one will be automatically cho- ! sen. Cannot be set with the `O' command. news ! Read the NetHack news file, if present (default on). Since ! the news is shown at the beginning of the game, there's no point in setting this with the `O' command. null Send padding nulls to the terminal (default off). number_pad ! Use the number keys to move instead of [yuhjklbn] (default off). objects *************** *** 2413,2418 **** --- 2499,2517 ---- wand, gold, gem or rock, boulder or statue, iron ball, chain, and venom. Cannot be set with the `O' command. + + + + NetHack 3.4 March 20, 2002 + + + + + + NetHack Guidebook 39 + + + packorder Specify the order to list object types in (default ``")[%?+!=/(*`0_''). The value of this option should be a *************** *** 2427,2452 **** pettype Specify the type of your initial pet, if you are playing a ! character class that uses multiple types of pets. Possible ! values are ``cat'' and ``dog''. Cannot be set with the `O' ! command. pickup_burden ! When you pick up an item that would exceed this encumbrance ! level (Unburdened, Burdened, streSsed, straiNed, overTaxed, ! ! ! NetHack 3.3 August 2, 2000 ! ! ! ! ! ! ! NetHack Guidebook 38 ! ! ! or overLoaded), you will be asked if you want to continue. (Default `S'). pickup_types --- 2526,2539 ---- pettype Specify the type of your initial pet, if you are playing a ! character class that uses multiple types of pets; or choose ! to have no initial pet at all. Possible values are ``cat'', ! ``dog'' and ``none''. Cannot be set with the `O' command. pickup_burden ! When you pick up an item that would exceed this encumbrance ! level (Unburdened, Burdened, streSsed, straiNed, overTaxed, ! or overLoaded), you will be asked if you want to continue. (Default `S'). pickup_types *************** *** 2456,2470 **** prayconfirm Prompt for confirmation before praying (default on). - preload_tiles - For the protected mode MSDOS version, control whether tiles - get pre-loaded into RAM at the start of the game. Doing so - enhances performance of the tile graphics, but uses more - memory. (default on). Cannot be set with the `O' command. - pushweapon ! Using the `w' (wield) command when already wielding some- ! thing pushes the old item into your secondary weapon slot (default off). race Selects your race (for example, ``race:human''). Default is --- 2543,2551 ---- prayconfirm Prompt for confirmation before praying (default on). pushweapon ! Using the `w' (wield) command when already wielding some- ! thing pushes the old item into your secondary weapon slot (default off). race Selects your race (for example, ``race:human''). Default is *************** *** 2485,2490 **** --- 2566,2583 ---- for ``character''. See ``name'' for an alternate method of specifying your role. Normally only the first letter of the value is examined; `r' is an exception with ``Rogue'', + + + NetHack 3.4 March 20, 2002 + + + + + + NetHack Guidebook 40 + + + ``Ranger'', and ``random'' values. safe_pet *************** *** 2492,2519 **** on). scores ! Control what parts of the score list you are shown at the end (ex. ``scores:5 top scores/4 around my score/own ! scores''). Only the first letter of each category (`t', `a', or `o') is necessary. showexp Show your accumulated experience points on bottom line (de- fault off). - - NetHack 3.3 August 2, 2000 - - - - - - - NetHack Guidebook 39 - - showscore ! Show your approximate accumulated score on bottom line (de- fault off). silent --- 2585,2601 ---- on). scores ! Control what parts of the score list you are shown at the end (ex. ``scores:5 top scores/4 around my score/own ! scores''). Only the first letter of each category (`t', `a', or `o') is necessary. showexp Show your accumulated experience points on bottom line (de- fault off). showscore ! Show your approximate accumulated score on bottom line (de- fault off). silent *************** *** 2523,2556 **** Sort the pack contents by type when displaying inventory (default on). standout Boldface monsters and ``--More--'' (default off). suppress_alert ! This option may be set to a NetHack version level to ! suppress alert notification messages about feature changes ! for that and prior versions (ex. ``suppress_alert:3.3.1''). time Show the elapsed game time in turns on bottom line (default off). timed_delay ! When pausing momentarily for display effect, such as with explosions and moving objects, use a timer rather than send- ing extra characters to the screen. (Applies to ``tty'' in- ! terface only; ``X11'' interface always uses a timer based delay. The default is on if configured into the program.) tombstone Draw a tombstone graphic upon your death (default on). toptenwin ! Put the ending display in a NetHack window instead of on ! stdout (default off). Setting this option makes the score ! list visible when a windowing version of NetHack is started ! without a parent window, but it no longer leaves the score ! list around after game end on a terminal or emulating win- dow. traps --- 2605,2655 ---- Sort the pack contents by type when displaying inventory (default on). + sparkle + Display a sparkly effect when a monster (including yourself) + is hit by an attack to which it is resistant (default on). + standout Boldface monsters and ``--More--'' (default off). suppress_alert ! This option may be set to a NetHack version level to sup- ! press alert notification messages about feature changes for ! that and prior versions (ex. ``suppress_alert:3.3.1''). time Show the elapsed game time in turns on bottom line (default off). timed_delay ! When pausing momentarily for display effect, such as with explosions and moving objects, use a timer rather than send- ing extra characters to the screen. (Applies to ``tty'' in- ! terface only; ``X11'' interface always uses a timer based delay. The default is on if configured into the program.) tombstone Draw a tombstone graphic upon your death (default on). + + + + NetHack 3.4 March 20, 2002 + + + + + + NetHack Guidebook 41 + + + toptenwin ! Put the ending display in a NetHack window instead of on ! stdout (default off). Setting this option makes the score ! list visible when a windowing version of NetHack is started ! without a parent window, but it no longer leaves the score ! list around after game end on a terminal or emulating win- dow. traps *************** *** 2563,2582 **** The order of the symbols is: arrow trap, dart trap, falling rock trap, squeaky board, bear trap, land mine, rolling boulder trap, sleeping gas trap, rust trap, fire trap, pit, ! spiked pit, hole, trap door, teleportation trap, level ! teleporter, magic portal, web, statue trap, magic trap, ! anti-magic field, polymorph trap. ! ! ! NetHack 3.3 August 2, 2000 ! ! ! ! ! ! ! NetHack Guidebook 40 ! Cannot be set with the `O' command. --- 2662,2670 ---- The order of the symbols is: arrow trap, dart trap, falling rock trap, squeaky board, bear trap, land mine, rolling boulder trap, sleeping gas trap, rust trap, fire trap, pit, ! spiked pit, hole, trap door, teleportation trap, level tele- ! porter, magic portal, web, statue trap, magic trap, anti- ! magic field, polymorph trap. Cannot be set with the `O' command. *************** *** 2585,2609 **** videocolors Set the color palette for PC systems using NO_TERMS (default ! 4-2-6-1-5-3-15-12-10-14-9-13-11). The order of colors is ! red, green, brown, blue, magenta, cyan, bright.white, ! bright.red, bright.green, yellow, bright.blue, ! bright.magenta, and bright.cyan. Cannot be set with the `O' ! command. videoshades ! Set the intensity level of the three gray scales available ! (default dark normal light, PC NetHack only). If the game display is difficult to read, try adjusting these scales; if ! this does not correct the problem, try !color. Cannot be set with the `O' command. windowtype ! Select which windowing system to use, such as ``tty'' or ! ``X11'' (default depends on version). Cannot be set with the `O' command. ! 9.5. Configuring NetHack for Play by the Blind NetHack can be set up to use only standard ASCII characters for making maps of the dungeons. This makes the MS-DOS versions --- 2673,2863 ---- videocolors Set the color palette for PC systems using NO_TERMS (default ! 4-2-6-1-5-3-15-12-10-14-9-13-11). The order of colors is ! red, green, brown, blue, magenta, cyan, bright.white, ! bright.red, bright.green, yellow, bright.blue, bright.magen- ! ta, and bright.cyan. Cannot be set with the `O' command. videoshades ! Set the intensity level of the three gray scales available ! (default dark normal light, PC NetHack only). If the game display is difficult to read, try adjusting these scales; if ! this does not correct the problem, try !color. Cannot be set with the `O' command. windowtype ! Select which windowing system to use, such as ``tty'' or ! ``X11'' (default depends on version). Cannot be set with the `O' command. ! 9.5. Window Port Customization options ! ! Here are explanations of the various options that are used ! to customize and change the characteristics of the windowtype ! that you have chosen. Character strings that are too long may be ! truncated. Not all window ports will adjust for all settings ! listed here. You can safely add any of these options to your ! config file, and if the window port is capable of adjusting to ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 42 ! ! ! ! suit your preferences, it will attempt to do so. If it can't it ! will silently ignore it. You can find out if an option is sup- ! ported by the window port that you are currently using by check- ! ing to see if it shows up in the Options list. Some options are ! dynamic and can be specified during the game with the `O' com- ! mand. ! ! align_message ! Where to align or place the message window (top, bottom, ! left, or right) ! ! align_status ! Where to align or place the status window (top, bottom, ! left, or right). ! ! ascii_map ! NetHack should display an ascii character map if it can. ! ! color ! NetHack should display color if it can for different mon- ! sters, objects, and dungeon features ! ! eight_bit_tty ! NetHack should pass eight-bit character values (for example, ! specified with the traps option) straight through to your ! terminal (default off). ! ! font_map ! NetHack should use a font by the chosen name for the map ! window. ! ! font_menu ! NetHack should use a font by the chosen name for menu win- ! dows. ! ! font_message ! NetHack should use a font by the chosen name for the message ! window. ! ! font_status ! NetHack should use a font by the chosen name for the status ! window. ! ! font_text ! NetHack should use a font by the chosen name for text win- ! dows. ! ! font_size_map ! NetHack should use this size font for the map window. ! ! font_size_menu ! NetHack should use this size font for menu windows. ! ! ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 43 ! ! ! ! font_size_message ! NetHack should use this size font for the message window. ! ! font_size_status ! NetHack should use this size font for the status window. ! ! font_size_text ! NetHack should use this size font for text windows. ! ! hilite_pet ! Visually distinguish pets from similar animals (default ! off). The behavior of this option depends on the type of ! windowing you use. In text windowing, text highlighting or ! inverse video is often used; with tiles, generally displays ! a heart symbol near pets. ! ! large_font ! NetHack should use a large font. ! ! map_mode ! NetHack should display the map in the manner specified. ! ! player_selection ! NetHack should pop up dialog boxes, or use prompts for char- ! acter selection. ! ! popup_dialog ! NetHack should pop up dialog boxes for input. ! ! preload_tiles ! NetHack should preload tiles into memory. For example, in ! the protected mode MSDOS version, control whether tiles get ! pre-loaded into RAM at the start of the game. Doing so en- ! hances performance of the tile graphics, but uses more memo- ! ry. (default on). Cannot be set with the `O' command. ! ! scroll_margin ! NetHack should scroll the display when the hero or cursor is ! this number of cells away from the edge of the window. ! ! splash_screen ! NetHack should display an opening splash screen when it ! starts up (default yes). ! ! tiled_map ! NetHack should display a tiled map if it can. ! ! tile_file ! Specify the name of an alternative tile file to override the ! default. ! ! tile_height ! Specify the preferred height of each tile in a tile capable ! port. ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 44 ! ! ! ! tile_width ! Specify the preferred width of each tile in a tile capable ! port ! ! use_inverse ! NetHack should display inverse when the game specifies it. ! ! vary_msgcount ! NetHack should display this number of messages at a time in ! the message window. ! ! windowcolors ! NetHack should display windows with the specified fore- ! ground/background colors if it can. ! ! 9.6. Configuring NetHack for Play by the Blind NetHack can be set up to use only standard ASCII characters for making maps of the dungeons. This makes the MS-DOS versions *************** *** 2632,2668 **** and with editing files, you may want to alter settings to better suit your preferences. Instructions on how to do this are includ- ed in the NHAccess.nh file itself. The most crucial settings to ! NetHack 3.3 August 2, 2000 - NetHack Guidebook 41 ! make the game accessible are: - IBMgraphics - Disable IBMgraphics by commenting out this option. - menustyle:traditional - This will assist in the interface to speech synthesizers. ! number_pad ! A lot of speech access programs use the number-pad to review ! the screen. If this is the case, turn off the number_pad ! option and use the traditional Rogue-like commands. Character graphics ! Comment out all character graphics sets found near the bot- ! tom of the defaults.nh file. Most of these replace ! NetHack's default representation of the dungeon using stan- ! dard ASCII characters with fancier characters from extended ! character sets, and these fancier characters can annoy screen-readers. 10. Scoring --- 2886,2922 ---- and with editing files, you may want to alter settings to better suit your preferences. Instructions on how to do this are includ- ed in the NHAccess.nh file itself. The most crucial settings to + make the game accessible are: + IBMgraphics + Disable IBMgraphics by commenting out this option. ! menustyle:traditional ! This will assist in the interface to speech synthesizers. + number_pad + A lot of speech access programs use the number-pad to review + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 45 ! the screen. If this is the case, disable the number_pad op- ! tion and use the traditional Rogue-like commands. Character graphics ! Comment out all character graphics sets found near the bot- ! tom of the defaults.nh file. Most of these replace ! NetHack's default representation of the dungeon using stan- ! dard ASCII characters with fancier characters from extended ! character sets, and these fancier characters can annoy screen-readers. 10. Scoring *************** *** 2686,2692 **** whatever you have. If you quit, you keep all your gold, but if you swing and live, you might find more. ! If you just want to see what the current top players/games list is, you can type nethack -s all on most versions. --- 2940,2946 ---- whatever you have. If you quit, you keep all your gold, but if you swing and live, you might find more. ! If you just want to see what the current top players/games list is, you can type nethack -s all on most versions. *************** *** 2699,2728 **** files and cheat death, at the paltry cost of not getting on the high score list. - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 42 ! There are two ways of enabling explore mode. One is to ! start the game with the -X switch. The other is to issue the `X' ! command while already playing the game. The other benefits of ! explore mode are left for the trepid reader to discover. 12. Credits ! The original hack game was modeled on the Berkeley UNIX ro- ! gue game. Large portions of this paper were shamelessly cribbed ! from A Guide to the Dungeons of Doom, by Michael C. Toy and Ken- ! neth C. R. C. Arnold. Small portions were adapted from Further ! Exploration of the Dungeons of Doom, by Ken Arromdee. NetHack is the product of literally dozens of people's work. Main events in the course of the game development are described --- 2953,2986 ---- files and cheat death, at the paltry cost of not getting on the high score list. + There are two ways of enabling explore mode. One is to + start the game with the -X switch. The other is to issue the `X' + command while already playing the game. The other benefits of + explore mode are left for the trepid reader to discover. ! NetHack 3.4 March 20, 2002 ! ! ! ! NetHack Guidebook 46 ! 12. Credits ! The original hack game was modeled on the Berkeley UNIX ! rogue game. Large portions of this paper were shamelessly ! cribbed from A Guide to the Dungeons of Doom, by Michael C. Toy ! and Kenneth C. R. C. Arnold. Small portions were adapted from ! Further Exploration of the Dungeons of Doom, by Ken Arromdee. NetHack is the product of literally dozens of people's work. Main events in the course of the game development are described *************** *** 2733,2787 **** Woodland, Mike Thome and Jon Payne. Andries Brouwer did a major re-write, transforming Hack into ! a very different game, and published (at least) three versions (1.0.1, 1.0.2, and 1.0.3) for UNIX machines to the Usenet. ! Don G. Kneller ported Hack 1.0.3 to Microsoft C and MS-DOS, ! producing PC HACK 1.01e, added support for DEC Rainbow graphics ! in version 1.03g, and went on to produce at least four more ver- sions (3.0, 3.2, 3.51, and 3.6). R. Black ported PC HACK 3.51 to Lattice C and the Atari 520/1040ST, producing ST Hack 1.03. Mike Stephenson merged these various versions back together, ! incorporating many of the added features, and produced NetHack ! 1.4. He then coordinated a cast of thousands in enhancing and ! debugging NetHack 1.4 and released NetHack versions 2.2 and 2.3. Later, Mike coordinated a major rewrite of the game, heading a team which included Ken Arromdee, Jean-Christophe Collet, Steve ! Creps, Eric Hendrickson, Izchak Miller, John Rupley, Mike ! Threepoint, and Janet Walz, to produce NetHack 3.0c. NetHack 3.0 was ported to the Atari by Eric R. Smith, to OS/2 by Timo Hakulinen, and to VMS by David Gentzel. The three of them and Kevin Darcy later joined the main development team to produce subsequent revisions of 3.0. ! Olaf Seibert ported NetHack 2.3 and 3.0 to the Amiga. Norm ! Meluch, Stephen Spackman and Pierre Martineau designed overlay ! code for PC NetHack 3.0. Johnny Lee ported NetHack 3.0 to the ! Macintosh. Along with various other Dungeoneers, they continued ! to enhance the PC, Macintosh, and Amiga ports through the later - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 43 - revisions of 3.0. - Headed by Mike Stephenson and coordinated by Izchak Miller - and Janet Walz, the development team which now included Ken Ar- - romdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, Matt - Day, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric Raymond, and Eric Smith undertook a radical revision of 3.0. They re-structured the game's design, and re-wrote major parts of the code. They added multiple dungeons, a new display, special --- 2991,3045 ---- Woodland, Mike Thome and Jon Payne. Andries Brouwer did a major re-write, transforming Hack into ! a very different game, and published (at least) three versions (1.0.1, 1.0.2, and 1.0.3) for UNIX machines to the Usenet. ! Don G. Kneller ported Hack 1.0.3 to Microsoft C and MS-DOS, ! producing PC HACK 1.01e, added support for DEC Rainbow graphics ! in version 1.03g, and went on to produce at least four more ver- sions (3.0, 3.2, 3.51, and 3.6). R. Black ported PC HACK 3.51 to Lattice C and the Atari 520/1040ST, producing ST Hack 1.03. Mike Stephenson merged these various versions back together, ! incorporating many of the added features, and produced NetHack ! 1.4. He then coordinated a cast of thousands in enhancing and ! debugging NetHack 1.4 and released NetHack versions 2.2 and 2.3. Later, Mike coordinated a major rewrite of the game, heading a team which included Ken Arromdee, Jean-Christophe Collet, Steve ! Creps, Eric Hendrickson, Izchak Miller, John Rupley, Mike Threep- ! oint, and Janet Walz, to produce NetHack 3.0c. NetHack 3.0 was ported to the Atari by Eric R. Smith, to OS/2 by Timo Hakulinen, and to VMS by David Gentzel. The three of them and Kevin Darcy later joined the main development team to produce subsequent revisions of 3.0. ! Olaf Seibert ported NetHack 2.3 and 3.0 to the Amiga. Norm ! Meluch, Stephen Spackman and Pierre Martineau designed overlay ! code for PC NetHack 3.0. Johnny Lee ported NetHack 3.0 to the ! Macintosh. Along with various other Dungeoneers, they continued ! to enhance the PC, Macintosh, and Amiga ports through the later ! revisions of 3.0. + Headed by Mike Stephenson and coordinated by Izchak Miller + and Janet Walz, the development team which now included Ken Ar- + romdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, Matt + Day, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 47 Raymond, and Eric Smith undertook a radical revision of 3.0. They re-structured the game's design, and re-wrote major parts of the code. They added multiple dungeons, a new display, special *************** *** 2799,2815 **** Jon W{tte and Hao-yang Wang, with help from Ross Brown, Mike Engber, David Hairston, Michael Hamel, Jonathan Handler, Johnny Lee, Tim Lennan, Rob Menke, and Andy Swanson, developed NetHack ! 3.1 for the Macintosh, porting it for MPW. Building on their ! development, Barton House added a Think C port. Timo Hakulinen ported NetHack 3.1 to OS/2. Eric Smith port- ed NetHack 3.1 to the Atari. Pat Rankin, with help from Joshua Delahunty, was responsible for the VMS version of NetHack 3.1. Michael Allison ported NetHack 3.1 to Windows NT. ! Dean Luick, with help from David Cohrs, developed NetHack ! 3.1 for X11. Warwick Allison wrote a tiled version of NetHack ! for the Atari; he later contributed the tiles to the DevTeam and tile support was then added to other platforms. The 3.2 development team, comprised of Michael Allison, Ken --- 3057,3073 ---- Jon W{tte and Hao-yang Wang, with help from Ross Brown, Mike Engber, David Hairston, Michael Hamel, Jonathan Handler, Johnny Lee, Tim Lennan, Rob Menke, and Andy Swanson, developed NetHack ! 3.1 for the Macintosh, porting it for MPW. Building on their de- ! velopment, Barton House added a Think C port. Timo Hakulinen ported NetHack 3.1 to OS/2. Eric Smith port- ed NetHack 3.1 to the Atari. Pat Rankin, with help from Joshua Delahunty, was responsible for the VMS version of NetHack 3.1. Michael Allison ported NetHack 3.1 to Windows NT. ! Dean Luick, with help from David Cohrs, developed NetHack ! 3.1 for X11. Warwick Allison wrote a tiled version of NetHack ! for the Atari; he later contributed the tiles to the DevTeam and tile support was then added to other platforms. The 3.2 development team, comprised of Michael Allison, Ken *************** *** 2820,2894 **** Version 3.2 marked the tenth anniversary of the formation of the development team. In a testament to their dedication to the ! game, all thirteen members of the original development team ! remained on the team at the start of work on that release. Dur- ! ing the interval between the release of 3.1.3 and 3.2, one of the founding members of the development team, Dr. Izchak Miller, was diagnosed with cancer and passed away. That release of the game was dedicated to him by the development and porting teams. ! During the lifespan of NetHack 3.1 and 3.2, several ! enthusiasts of the game added their own modifications to the game ! and made these ``variants'' publicly available: - NetHack 3.3 August 2, 2000 ! NetHack Guidebook 44 ! Tom Proudfoot and Yuval Oren created NetHack++, which was ! quickly renamed NetHack--. Working independently, Stephen White ! wrote NetHack Plus. Tom Proudfoot later merged NetHack Plus and ! his own NetHack-- to produce SLASH. Larry Stewart-Zerba and ! Warwick Allison improved the spell casting system with the Wizard ! Patch. Warwick Allison also ported NetHack to use the Qt inter- face. ! Warren Cheung combined SLASH with the Wizard Patch to pro- ! duce Slash'em, and with the help of Kevin Hugo, added more ! features. Kevin later joined the DevTeam and incorporated the ! best of these ideas in NetHack 3.3. ! The 3.3 development team consisted of Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, ! Timo Hakulinen, Kevin Hugo, Steve Linhart, Dean Luick, Pat Ran- ! kin, Eric Smith, Mike Stephenson, Janet Walz, and Paul Winner. ! As with version 3.2, various people contributed to the game as a whole as well as supporting ports on the different platforms that NetHack runs on: ! Pat Rankin maintained 3.3 for VMS. ! Michael Allison maintained NetHack 3.3 for the MS-DOS plat- form. Paul Winner and Yitzhak Sapir provided encouragement. ! Dean Luick, Mark Modrall, and Kevin Hugo maintained and ! enhanced the Macintosh port of 3.3. - Michael Allison maintained and enhanced 3.3 for the Micro- - soft Windows NT platform. ! Ron Van Iwaarden took over responsibility for the OS/2 port. - The Amiga port of NetHack was resurrected for 3.3.1 by Janne - Salmijarvi. ! The Atari port of NetHack was resurrected for 3.3.1 by ! Christian ``Marvin'' Bressler. - - - - - - - - - - ! From time to time, some depraved individual out there in ! netland sends a particularly intriguing modification to help out ! with the game. The Gods of the Dungeon sometimes make note of ! the names of the worst of these miscreants in this, the list of Dungeoneers: --- 3078,3195 ---- Version 3.2 marked the tenth anniversary of the formation of the development team. In a testament to their dedication to the ! game, all thirteen members of the original development team re- ! mained on the team at the start of work on that release. During ! the interval between the release of 3.1.3 and 3.2, one of the founding members of the development team, Dr. Izchak Miller, was diagnosed with cancer and passed away. That release of the game was dedicated to him by the development and porting teams. ! During the lifespan of NetHack 3.1 and 3.2, several enthusi- ! asts of the game added their own modifications to the game and ! made these ``variants'' publicly available: + Tom Proudfoot and Yuval Oren created NetHack++, which was + quickly renamed NetHack--. Working independently, Stephen White + wrote NetHack Plus. Tom Proudfoot later merged NetHack Plus and + his own NetHack-- to produce SLASH. Larry Stewart-Zerba and War- + wick Allison improved the spell casting system with the Wizard + NetHack 3.4 March 20, 2002 ! NetHack Guidebook 48 ! ! Patch. Warwick Allison also ported NetHack to use the Qt inter- face. ! Warren Cheung combined SLASH with the Wizard Patch to pro- ! duce Slash'em, and with the help of Kevin Hugo, added more fea- ! tures. Kevin later joined the DevTeam and incorporated the best ! of these ideas in NetHack 3.3. ! ! The final update to 3.2 was the bug fix release 3.2.3, which ! was released simultaneously with 3.3.0 in December 1999 just in ! time for the Year 2000. ! The 3.3 development team, consisting of Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, ! Timo Hakulinen, Kevin Hugo, Steve Linhart, Ken Lorber, Dean ! Luick, Pat Rankin, Eric Smith, Mike Stephenson, Janet Walz, and ! Paul Winner, released 3.3.0 in December 1999 and 3.3.1 in August ! of 2000. ! ! Version 3.3 offered many firsts. It was the first version to ! separate race and profession. The Elf class was removed in pref- ! erence to an elf race, and the races of dwarves, gnomes, and orcs ! made their first appearance in the game alongside the familiar ! human race. Monk and Ranger roles joined Archeologists, Barbar- ! ians, Cavemen, Healers, Knights, Priests, Rogues, Samurai, ! Tourists, Valkyries and of course, Wizards. It was also the ! first version to allow you to ride a steed, and was the first ! version to have a publicly available web-site listing all the ! bugs that had been discovered. Despite that constantly growing ! bug list, 3.3 proved stable enough to last for more than a year ! and a half. ! ! The 3.4 development team initially consisted of Michael Al- ! lison, Ken Arromdee, David Cohrs, Jessie Collet, Kevin Hugo, Ken ! Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and ! Paul Winner, with Warwick Allison joining just before the re- ! lease of NetHack 3.4.0 in March 2002. ! As with version 3.3, various people contributed to the game as a whole as well as supporting ports on the different platforms that NetHack runs on: ! Pat Rankin maintained 3.4 for VMS. ! Michael Allison maintained NetHack 3.4 for the MS-DOS plat- form. Paul Winner and Yitzhak Sapir provided encouragement. ! Dean Luick, Mark Modrall, and Kevin Hugo maintained and en- ! hanced the Macintosh port of 3.4. ! ! Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas, ! and Yitzhak Sapir maintained and enhanced 3.4 for the Microsoft ! Windows platform. Alex Kompel contributed a new graphical inter- ! face for the Windows port. ! NetHack 3.4 March 20, 2002 ! ! ! ! NetHack Guidebook 49 ! ! ! ! Ron Van Iwaarden maintained 3.4 for OS/2. ! ! Janne Salmijarvi and Teemu Suikki maintained and enhanced ! the Amiga port of 3.4 after Janne Salmijarvi resurrected it for ! 3.3.1. ! ! Christian ``Marvin'' Bressler maintained 3.4 for the Atari ! after he resurrected it for 3.3.1. ! ! There is a NetHack web site maintained by Ken Lorber at ! http://www.nethack.org/. - - - - - - - - - - ! From time to time, some depraved individual out there in ! netland sends a particularly intriguing modification to help out ! with the game. The Gods of the Dungeon sometimes make note of ! the names of the worst of these miscreants in this, the list of Dungeoneers: *************** *** 2898,2938 **** - NetHack 3.3 August 2, 2000 - NetHack Guidebook 45 ! Adam Aronow Irina Rempt-Drijfhout Mike Gallop ! Andy Church Izchak Miller Mike Passaretti ! Andy Swanson Janet Walz Mike Stephenson ! Ari Huttunen Janne Salmijarvi Norm Meluch ! Barton House Jean-Christophe Collet Olaf Seibert ! Benson I. Margulies Jochen Erwied Pat Rankin ! Bill Dyer John Kallen Paul Winner ! Boudewijn Waijers John Rupley Pierre Martineau ! Bruce Cox John S. Bien Ralf Brown ! Bruce Holloway Johnny Lee Richard Addison ! Bruce Mewborne Jon W{tte Richard Beigel ! Carl Schelin Jonathan Handler Richard P. Hughey ! Chris Russo Joshua Delahunty Rob Menke ! David Cohrs Keizo Yamamoto Robin Johnson ! David Damerell Ken Arromdee Roland McGrath ! David Gentzel Ken Lorber Ron Van Iwaarden ! David Hairston Ken Washikita Ronnen Miller ! Dean Luick Kevin Darcy Ross Brown ! Del Lamb Kevin Hugo Sascha Wostmann ! Deron Meranda Kevin Sitze Scott R. Turner ! Dylan O'Donnell Kevin Smolkowski Stephen Spackman ! Eric Backus Kevin Sweet Stephen White ! Eric Hendrickson Lars Huttar Steve Creps ! Eric R. Smith Mark Gooderum Steve Linhart ! Eric S. Raymond Mark Modrall Steve VanDevender Erik Andersen Marvin Bressler Tim Lennan Frederick Roeber Matthew Day Timo Hakulinen Gil Neiger Merlyn LeRoy Tom Almy --- 3199,3271 ---- ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! NetHack 3.4 March 20, 2002 ! ! ! ! ! ! NetHack Guidebook 50 ! ! ! ! Adam Aronow Helge Hafting Mike Engber ! Alex Kompel Irina Rempt-Drijfhout Mike Gallop ! Andreas Dorn Izchak Miller Mike Passaretti ! Andy Church J. Ali Harlow Mike Stephenson ! Andy Swanson Janet Walz Norm Meluch ! Ari Huttunen Janne Salmijarvi Olaf Seibert ! Barton House Jean-Christophe Collet Pat Rankin ! Benson I. Margulies Jochen Erwied Paul Winner ! Bill Dyer John Kallen Pierre Martineau ! Boudewijn Waijers John Rupley Ralf Brown ! Bruce Cox John S. Bien Richard Addison ! Bruce Holloway Johnny Lee Richard Beigel ! Bruce Mewborne Jon W{tte Richard P. Hughey ! Carl Schelin Jonathan Handler Rob Menke ! Chris Russo Joshua Delahunty Robin Johnson ! David Cohrs Keizo Yamamoto Roland McGrath ! David Damerell Ken Arnold Ron Van Iwaarden ! David Gentzel Ken Arromdee Ronnen Miller ! David Hairston Ken Lorber Ross Brown ! Dean Luick Ken Washikita Sascha Wostmann ! Del Lamb Kevin Darcy Scott Bigham ! Deron Meranda Kevin Hugo Scott R. Turner ! Dion Nicolaas Kevin Sitze Stephen Spackman ! Dylan O'Donnell Kevin Smolkowski Stephen White ! Eric Backus Kevin Sweet Steve Creps ! Eric Hendrickson Lars Huttar Steve Linhart ! Eric R. Smith Mark Gooderum Steve VanDevender ! Eric S. Raymond Mark Modrall Teemu Suikki Erik Andersen Marvin Bressler Tim Lennan Frederick Roeber Matthew Day Timo Hakulinen Gil Neiger Merlyn LeRoy Tom Almy *************** *** 2940,2948 **** Greg Olson Michael Feir Warren Cheung Gregg Wonderly Michael Hamel Warwick Allison Hao-yang Wang Michael Sokolov Yitzhak Sapir - Helge Hafting Mike Engber ! Brand and product names are trademarks or registered trademarks of their respective holders. --- 3273,3280 ---- Greg Olson Michael Feir Warren Cheung Gregg Wonderly Michael Hamel Warwick Allison Hao-yang Wang Michael Sokolov Yitzhak Sapir ! Brand and product names are trademarks or registered trademarks of their respective holders. *************** *** 2962,2970 **** ! ! ! NetHack 3.3 August 2, 2000 --- 3294,3300 ---- ! NetHack 3.4 March 20, 2002 *** nethack-3.3.1/doc/nethack.6 Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/doc/nethack.6 Thu Mar 21 07:37:36 2002 *************** *** 1,8 **** ! .TH NETHACK 6 "17 November 1999" .UC 4 .SH NAME nethack \- Exploring The Mazes of Menace .SH SYNOPSIS .B nethack [ .B \-d --- 1,10 ---- ! .TH NETHACK 6 "12 March 2002" .UC 4 .SH NAME nethack \- Exploring The Mazes of Menace .SH SYNOPSIS + .na + .hy 0 .B nethack [ .B \-d *************** *** 32,38 **** [ .B \-ibm ] ! .br .B nethack [ .B \-d --- 34,40 ---- [ .B \-ibm ] ! .PP .B nethack [ .B \-d *************** *** 53,58 **** --- 55,62 ---- [ .I playernames ] + .ad + .hy 14 .SH DESCRIPTION .PP .I NetHack *************** *** 105,112 **** file. The default is located in your home directory and named .nethackrc on Unix systems. On other systems, the default may be ! different, usually NetHack.cnf. On DOS the name is defaults.nh, while ! on the Macintosh or BeOS, it is NetHack Defaults. The configuration file's location may be specified by setting NETHACKOPTIONS to a string consisting of an @ character followed by the filename. .PP --- 109,116 ---- file. The default is located in your home directory and named .nethackrc on Unix systems. On other systems, the default may be ! different, usually NetHack.cnf. On DOS or Windows, the name is ! defaults.nh, while on the Macintosh or BeOS, it is NetHack Defaults. The configuration file's location may be specified by setting NETHACKOPTIONS to a string consisting of an @ character followed by the filename. .PP *************** *** 123,129 **** .PP A .I playername ! suffix or a separate option, .B \-p .I profession can be used to determine the character role. You can specify either the --- 127,146 ---- .PP A .I playername ! suffix can be used to specify the profession, race, alignment and/or gender ! of the character. The full syntax of the playername that includes a ! suffix is "name-ppp-rrr-aaa-ggg". "ppp" are at least the first three letters ! of the profession (this can also be specified using a separate ! .B \-p ! .I profession ! option). "rrr" are at least the first three letters of the character's ! race (this can also be specified using a separate ! .B \-r ! .I race ! option). "aaa" are at last the first three letters of the character's ! alignment, and "ggg" are at least the first three letters of the ! character's gender. Any of the parts of the suffix may be left out. ! .PP .B \-p .I profession can be used to determine the character role. You can specify either the *************** *** 140,148 **** .I race can be used to explicitly request that a race be chosen. .PP .PP - Leaving out either of these will result in you being prompted during - the game startup for the information. .PP The .B \-s --- 157,165 ---- .I race can be used to explicitly request that a race be chosen. .PP + Leaving out any of these characteristics will result in you being prompted + during the game startup for the information. .PP .PP The .B \-s *** nethack-3.3.1/doc/nethack.txt Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/doc/nethack.txt Thu Mar 21 07:37:36 2002 *************** *** 1,264 **** ! ! ! ! NETHACK(6) 1999 NETHACK(6) NAME ! nethack - Exploring The Mazes of Menace SYNOPSIS ! nethack [ -d directory ] [ -n ] [ -p profession (role) ] [ ! -r race ] [ -[DX] ] [ -u playername ] [ -dec ] [ -ibm ] ! nethack [ -d directory ] -s [ -v ] [ -p profession (role) ] ! [ -r race ] [ playernames ] ! ! DESCRIPTION ! NetHack is a display oriented Dungeons & Dragons(tm) - like ! game. The standard tty display and command structure resem- ! ble rogue. ! ! Other, more graphical display options exist if you are using ! either a PC, or an X11 interface. ! ! To get started you really only need to know two commands. ! The command ? will give you a list of the available commands ! (as well as other information) and the command / will iden- ! tify the things you see on the screen. ! ! To win the game (as opposed to merely playing to beat other ! people's high scores) you must locate the Amulet of Yendor ! which is somewhere below the 20th level of the dungeon and ! get it out. Nobody has achieved this yet; anybody who does ! will probably go down in history as a hero among heros. ! ! When the game ends, whether by your dying, quitting, or ! escaping from the caves, NetHack will give you (a fragment ! of) the list of top scorers. The scoring is based on many ! aspects of your behavior, but a rough estimate is obtained ! by taking the amount of gold you've found in the cave plus ! four times your (real) experience. Precious stones may be ! worth a lot of gold when brought to the exit. There is a ! 10% penalty for getting yourself killed. ! ! The environment variable NETHACKOPTIONS can be used to ini- ! tialize many run-time options. The ? command provides a ! description of these options and syntax. (The -dec and -ibm ! command line options are equivalent to the decgraphics and ! ibmgraphics run-time options described there, and are pro- ! vided purely for convenience on systems supporting multiple ! types of terminals.) ! ! Because the option list can be very long (particularly when ! specifying graphics characters), options may also be ! included in a configuration file. The default is located in ! your home directory and named .nethackrc on Unix systems. ! On other systems, the default may be different, usually ! NetHack.cnf. On DOS the name is defaults.nh, while on the ! Macintosh or BeOS, it is NetHack Defaults. The ! ! ! ! November Last change: 17 1 ! ! ! ! ! ! ! NETHACK(6) 1999 NETHACK(6) ! ! ! configuration file's location may be specified by setting ! NETHACKOPTIONS to a string consisting of an @ character fol- ! lowed by the filename. ! The -u playername option supplies the answer to the question ! "Who are you?". It overrides any name from the options or ! configuration file, USER, LOGNAME, or getlogin(), which will ! otherwise be tried in order. If none of these provides a ! useful name, the player will be asked for one. Player names ! (in conjunction with uids) are used to identify save files, ! so you can have several saved games under different names. ! Conversely, you must use the appropriate player name to ! restore a saved game. ! ! A playername suffix or a separate option, -p profession can ! be used to determine the character role. You can specify ! either the male or female name for the character role, or ! the first three characters of the role as an abbreviation. ! -p @ has been retained to explicitly request that a random ! role be chosen. It may need to be quoted with a backslash ! (\@) if @ is the "kill" character (see "stty") for the ter- ! minal, in order to prevent the current input line from being ! cleared. ! ! Likewise, -r race can be used to explicitly request that a ! race be chosen. ! ! Leaving out either of these will result in you being ! prompted during the game startup for the information. ! ! The -s option alone will print out the list of your scores ! on the current version. An immediately following -v reports ! on all versions present in the score file. The -s may also ! be followed by arguments -p and -r to print the scores of ! particular roles and races only. It may also be followed by ! one or more player names to print the scores of the players ! mentioned, by 'all' to print out all scores, or by a number ! to print that many top scores. ! ! The -n option suppresses printing of any news from the game ! administrator. ! ! The -D or -X option will start the game in a special non- ! scoring discovery mode. -D will, if the player is the game ! administrator, start in debugging (wizard) mode instead. ! ! The -d option, which must be the first argument if it ! appears, supplies a directory which is to serve as the play- ! ground. It overrides the value from NETHACKDIR, HACKDIR, or ! the directory specified by the game administrator during ! compilation (usually /usr/games/lib/nethackdir). This ! option is usually only useful to the game administrator. ! ! ! ! November Last change: 17 2 ! ! ! ! ! ! ! NETHACK(6) 1999 NETHACK(6) ! ! ! ! The playground must contain several auxiliary files such as ! help files, the list of top scorers, and a subdirectory save ! where games are saved. AUTHORS ! Jay Fenlason (+ Kenny Woodland, Mike Thome and Jon Payne) ! wrote the original hack, very much like rogue (but full of ! bugs). ! ! Andries Brouwer continuously deformed their sources into an ! entirely different game. ! ! Mike Stephenson has continued the perversion of sources, ! adding various warped character classes and sadistic traps ! with the help of many strange people who reside in that ! place between the worlds, the Usenet Zone. A number of ! these miscreants are immortalized in the historical roll of ! dishonor and various other places. ! ! The resulting mess is now called NetHack, to denote its ! development by the Usenet. Andries Brouwer has made this ! request for the distinction, as he may eventually release a ! new version of his own. FILES ! All files are in the playground, normally ! /usr/games/lib/nethackdir. If DLB was defined during the ! compile, the data files and special levels will be inside a ! larger file, normally nhdat, instead of being separate ! files. ! nethack The program itself. ! data, oracles, rumors Data files used by NetHack. ! options, quest.dat More data files. ! help, hh Help data files. ! cmdhelp, opthelp, wizhelp More help data files. ! *.lev Predefined special levels. ! dungeon Control file for special levels. ! history A short history of NetHack. ! license Rules governing redistribution. ! record The list of top scorers. ! logfile An extended list of games ! played. ! xlock.nnn Description of a dungeon level. ! perm Lock file for xlock.dd. ! bonesDD.nn Descriptions of the ghost and ! belongings of a deceased ! adventurer. ! save A subdirectory containing the ! saved games. ENVIRONMENT ! USER or LOGNAME Your login name. ! ! ! November Last change: 17 3 ! ! ! ! ! ! ! NETHACK(6) 1999 NETHACK(6) ! ! ! ! HOME Your home directory. ! SHELL Your shell. ! TERM The type of your terminal. ! HACKPAGER or PAGER Replacement for default pager. ! MAIL Mailbox file. ! MAILREADER Replacement for default reader ! (probably /bin/mail or /usr/ucb/mail). ! NETHACKDIR Playground. ! NETHACKOPTIONS String predefining several NetHack ! options. ! ! In addition, SHOPTYPE is used in debugging (wizard) mode. SEE ALSO ! dgn_comp(6), lev_comp(6), recover(6) BUGS ! Probably infinite. ! ! ! ! Dungeons & Dragons is a Trademark of TSR Inc. ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! November Last change: 17 4 --- 1,207 ---- ! NETHACK(6) NETHACK(6) NAME ! nethack - Exploring The Mazes of Menace SYNOPSIS ! nethack [ -d directory ] [ -n ] [ -p profession (role) ] [ ! -r race ] [ -[DX] ] [ -u playername ] [ -dec ] [ -ibm ] ! nethack [ -d directory ] -s [ -v ] [ -p profession (role) ! ] [ -r race ] [ playernames ] ! DESCRIPTION ! NetHack is a display oriented Dungeons & Dragons(tm) - ! like game. The standard tty display and command structure ! resemble rogue. ! ! Other, more graphical display options exist if you are ! using either a PC, or an X11 interface. ! ! To get started you really only need to know two commands. ! The command ? will give you a list of the available com- ! mands (as well as other information) and the command / ! will identify the things you see on the screen. ! ! To win the game (as opposed to merely playing to beat ! other people's high scores) you must locate the Amulet of ! Yendor which is somewhere below the 20th level of the dun- ! geon and get it out. Nobody has achieved this yet; any- ! body who does will probably go down in history as a hero ! among heros. ! ! When the game ends, whether by your dying, quitting, or ! escaping from the caves, NetHack will give you (a fragment ! of) the list of top scorers. The scoring is based on many ! aspects of your behavior, but a rough estimate is obtained ! by taking the amount of gold you've found in the cave plus ! four times your (real) experience. Precious stones may be ! worth a lot of gold when brought to the exit. There is a ! 10% penalty for getting yourself killed. ! ! The environment variable NETHACKOPTIONS can be used to ! initialize many run-time options. The ? command provides ! a description of these options and syntax. (The -dec and ! -ibm command line options are equivalent to the decgraph- ! ics and ibmgraphics run-time options described there, and ! are provided purely for convenience on systems supporting ! multiple types of terminals.) ! ! Because the option list can be very long (particularly ! when specifying graphics characters), options may also be ! included in a configuration file. The default is located ! in your home directory and named .nethackrc on Unix sys- ! tems. On other systems, the default may be different, ! usually NetHack.cnf. On DOS or Windows, the name is ! defaults.nh, while on the Macintosh or BeOS, it is NetHack ! Defaults. The configuration file's location may be speci- ! fied by setting NETHACKOPTIONS to a string consisting of ! an @ character followed by the filename. ! ! The -u playername option supplies the answer to the ques- ! tion "Who are you?". It overrides any name from the ! options or configuration file, USER, LOGNAME, or getlo- ! gin(), which will otherwise be tried in order. If none of ! these provides a useful name, the player will be asked for ! one. Player names (in conjunction with uids) are used to ! identify save files, so you can have several saved games ! under different names. Conversely, you must use the ! appropriate player name to restore a saved game. ! ! A playername suffix can be used to specify the profession, ! race, alignment and/or gender of the character. The full ! syntax of the playername that includes a suffix is "name- ! ppp-rrr-aaa-ggg". "ppp" are at least the first three let- ! ters of the profession (this can also be specified using a ! separate -p profession option). "rrr" are at least the ! first three letters of the character's race (this can also ! be specified using a separate -r race option). "aaa" are ! at last the first three letters of the character's align- ! ment, and "ggg" are at least the first three letters of ! the character's gender. Any of the parts of the suffix ! may be left out. ! ! -p profession can be used to determine the character role. ! You can specify either the male or female name for the ! character role, or the first three characters of the role ! as an abbreviation. -p @ has been retained to explicitly ! request that a random role be chosen. It may need to be ! quoted with a backslash (\@) if @ is the "kill" character ! (see "stty") for the terminal, in order to prevent the ! current input line from being cleared. ! ! Likewise, -r race can be used to explicitly request that a ! race be chosen. ! ! Leaving out any of these characteristics will result in ! you being prompted during the game startup for the infor- ! mation. ! ! ! The -s option alone will print out the list of your scores ! on the current version. An immediately following -v ! reports on all versions present in the score file. The -s ! may also be followed by arguments -p and -r to print the ! scores of particular roles and races only. It may also be ! followed by one or more player names to print the scores ! of the players mentioned, by 'all' to print out all ! scores, or by a number to print that many top scores. ! ! The -n option suppresses printing of any news from the ! game administrator. ! ! The -D or -X option will start the game in a special non- ! scoring discovery mode. -D will, if the player is the ! game administrator, start in debugging (wizard) mode ! instead. ! ! The -d option, which must be the first argument if it ! appears, supplies a directory which is to serve as the ! playground. It overrides the value from NETHACKDIR, HACK- ! DIR, or the directory specified by the game administrator ! during compilation (usually /usr/games/lib/nethackdir). ! This option is usually only useful to the game administra- ! tor. The playground must contain several auxiliary files ! such as help files, the list of top scorers, and a subdi- ! rectory save where games are saved. AUTHORS ! Jay Fenlason (+ Kenny Woodland, Mike Thome and Jon Payne) ! wrote the original hack, very much like rogue (but full of ! bugs). ! ! Andries Brouwer continuously deformed their sources into ! an entirely different game. ! ! Mike Stephenson has continued the perversion of sources, ! adding various warped character classes and sadistic traps ! with the help of many strange people who reside in that ! place between the worlds, the Usenet Zone. A number of ! these miscreants are immortalized in the historical roll ! of dishonor and various other places. ! ! The resulting mess is now called NetHack, to denote its ! development by the Usenet. Andries Brouwer has made this ! request for the distinction, as he may eventually release ! a new version of his own. FILES ! All files are in the playground, normally ! /usr/games/lib/nethackdir. If DLB was defined during the ! compile, the data files and special levels will be inside ! a larger file, normally nhdat, instead of being separate ! files. ! nethack The program itself. ! data, oracles, rumors Data files used by NetHack. ! options, quest.dat More data files. ! help, hh Help data files. ! cmdhelp, opthelp, wizhelp More help data files. ! *.lev Predefined special levels. ! dungeon Control file for special lev- ! els. ! history A short history of NetHack. ! license Rules governing redistribu- ! tion. ! record The list of top scorers. ! logfile An extended list of games ! played. ! xlock.nnn Description of a dungeon ! level. ! perm Lock file for xlock.dd. ! bonesDD.nn Descriptions of the ghost and ! belongings of a deceased ! adventurer. ! save A subdirectory containing the ! saved games. ENVIRONMENT ! USER or LOGNAME Your login name. ! HOME Your home directory. ! SHELL Your shell. ! TERM The type of your terminal. ! HACKPAGER or PAGER Replacement for default pager. ! MAIL Mailbox file. ! MAILREADER Replacement for default reader ! (probably /bin/mail or ! /usr/ucb/mail). ! NETHACKDIR Playground. ! NETHACKOPTIONS String predefining several NetHack ! options. ! In addition, SHOPTYPE is used in debugging (wizard) mode. SEE ALSO ! dgn_comp(6), lev_comp(6), recover(6) BUGS ! Probably infinite. ! Dungeons & Dragons is a Trademark of TSR Inc. + 12 March 2002 NETHACK(6) *** nethack-3.3.1/doc/window.doc Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/doc/window.doc Thu Mar 21 07:37:36 2002 *************** *** 5,20 **** main NetHack code from window-system specific code. The implementation supports multiple window systems in the same binary. Even if you only wish to support one window-port on your port, you will need to follow ! the instructions in Section VII to get a compilable binary. Contents: ! I. Window Types and Terminology ! II. Interface Specification ! III. Global variables ! IV. New or respecified common, high level routines ! V. Game startup ! VI. Conventions ! VII. Implementation and Multi-window support I. Window Types and Terminology --- 5,22 ---- main NetHack code from window-system specific code. The implementation supports multiple window systems in the same binary. Even if you only wish to support one window-port on your port, you will need to follow ! the instructions in Section IX to get a compilable binary. Contents: ! I. Window Types and Terminology ! II. Interface Specification ! III. Global variables ! IV. WINCAP preferences support ! V. New or respecified common, high level routines ! VI. Helper routines ! VII. Game startup ! VIII. Conventions ! IX. Implementation and Multi-window support I. Window Types and Terminology *************** *** 163,168 **** --- 165,173 ---- -- 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. + -- getlin() can assume the input buffer is at least BUFSZ + bytes in size and must truncate inputs to fit, including + the nul character. int get_ext_cmd(void) -- Get an extended command in a window-port specific way. An index into extcmdlist[] is returned on a successful *************** *** 251,257 **** 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. --- 256,264 ---- 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], ! but there are a few exceptions such as the tty player ! selection code which uses '*'. -- 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. *************** *** 347,352 **** --- 354,368 ---- -- The tombstone code. If you want the traditional code use genl_outrip for the value and check the #if in rip.c. + preference_update(preference) + -- The player has just changed one of the wincap preference + settings, and the NetHack core is notifying your window + port of that change. If your window-port is capable of + dynamically adjusting to the change then it should do so. + Your window-port will only be notified of a particular + change if it indicated that it wants to be by setting the + corresponding bit in the wincap mask. + III. Global variables The following global variables are defined in decl.c and must be used by *************** *** 366,372 **** short ospeed; Set and declared in sys/unix/unixtty.c (don't know about other sys files). ! IV. New or respecified common, high level routines These are not part of the interface, but mentioned here for your information. --- 382,590 ---- short ospeed; Set and declared in sys/unix/unixtty.c (don't know about other sys files). ! The following global variable is defined in options.c. It equates a ! list of wincap option names with their associated bit-mask [see ! section IV WINCAP preferences support]. The array is zero-terminated. ! ! struct wc_Opt wc_options[]; ! One entry for each available WINCAP option. ! Each entry has a wc_name field and a wc_bit ! field. ! ! IV. WINCAP preferences support ! ! Starting with NetHack 3.4.0, the window interface was enhanced to provide ! a common way of setting window port user preferences from the config file, ! and from the command line for some settings. ! ! The wincap preference settings all have their underlying values stored ! in iflags fields. The names of the wincap related fields are all pre- ! fixed with wc_ to make it easy to identify them. Your window port can ! access the fields directly. ! ! Your window port identifies what options it will react to and support ! by setting bits in the window_procs wincap mask. See section IX for ! details of where the wincap mask resides. ! ! Two things control whether any preference setting appears in the ! 'O' command options menu during the game: ! 1. The option must be marked as being supported by having its ! bit set in the window_procs wincap mask. ! 2. The option must have its optflag field set to SET_IN_GAME in order ! to be able to set the option, or marked DISP_IN_GAME if you just ! want to reveal what the option is set to. ! Both conditions must be true to be able to see or set the option from ! within NetHack. ! ! The default values for the optflag field for all the options are ! hard-coded into the option in options.c. The default value for ! the options can be altered by calling ! set_wc_option_mod_status(optmask, status) ! specifying the option modification status to one of SET_IN_FILE, ! DISP_IN_GAME, or SET_IN_GAME. ! ! The setting of any wincap option is handled by the NetHack core option ! processing code. You do not have to provide a parser in your window ! port, nor should you set the values for the iflags.wc_* fields ! directly within the port code. The port code should honor whatever ! values were put there by the core when processing options, either ! in the config file, or by the 'O' command. ! ! You may be wondering what values your window port will find in the ! iflags.wc_* fields for options that the user has not specified ! in his/her config file. Put another way, how does you port code ! tell if an option has not been set? The next paragraph explains that. ! ! If the core does not set an option, it will still be initialized ! to its default value. Those default values for the ! iflags.wc_* fields are: ! ! o All boolean fields are initialized to the starting ! value specified for that option in the boolopt array in ! options.c. The window-port should respect that setting ! unless it has a very good reason for not doing so. ! o All int fields are initialized to zero. Zero is not a valid ! setting for any of the int options, so if your port code ! encounters a zero there, it can assume that the preference ! option was not specified. In that case, the window-port code ! should use a default setting that the port is comfortable with. ! It should write the default setting back into the iflags.wc_* ! field. That is the only time that your window-port could should ! update those fields. ! o All "char *" fields will be null pointers. Be sure to check for ! that in your window-port code before using such a pointer, or ! you'll end up triggering a nasty fault. ! ! Here are the wincap preference settings that your port can choose ! to support: ! ! +--------------------+--------------------+--------------------+--------+ ! | | | iflags field | data | ! | player option | bit in wincap mask | for value | type | ! |--------------------+--------------------+--------------------+--------+ ! | align_message | WC_ALIGN_MESSAGE | wc_align_message |int | ! | align_status | WC_ALIGN_STATUS | wc_align_status |int | ! | ascii_map | WC_ASCII_MAP | wc_ascii_map |boolean | ! | color | WC_COLOR | wc_color |boolean | ! | eight_bit_tty | WC_EIGHT_BIT_IN | wc_eight_bit_input |boolean | ! | font_map | WC_FONT_MAP | wc_font_map |char * | ! | font_menu | WC_FONT_MENU | wc_font_menu |char * | ! | font_message | WC_FONT_MESSAGE | wc_font_message |char * | ! | font_status | WC_FONT_STATUS | wc_font_status |char * | ! | font_text | WC_FONT_TEXT | wc_font_text |char * | ! | font_size_map | WC_FONTSIZ_MAP | wc_fontsiz_map |int | ! | font_size_menu | WC_FONTSIZ_MENU | wc_fontsiz_menu |int | ! | font_size_message | WC_FONTSIZ_MESSAGE | wc_fontsiz_message |int | ! | font_size_status | WC_FONTSIZ_STATUS | wc_fontsiz_status |int | ! | font_size_text | WC_FONTSIZ_TEXT | wc_fontsiz_text |int | ! | hilite_pet | WC_HILITE_PET | wc_hilite_pet |boolean | ! | large_font | WC_LARGE_FONT | wc_large_font |boolean | ! | map_mode | WC_MAP_MODE | wc_map_mode |int | ! | player_selection | WC_PLAYER_SELECTION| wc_player_selection|int | ! | popup_dialog | WC_POPUP_DIALOG | wc_popup_dialog |boolean | ! | preload_tiles | WC_PRELOAD_TILES | wc_preload_tiles |boolean | ! | scroll_margin | WC_SCROLL_MARGIN | wc_scroll_margin |int | ! | splash_screen | WC_SPLASH_SCREEN | wc_splash_screen |boolean | ! | tiled_map | WC_TILED_MAP | wc_tiled_map |boolean | ! | tile_width | WC_TILE_WIDTH | wc_tile_width |int | ! | tile_height | WC_TILE_HEIGHT | wc_tile_height |int | ! | tile_file | WC_TILE_FILE | wc_tile_file |char * | ! | use_inverse | WC_INVERSE | wc_inverse |boolean | ! | vary_msgcount | WC_VARY_MSGCOUNT | wc_vary_msgcount |int | ! | windowcolors | WC_WINDOWCOLORS | wc_foregrnd_menu |char * | ! | | | wc_backgrnd_menu |char * | ! | | | wc_foregrnd_message|char * | ! | | | wc_backgrnd_message|char * | ! | | | wc_foregrnd_status |char * | ! | | | wc_backgrnd_status |char * | ! | | | wc_foregrnd_text |char * | ! | | | wc_backgrnd_text |char * | ! +--------------------+--------------------+--------------------+--------+ ! ! align_message -- where to place message window (top, bottom, left, right) ! align_status -- where to place status window (top, bottom, left, right). ! ascii_map -- port should display an ascii map if it can. ! color -- port should display color if it can. ! eight_bit_tty -- port should allow eight bit input. ! font_map -- port should use a font by this name for map window. ! font_menu -- port should use a font by this name for menu windows. ! font_message -- port should use a font by this name for message window. ! font_size_map -- port should use this size font for the map window. ! font_size_menu -- port should use this size font for menu windows. ! font_size_message ! -- port should use this size font for the message window. ! font_size_status-- port should use this size font for the status window. ! font_size_text -- port should use this size font for text windows. ! font_status -- port should use a font by this name for status window. ! font_text -- port should use a font by this name for text windows. ! hilite_pet -- port should mark pets in some special way on the map. ! large_font -- port should use a large font. ! map_mode -- port should display the map in the manner specified. ! player_selection ! -- dialog or prompts for choosing character. ! popup_dialog -- port should pop up dialog boxes for input. ! preload_tiles -- port should preload tiles into memory. ! scroll_margin -- port should scroll the display when the hero or cursor ! is this number of cells away from the edge of the window. ! splash_screen -- port should/should not display an opening splashscreen. ! tiled_map -- port should display a tiled map if it can. ! tile_width -- port should display tiles with this width or round to closest ! if it can. ! tile_height -- port should display tiles with this height or round to closest ! if it can. ! tile_file -- open this alternative tile file. The file name is likely to be ! window-port or platform specific. ! use_inverse -- port should display inverse when NetHack asks for it. ! vary_msgcount -- port should display this number of messages at a time in ! the message window. ! windowcolors ! -- port should use these colors for window foreground/background ! colors. Syntax: ! menu fore/back message fore/back status fore/back text fore/back ! ! Whenever one of these settings is adjusted, the port is notified of a change ! to the setting by calling the port's preference_update() routine. The port ! is only notified if it has indicated that it supports that option by setting ! the option's bit in the port's wincap mask. The port can choose to adjust ! for the change to an option that it receives notification about, or ignore it. ! The former approach is recommended. If you don't want to deal with a ! user-initiated setting change, then the port should call ! set_wc_option_mod_status(mask, SET_IN_FILE) to make the option invisible to ! the user. ! ! Functions available for the window port to call: ! ! set_wc_option_mod_status(optmask, status) ! -- Adjust the optflag field for a set of options to ! specify whether the port wants the option to appear ! in the 'O' command options menu, The second parameter, ! "status" can be set to SET_IN_FILE, DISP_IN_GAME, ! or SET_IN_GAME (SET_IN_FILE implies that the option ! is completely hidden during the game). ! ! set_option_mod_status(optnam, status) ! -- Adjust the optflag field for one of the core options ! that is not part of the wincap suite. A port might use ! this to override the default initialization setting for ! status specified in options.c. Note that you have to ! specify the option by name and that you can only set ! one option per call unlike set_wc_option_mod_status(). ! ! ! Adding a new wincap option: ! ! To add a new wincap option, please follow all these steps: ! 1. Add the option to the wincap preference settings table above. ! 2. Add the description to the paragraph below the chart. ! 3. Add the WC_ to the bit list in include/winprocs.h (if there is room). ! 4. Add the wc_ field(s) to the iflags structure in flag.h. ! 5. Add an appropriate parser to parseoptions() in options.c. ! 6. Add code to display current value to get_compopt_value() in options.c. ! 7. Document the option in Guidebook.mn and Guidebook.tex. ! 8. Add the bit name to the OR'd values in your window port's winprocs struct ! wincap mask if your port supports the option. ! ! V. New or respecified common, high level routines These are not part of the interface, but mentioned here for your information. *************** *** 388,395 **** by Norep() and pline(). If the window system is not active (!iflags.window_inited) pline() uses raw_print(). ! V. Game startup The following is the general order in which calls from main() should be made, as they relate to the window system. The actual code may differ, but the --- 606,625 ---- by Norep() and pline(). If the window system is not active (!iflags.window_inited) pline() uses raw_print(). + VI. Helper Routines + + These are not part of the interface. They may be called by your + window port routines to perform the desired task, instead of duplicating + the necessary code in each window port. + + mapglyph(int glyph, int *ochar, int *ocolor, unsigned *special, int x, int y) + -- Maps glyph at x,y to NetHack ascii character and color. + If it represents something special such as a pet, that + information is returned as set bits in "special." + Usually called from the window port's print_glyph() + routine. ! VII. Game startup The following is the general order in which calls from main() should be made, as they relate to the window system. The actual code may differ, but the *************** *** 422,428 **** in the future to make it possible to replace this on a per window-port basis. ! VI. Conventions init_nhwindows() is expected to display a gee-whiz banner window, including the Copyright message. It is recommended that the COPYRIGHT_BANNER_A, --- 652,658 ---- in the future to make it possible to replace this on a per window-port basis. ! VIII. Conventions init_nhwindows() is expected to display a gee-whiz banner window, including the Copyright message. It is recommended that the COPYRIGHT_BANNER_A, *************** *** 447,453 **** and may be replaced completely by other window ports. ! VII. Implementation and Multi-window support NetHack 3.2 and higher support multiple window systems in the same binary. When writing a new window-port, you need to follow the following guidelines: --- 677,683 ---- and may be replaced completely by other window ports. ! IX. Implementation and Multi-window support NetHack 3.2 and higher support multiple window systems in the same binary. When writing a new window-port, you need to follow the following guidelines: *************** *** 478,484 **** 3) Declare a structure, "struct window_procs prefix_procs", (with your prefix instead of "prefix") and fill in names of all of your interface functions. The first entry in this structure is the name ! of your window-port, which should be the prefix. The other entries are the function addresses. Assuming that you followed the convention in (2), you can safely copy --- 708,716 ---- 3) Declare a structure, "struct window_procs prefix_procs", (with your prefix instead of "prefix") and fill in names of all of your interface functions. The first entry in this structure is the name ! of your window-port, which should be the prefix. The second entry ! is the wincap mask that identifies what window port preference ! settings your port will react to and support. The other entries are the function addresses. Assuming that you followed the convention in (2), you can safely copy *************** *** 525,531 **** 9) Look at your port's portmain.c (the file containing main()) and make sure that all of the calls match the the requirements laid out in ! Section V. Now, proceed with compilation and installation as usual. Don't forget to edit Makefile.src (or its equivalent) and config.h to set the --- 757,763 ---- 9) Look at your port's portmain.c (the file containing main()) and make sure that all of the calls match the the requirements laid out in ! Section VII. Now, proceed with compilation and installation as usual. Don't forget to edit Makefile.src (or its equivalent) and config.h to set the *** nethack-3.3.1/include/align.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/align.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)align.h 3.3 91/12/29 */ /* Copyright (c) Mike Stephenson, Izchak Miller 1991. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)align.h 3.4 1991/12/29 */ /* Copyright (c) Mike Stephenson, Izchak Miller 1991. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/amiconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/amiconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)amiconf.h 3.3 2000/01/12 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1990, 1991, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)amiconf.h 3.4 2000/01/12 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1990, 1991, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 30,42 **** # define DCC30_BUG /* A bitfield bug (from dog.c, others) in DICE 3.0. */ #endif typedef long off_t; #define MICRO /* must be defined to allow some inclusions */ /* data librarian defs */ ! #define DLBFILE "NetHack:nhdat" /* main library */ ! #define DLBFILE2 "NetHack:nhsdat" /* sound library */ #define FILENAME_CMP stricmp /* case insensitive */ #ifndef __SASC_60 --- 30,52 ---- # define DCC30_BUG /* A bitfield bug (from dog.c, others) in DICE 3.0. */ #endif + #ifndef __GNUC__ typedef long off_t; + #endif #define MICRO /* must be defined to allow some inclusions */ + #define NOCWD_ASSUMPTIONS /* Allow paths to be specified for HACKDIR, + LEVELDIR, SAVEDIR, BONESDIR, DATADIR, + SCOREDIR, LOCKDIR, and CONFIGDIR. */ + /* data librarian defs */ ! #ifndef NOCWD_ASSUMPTIONS ! # define DLBFILE "NetHack:nhdat" /* main library */ ! # define DLBFILE2 "NetHack:nhsdat" /* sound library */ ! #else ! # define DLBFILE "nhdat" /* main library */ ! # define DLBFILE2 "nhsdat" /* sound library */ #define FILENAME_CMP stricmp /* case insensitive */ #ifndef __SASC_60 *************** *** 86,92 **** extern void FDECL(ami_mkargline, (int *, char **[])); extern void ami_wininit_data(void); ! extern boolean FromWBench; /* how were we run? */ extern int ami_argc; extern char **ami_argv; --- 96,103 ---- extern void FDECL(ami_mkargline, (int *, char **[])); extern void ami_wininit_data(void); ! #define FromWBench 0 /* A hint for compiler ... */ ! /* extern boolean FromWBench; /* how were we run? */ extern int ami_argc; extern char **ami_argv; *************** *** 101,107 **** #define remove(x) unlink(x) /* DICE wants rewind() to return void. We want it to return int. */ ! #ifdef _DCC # define rewind(f) fseek(f, 0, 0) #endif --- 112,118 ---- #define remove(x) unlink(x) /* DICE wants rewind() to return void. We want it to return int. */ ! #if defined(_DCC) || defined(__GNUC__) # define rewind(f) fseek(f, 0, 0) #endif *** nethack-3.3.1/include/artifact.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/artifact.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)artifact.h 3.3 95/05/31 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)artifact.h 3.4 1995/05/31 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 47,52 **** --- 47,53 ---- aligntyp alignment; /* alignment of bequeathing gods */ short role; /* character role associated with */ short race; /* character race associated with */ + long cost; /* price when sold to hero (default 100 x base cost) */ }; /* invoked properties with special powers */ *** nethack-3.3.1/include/artilist.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/artilist.h Thu Mar 21 07:37:36 2002 *************** *** 1,18 **** ! /* SCCS Id: @(#)artilist.h 3.3 2000/07/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifdef MAKEDEFS_C /* in makedefs.c, all we care about is the list of names */ ! #define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl,rac) nam static const char *artifact_names[] = { #else /* in artifact.c, set up the actual artifact list structure */ ! #define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl, rac) \ ! { typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac } #define NO_ATTK {0,0,0,0} /* no attack */ #define NO_DFNS {0,0,0,0} /* no defense */ --- 1,18 ---- ! /* SCCS Id: @(#)artilist.h 3.4 2001/11/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifdef MAKEDEFS_C /* in makedefs.c, all we care about is the list of names */ ! #define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl,rac,cost) nam static const char *artifact_names[] = { #else /* in artifact.c, set up the actual artifact list structure */ ! #define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl,rac,cost) \ ! { typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost } #define NO_ATTK {0,0,0,0} /* no attack */ #define NO_DFNS {0,0,0,0} /* no defense */ *************** *** 29,69 **** STATIC_OVL NEARDATA struct artifact artilist[] = { #endif /* MAKEDEFS_C */ /* dummy element #0, so that all interesting indices are non-zero */ A("", STRANGE_OBJECT, ! 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), A("Excalibur", LONG_SWORD, (SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0, ! PHYS(5,10), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM ), /* * Stormbringer only has a 2 because it can drain a level, * providing 8 more. */ A("Stormbringer", RUNESWORD, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN|SPFX_INTEL|SPFX_DRLI), 0, 0, ! DRLI(5,2), DRLI(0,0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM ), /* * Mjollnir will return to the hand of the wielder when thrown * if the wielder is a Valkyrie wearing Gauntlets of Power. */ A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */ (SPFX_RESTR|SPFX_ATTK), 0, 0, ! ELEC(5,24), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_VALKYRIE, NON_PM ), A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, ! PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM ), A("Grimtooth", ORCISH_DAGGER, SPFX_RESTR, 0, 0, ! PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC ), /* * Orcrist and Sting have same alignment as elves. */ A("Orcrist", ELVEN_BROADSWORD, SPFX_DFLAG2, 0, M2_ORC, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF ), /* * The combination of SPFX_WARN and M2_something on an artifact --- 29,76 ---- STATIC_OVL NEARDATA struct artifact artilist[] = { #endif /* MAKEDEFS_C */ + /* Artifact cost rationale: + * 1. The more useful the artifact, the better its cost. + * 2. Quest artifacts are highly valued. + * 3. Chaotic artifacts are inflated due to scarcity (and balance). + */ + + /* dummy element #0, so that all interesting indices are non-zero */ A("", STRANGE_OBJECT, ! 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L ), A("Excalibur", LONG_SWORD, (SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0, ! PHYS(5,10), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, 4000L ), /* * Stormbringer only has a 2 because it can drain a level, * providing 8 more. */ A("Stormbringer", RUNESWORD, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN|SPFX_INTEL|SPFX_DRLI), 0, 0, ! DRLI(5,2), DRLI(0,0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 8000L ), /* * Mjollnir will return to the hand of the wielder when thrown * if the wielder is a Valkyrie wearing Gauntlets of Power. */ A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */ (SPFX_RESTR|SPFX_ATTK), 0, 0, ! ELEC(5,24), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L ), A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, ! PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L ), A("Grimtooth", ORCISH_DAGGER, SPFX_RESTR, 0, 0, ! PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L ), /* * Orcrist and Sting have same alignment as elves. */ A("Orcrist", ELVEN_BROADSWORD, SPFX_DFLAG2, 0, M2_ORC, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 2000L ), /* * The combination of SPFX_WARN and M2_something on an artifact *************** *** 73,122 **** */ A("Sting", ELVEN_DAGGER, (SPFX_WARN|SPFX_DFLAG2), 0, M2_ORC, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF ), /* * Magicbane is a bit different! Its magic fanfare * unbalances victims in addition to doing some damage. */ A("Magicbane", ATHAME, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, ! STUN(3,4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM ), A("Frost Brand", LONG_SWORD, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, ! COLD(5,0), COLD(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM ), A("Fire Brand", LONG_SWORD, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, ! FIRE(5,0), FIRE(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM ), A("Dragonbane", BROADSWORD, (SPFX_RESTR|SPFX_DCLAS), 0, S_DRAGON, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), A("Demonbane", LONG_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_DEMON, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), A("Werebane", SILVER_SABER, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_WERE, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), A("Grayswandir", SILVER_SABER, (SPFX_RESTR|SPFX_HALRES), 0, 0, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), A("Giantslayer", LONG_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_GIANT, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM ), A("Ogresmasher", WAR_HAMMER, (SPFX_RESTR|SPFX_DCLAS), 0, S_OGRE, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), A("Trollsbane", MORNING_STAR, (SPFX_RESTR|SPFX_DCLAS), 0, S_TROLL, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), /* * Two problems: 1) doesn't let trolls regenerate heads, * 2) doesn't give unusual message for 2-headed monsters (but --- 80,129 ---- */ A("Sting", ELVEN_DAGGER, (SPFX_WARN|SPFX_DFLAG2), 0, M2_ORC, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L ), /* * Magicbane is a bit different! Its magic fanfare * unbalances victims in addition to doing some damage. */ A("Magicbane", ATHAME, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, ! STUN(3,4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM, 3500L ), A("Frost Brand", LONG_SWORD, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, ! COLD(5,0), COLD(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L ), A("Fire Brand", LONG_SWORD, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, ! FIRE(5,0), FIRE(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L ), A("Dragonbane", BROADSWORD, (SPFX_RESTR|SPFX_DCLAS), 0, S_DRAGON, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 500L ), A("Demonbane", LONG_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_DEMON, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 2500L ), A("Werebane", SILVER_SABER, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_WERE, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L ), A("Grayswandir", SILVER_SABER, (SPFX_RESTR|SPFX_HALRES), 0, 0, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 8000L ), A("Giantslayer", LONG_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_GIANT, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 200L ), A("Ogresmasher", WAR_HAMMER, (SPFX_RESTR|SPFX_DCLAS), 0, S_OGRE, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L ), A("Trollsbane", MORNING_STAR, (SPFX_RESTR|SPFX_DCLAS), 0, S_TROLL, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L ), /* * Two problems: 1) doesn't let trolls regenerate heads, * 2) doesn't give unusual message for 2-headed monsters (but *************** *** 124,130 **** */ A("Vorpal Blade", LONG_SWORD, (SPFX_RESTR|SPFX_BEHEAD), 0, 0, ! PHYS(5,1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM ), /* * Ah, never shall I forget the cry, * or the shriek that shrieked he, --- 131,137 ---- */ A("Vorpal Blade", LONG_SWORD, (SPFX_RESTR|SPFX_BEHEAD), 0, 0, ! PHYS(5,1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 4000L ), /* * Ah, never shall I forget the cry, * or the shriek that shrieked he, *************** *** 135,145 **** */ A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, ! PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM ), A("Sunsword", LONG_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_UNDEAD, ! PHYS(5,0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), /* * The artifacts for the quest dungeon, all self-willed. --- 142,152 ---- */ A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, ! PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L ), A("Sunsword", LONG_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_UNDEAD, ! PHYS(5,0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L ), /* * The artifacts for the quest dungeon, all self-willed. *************** *** 148,232 **** A("The Orb of Detection", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! INVIS, A_LAWFUL, PM_ARCHEOLOGIST, NON_PM ), A("The Heart of Ahriman", LUCKSTONE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0, ! NO_ATTK, NO_DFNS, NO_CARY, ! LEVITATION, A_NEUTRAL, PM_BARBARIAN, NON_PM ), A("The Sceptre of Might", MACE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DALIGN), 0, 0, PHYS(5,0), NO_DFNS, CARY(AD_MAGM), ! CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM ), #if 0 /* OBSOLETE */ A("The Palantir of Westernesse", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, ! TAMING, A_CHAOTIC, NON_PM , PM_ELF), #endif A("The Staff of Aesculapius", QUARTERSTAFF, (SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_REGEN), 0,0, DRLI(0,0), DRLI(0,0), NO_CARY, ! HEALING, A_NEUTRAL, PM_HEALER, NON_PM ), A("The Magic Mirror of Merlin", MIRROR, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), SPFX_ESP, 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! 0, A_LAWFUL, PM_KNIGHT, NON_PM ), A("The Eyes of the Overworld", LENSES, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_XRAY), 0, 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM ), A("The Mitre of Holiness", HELM_OF_BRILLIANCE, (SPFX_NOGEN|SPFX_RESTR|SPFX_DFLAG2|SPFX_INTEL), 0, M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ! ENERGY_BOOST, A_LAWFUL, PM_PRIEST, NON_PM ), A("The Longbow of Diana", BOW, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_REFLECT), SPFX_ESP, 0, PHYS(5,0), NO_DFNS, NO_CARY, ! CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM ), A("The Master Key of Thievery", SKELETON_KEY, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), (SPFX_WARN|SPFX_TCTRL|SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, ! UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM ), A("The Tsurugi of Muramasa", TSURUGI, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_BEHEAD|SPFX_LUCK), 0, 0, PHYS(0,8), NO_DFNS, NO_CARY, ! 0, A_LAWFUL, PM_SAMURAI, NON_PM ), #ifdef TOURIST A("The Platinum Yendorian Express Card", CREDIT_CARD, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DEFN), (SPFX_ESP|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM ), #endif A("The Orb of Fate", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_LUCK), (SPFX_WARN|SPFX_HSPDAM|SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, ! LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM ), A("The Eye of the Aethiopica", AMULET_OF_ESP, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_EREGEN|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! CREATE_PORTAL, A_NEUTRAL, PM_WIZARD, NON_PM ), /* * terminator; otyp must be zero */ ! A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ) }; /* artilist[] (or artifact_names[]) */ --- 155,240 ---- A("The Orb of Detection", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! INVIS, A_LAWFUL, PM_ARCHEOLOGIST, NON_PM, 2500L ), A("The Heart of Ahriman", LUCKSTONE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0, ! /* this stone does double damage if used as a projectile weapon */ ! PHYS(5,0), NO_DFNS, NO_CARY, ! LEVITATION, A_NEUTRAL, PM_BARBARIAN, NON_PM, 2500L ), A("The Sceptre of Might", MACE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DALIGN), 0, 0, PHYS(5,0), NO_DFNS, CARY(AD_MAGM), ! CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L ), #if 0 /* OBSOLETE */ A("The Palantir of Westernesse", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, ! TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L ), #endif A("The Staff of Aesculapius", QUARTERSTAFF, (SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_REGEN), 0,0, DRLI(0,0), DRLI(0,0), NO_CARY, ! HEALING, A_NEUTRAL, PM_HEALER, NON_PM, 5000L ), A("The Magic Mirror of Merlin", MIRROR, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), SPFX_ESP, 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L ), A("The Eyes of the Overworld", LENSES, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_XRAY), 0, 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM, 2500L ), A("The Mitre of Holiness", HELM_OF_BRILLIANCE, (SPFX_NOGEN|SPFX_RESTR|SPFX_DFLAG2|SPFX_INTEL), 0, M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ! ENERGY_BOOST, A_LAWFUL, PM_PRIEST, NON_PM, 2000L ), A("The Longbow of Diana", BOW, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_REFLECT), SPFX_ESP, 0, PHYS(5,0), NO_DFNS, NO_CARY, ! CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM, 4000L ), A("The Master Key of Thievery", SKELETON_KEY, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), (SPFX_WARN|SPFX_TCTRL|SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, ! UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L ), A("The Tsurugi of Muramasa", TSURUGI, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_BEHEAD|SPFX_LUCK), 0, 0, PHYS(0,8), NO_DFNS, NO_CARY, ! 0, A_LAWFUL, PM_SAMURAI, NON_PM, 4500L ), #ifdef TOURIST A("The Platinum Yendorian Express Card", CREDIT_CARD, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DEFN), (SPFX_ESP|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L ), #endif A("The Orb of Fate", CRYSTAL_BALL, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_LUCK), (SPFX_WARN|SPFX_HSPDAM|SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, ! LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L ), A("The Eye of the Aethiopica", AMULET_OF_ESP, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_EREGEN|SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), ! CREATE_PORTAL, A_NEUTRAL, PM_WIZARD, NON_PM, 4000L ), /* * terminator; otyp must be zero */ ! A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L ) }; /* artilist[] (or artifact_names[]) */ *** nethack-3.3.1/include/attrib.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/attrib.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)attrib.h 3.3 90/22/02 */ /* Copyright 1988, Mike Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)attrib.h 3.4 1990/22/02 */ /* Copyright 1988, Mike Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/beconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/beconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)beconf.h 3.3 98/07/08 */ /* Copyright (c) Dean Luick 1996. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)beconf.h 3.4 1998/07/08 */ /* Copyright (c) Dean Luick 1996. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/color.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/color.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)color.h 3.3 92/02/02 */ /* Copyright (c) Steve Linhart, Eric Raymond, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)color.h 3.4 1992/02/02 */ /* Copyright (c) Steve Linhart, Eric Raymond, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/config.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/config.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)config.h 3.3 2000/07/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)config.h 3.4 2002/03/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 46,51 **** --- 46,52 ---- /* #define X11_GRAPHICS */ /* X11 interface */ /* #define QT_GRAPHICS */ /* Qt interface */ /* #define GNOME_GRAPHICS */ /* Gnome interface */ + /* #define MSWIN_GRAPHICS */ /* Windows NT, CE, Graphics */ /* * Define the default window system. This should be one that is compiled *************** *** 82,87 **** --- 83,89 ---- #endif #ifdef QT_GRAPHICS + # define USER_SOUNDS /* Use sounds */ # define USE_XPM /* Use XPM format for images (required) */ # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.ppm) */ # ifndef DEFAULT_WINDOW_SYS *************** *** 97,102 **** --- 99,114 ---- # endif #endif + #ifdef MSWIN_GRAPHICS + # ifdef TTY_GRAPHICS + # undef TTY_GRAPHICS + # endif + # ifndef DEFAULT_WINDOW_SYS + # define DEFAULT_WINDOW_SYS "mswin" + # endif + # define HACKDIR "\\nethack" + #endif + #ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "tty" #endif *************** *** 186,192 **** * otherwise it will be the current directory. */ # ifndef HACKDIR ! # define HACKDIR "/usr/games/lib/nethackdir" /* nethack directory */ # endif /* --- 198,208 ---- * otherwise it will be the current directory. */ # ifndef HACKDIR ! # ifdef __APPLE__ ! # define HACKDIR "nethackdir" /* nethack directory */ ! # else ! # define HACKDIR "/usr/games/lib/nethackdir" ! # endif # endif /* *************** *** 321,326 **** --- 337,354 ---- #define EXP_ON_BOTL /* Show experience on bottom line */ /* #define SCORE_ON_BOTL */ /* added by Gary Erickson (erickson@ucivax) */ + + /* + * Section 5: EXPERIMENTAL STUFF + * + * Conditional compilation of new or experimental options are controlled here. + * Enable any of these at your own risk -- there are almost certainly + * bugs left here. + */ + + /*#define GOLDOBJ */ /* Gold is kept on obj chains - Helge Hafting */ + + /* End of Section 5 */ #include "global.h" /* Define everything else according to choices above */ *** nethack-3.3.1/include/config1.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/config1.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)config1.h 3.3 1999/12/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)config1.h 3.4 1999/12/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 32,38 **** /* * Mac Stuff. */ ! #ifdef applec /* MPW auto-defined symbol */ # define MAC #endif --- 32,38 ---- /* * Mac Stuff. */ ! #ifdef macintosh /* Auto-defined symbol for MPW compilers (sc and mrc) */ # define MAC #endif *************** *** 41,47 **** # define NEED_VARARGS #endif ! #ifdef __MWERKS__ /* defined by Metrowerks compiler */ # ifndef __BEOS__ /* BeOS */ # define MAC # endif --- 41,47 ---- # define NEED_VARARGS #endif ! #ifdef __MWERKS__ /* defined by Metrowerks' Codewarrior compiler */ # ifndef __BEOS__ /* BeOS */ # define MAC # endif *************** *** 108,113 **** --- 108,118 ---- /* * Windows NT Autodetection */ + #ifdef _WIN32_WCE + # ifndef WIN32 + # define WIN32 + # endif + #endif #ifdef WIN32 # undef UNIX *************** *** 116,121 **** --- 121,127 ---- # define STRNCMPI # define USE_STDARG # define NEED_VARARGS + #endif *** nethack-3.3.1/include/coord.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/coord.h Thu Mar 21 07:37:36 2002 *************** *** 1,11 **** ! /* SCCS Id: @(#)coord.h 3.3 90/02/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef COORD_H #define COORD_H ! typedef struct { xchar x,y; } coord; --- 1,11 ---- ! /* SCCS Id: @(#)coord.h 3.4 1990/02/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef COORD_H #define COORD_H ! typedef struct nhcoord { xchar x,y; } coord; *** nethack-3.3.1/include/decl.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/decl.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)decl.h 3.3 2000/06/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)decl.h 3.4 2001/12/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 27,33 **** --- 27,35 ---- E NEARDATA int bases[MAXOCLASSES]; E NEARDATA int multi; + #if 0 E NEARDATA int warnlevel; + #endif E NEARDATA int nroom; E NEARDATA int nsubroom; E NEARDATA int occtime; *************** *** 142,148 **** E NEARDATA struct sinfo { int gameover; /* self explanatory? */ int stopprint; /* inhibit further end of game disclosure */ ! #if defined(UNIX) || defined(VMS) || defined (__EMX__) int done_hup; /* SIGHUP or moral equivalent received * -- no more screen output */ #endif --- 144,150 ---- E NEARDATA struct sinfo { int gameover; /* self explanatory? */ int stopprint; /* inhibit further end of game disclosure */ ! #if defined(UNIX) || defined(VMS) || defined (__EMX__) || defined(WIN32) int done_hup; /* SIGHUP or moral equivalent received * -- no more screen output */ #endif *************** *** 162,167 **** --- 164,172 ---- E const char ynaqchars[]; E const char ynNaqchars[]; E NEARDATA long yn_number; + + E const char disclosure_options[]; + E NEARDATA int smeq[]; E NEARDATA int doorindex; E NEARDATA char *save_cm; *************** *** 171,176 **** --- 176,184 ---- E NEARDATA int killer_format; E const char *killer; E const char *delayed_killer; + #ifdef GOLDOBJ + E long done_money; + #endif E char killer_buf[BUFSZ]; E const char *configfile; E NEARDATA char plname[PL_NSIZ]; *************** *** 188,198 **** E NEARDATA schar tbx, tby; /* set in mthrowu.c */ E NEARDATA struct dig_info { /* apply.c, hack.c */ int effort; d_level level; coord pos; ! boolean down, chew; } digging; E NEARDATA long moves, monstermoves; --- 196,209 ---- E NEARDATA schar tbx, tby; /* set in mthrowu.c */ + E NEARDATA struct multishot { int n, i; short o; boolean s; } m_shot; + E NEARDATA struct dig_info { /* apply.c, hack.c */ int effort; d_level level; coord pos; ! long lastdigtime; ! boolean down, chew, warned, quiet; } digging; E NEARDATA long moves, monstermoves; *************** *** 236,245 **** E NEARDATA struct obj *billobjs; E NEARDATA struct obj zeroobj; /* init'd and defined in decl.c */ - E const char *he[3]; - E const char *him[3]; - E const char *his[3]; - #include "you.h" E NEARDATA struct you u; --- 247,252 ---- *************** *** 274,285 **** #define purple c_color_names.c_purple #define White c_color_names.c_white E struct c_common_strings { const char *const c_nothing_happens, *const c_thats_enough_tries, *const c_silly_thing_to, *const c_shudder_for_moment, *const c_something, *const c_Something, *const c_You_can_move_again, ! *const c_Never_mind; } c_common_strings; #define nothing_happens c_common_strings.c_nothing_happens #define thats_enough_tries c_common_strings.c_thats_enough_tries --- 281,295 ---- #define purple c_color_names.c_purple #define White c_color_names.c_white + /* The names of the colors used for gems, etc. */ + E const char *c_obj_colors[]; + E struct c_common_strings { const char *const c_nothing_happens, *const c_thats_enough_tries, *const c_silly_thing_to, *const c_shudder_for_moment, *const c_something, *const c_Something, *const c_You_can_move_again, ! *const c_Never_mind, *c_vision_clears; } c_common_strings; #define nothing_happens c_common_strings.c_nothing_happens #define thats_enough_tries c_common_strings.c_thats_enough_tries *************** *** 289,294 **** --- 299,305 ---- #define Something c_common_strings.c_Something #define You_can_move_again c_common_strings.c_You_can_move_again #define Never_mind c_common_strings.c_Never_mind + #define vision_clears c_common_strings.c_vision_clears /* material strings */ E const char *materialnm[]; *** nethack-3.3.1/include/def_os2.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/def_os2.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)def_os2.h 3.3 93/01/19 */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)def_os2.h 3.4 1993/01/19 */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/dgn_file.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/dgn_file.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dgn_file.h 3.3 93/01/17 */ /* Copyright (c) 1989 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dgn_file.h 3.4 1993/01/17 */ /* Copyright (c) 1989 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/display.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/display.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)display.h 3.3 1999/11/30 */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)display.h 3.4 1999/11/30 */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 245,250 **** --- 245,255 ---- * is the dungeon features and other miscellaneous things. * Count: MAXPCHARS * + * explosions A set of nine for each of the following seven explosion types: + * dark, noxious, muddy, wet, magical, fiery, frosty. + * The nine positions represent those surrounding the hero. + * Count: MAXEXPCHARS * EXPL_MAX (EXPL_MAX is defined in hack.h) + * * zap beam A set of four (there are four directions) for each beam type. * The beam type is shifted over 2 positions and the direction * is stored in the lower 2 bits. Count: NUM_ZAP << 2 *************** *** 268,274 **** #define GLYPH_RIDDEN_OFF (NUMMONS + GLYPH_BODY_OFF) #define GLYPH_OBJ_OFF (NUMMONS + GLYPH_RIDDEN_OFF) #define GLYPH_CMAP_OFF (NUM_OBJECTS + GLYPH_OBJ_OFF) ! #define GLYPH_ZAP_OFF (MAXPCHARS + GLYPH_CMAP_OFF) #define GLYPH_SWALLOW_OFF ((NUM_ZAP << 2) + GLYPH_ZAP_OFF) #define GLYPH_WARNING_OFF ((NUMMONS << 3) + GLYPH_SWALLOW_OFF) #define MAX_GLYPH (WARNCOUNT + GLYPH_WARNING_OFF) --- 273,280 ---- #define GLYPH_RIDDEN_OFF (NUMMONS + GLYPH_BODY_OFF) #define GLYPH_OBJ_OFF (NUMMONS + GLYPH_RIDDEN_OFF) #define GLYPH_CMAP_OFF (NUM_OBJECTS + GLYPH_OBJ_OFF) ! #define GLYPH_EXPLODE_OFF ((MAXPCHARS - MAXEXPCHARS) + GLYPH_CMAP_OFF) ! #define GLYPH_ZAP_OFF ((MAXEXPCHARS * EXPL_MAX) + GLYPH_EXPLODE_OFF) #define GLYPH_SWALLOW_OFF ((NUM_ZAP << 2) + GLYPH_ZAP_OFF) #define GLYPH_WARNING_OFF ((NUMMONS << 3) + GLYPH_SWALLOW_OFF) #define MAX_GLYPH (WARNCOUNT + GLYPH_WARNING_OFF) *************** *** 295,300 **** --- 301,309 ---- (int) (obj)->otyp + GLYPH_OBJ_OFF)) #define cmap_to_glyph(cmap_idx) ((int) (cmap_idx) + GLYPH_CMAP_OFF) + #define explosion_to_glyph(expltype,idx) \ + ((((expltype) * MAXEXPCHARS) + ((idx) - S_explode1)) + GLYPH_EXPLODE_OFF) + #define trap_to_glyph(trap) \ cmap_to_glyph(trap_to_defsym(what_trap((trap)->ttyp))) *** nethack-3.3.1/include/dlb.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/dlb.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dlb.h 3.3 97/07/29 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dlb.h 3.4 1997/07/29 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/dungeon.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/dungeon.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dungeon.h 3.3 99/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dungeon.h 3.4 1999/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/edog.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/edog.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)edog.h 3.3 97/10/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)edog.h 3.4 1997/10/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/emin.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/emin.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)emin.h 3.3 97/05/01 */ /* Copyright (c) David Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)emin.h 3.4 1997/05/01 */ /* Copyright (c) David Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/engrave.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/engrave.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)engrave.h 3.3 91/07/31 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)engrave.h 3.4 1991/07/31 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/epri.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/epri.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)epri.h 3.3 97/05/01 */ /* Copyright (c) Izchak Miller, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)epri.h 3.4 1997/05/01 */ /* Copyright (c) Izchak Miller, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/eshk.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/eshk.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)eshk.h 3.3 97/05/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)eshk.h 3.4 1997/05/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/extern.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/extern.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)extern.h 3.3 2000/07/14 */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)extern.h 3.4 2002/03/09 */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 34,40 **** E int FDECL(jump, (int)); E int NDECL(number_leashed); E void FDECL(o_unleash, (struct obj *)); ! E void FDECL(m_unleash, (struct monst *)); E void NDECL(unleash_all); E boolean NDECL(next_to_u); E struct obj *FDECL(get_mleash, (struct monst *)); --- 34,40 ---- E int FDECL(jump, (int)); E int NDECL(number_leashed); E void FDECL(o_unleash, (struct obj *)); ! E void FDECL(m_unleash, (struct monst *,BOOLEAN_P)); E void NDECL(unleash_all); E boolean NDECL(next_to_u); E struct obj *FDECL(get_mleash, (struct monst *)); *************** *** 43,52 **** --- 43,54 ---- E boolean FDECL(um_dist, (XCHAR_P,XCHAR_P,XCHAR_P)); E boolean FDECL(snuff_candle, (struct obj *)); E boolean FDECL(snuff_lit, (struct obj *)); + E boolean FDECL(catch_lit, (struct obj *)); E void FDECL(use_unicorn_horn, (struct obj *)); E boolean FDECL(tinnable, (struct obj *)); E void NDECL(reset_trapset); E void FDECL(fig_transform, (genericptr_t, long)); + E int FDECL(unfixable_trouble_count,(BOOLEAN_P)); /* ### artifact.c ### */ *************** *** 74,80 **** --- 76,85 ---- struct obj *,int *,int)); E int NDECL(doinvoke); E void FDECL(arti_speak, (struct obj *)); + E boolean FDECL(artifact_light, (struct obj *)); E long FDECL(spec_m2, (struct obj *)); + E boolean FDECL(artifact_has_invprop, (struct obj *,UCHAR_P)); + E long FDECL(arti_cost, (struct obj *)); /* ### attrib.c ### */ *************** *** 166,172 **** E int FDECL(getdir, (const char *)); E void NDECL(confdir); E int FDECL(isok, (int,int)); ! E int FDECL(click_to_cmd, (int,int,int)); E char NDECL(readchar); #ifdef WIZARD E void NDECL(sanity_check); --- 171,177 ---- E int FDECL(getdir, (const char *)); E void NDECL(confdir); E int FDECL(isok, (int,int)); ! E const char *FDECL(click_to_cmd, (int,int,int)); E char NDECL(readchar); #ifdef WIZARD E void NDECL(sanity_check); *************** *** 192,197 **** --- 197,203 ---- /* ### detect.c ### */ E struct obj *FDECL(o_in, (struct obj*,CHAR_P)); + E struct obj *FDECL(o_material, (struct obj*,unsigned)); E int FDECL(gold_detect, (struct obj *)); E int FDECL(food_detect, (struct obj *)); E int FDECL(object_detect, (struct obj *,int)); *************** *** 215,220 **** --- 221,227 ---- /* ### dig.c ### */ + E boolean NDECL(is_digging); #ifdef USE_TRAMPOLI E int NDECL(dig); #endif *************** *** 223,229 **** --- 230,238 ---- E void FDECL(digactualhole, (int,int,struct monst *,int)); E boolean FDECL(dighole, (BOOLEAN_P)); E int FDECL(use_pick_axe, (struct obj *)); + E int FDECL(use_pick_axe2, (struct obj *)); E boolean FDECL(mdig_tunnel, (struct monst *)); + E void FDECL(watch_dig, (struct monst *,XCHAR_P,XCHAR_P,BOOLEAN_P)); E void NDECL(zap_dig); E struct obj *FDECL(bury_an_obj, (struct obj *)); E void FDECL(bury_objs, (int,int)); *************** *** 287,292 **** --- 296,302 ---- E boolean FDECL(canletgo, (struct obj *,const char *)); E void FDECL(dropx, (struct obj *)); E void FDECL(dropy, (struct obj *)); + E void FDECL(obj_no_longer_held, (struct obj *)); E int NDECL(doddrop); E int NDECL(dodown); E int NDECL(doup); *************** *** 324,338 **** E char *FDECL(Adjmonnam, (struct monst *,const char *)); E char *FDECL(Amonnam, (struct monst *)); E char *FDECL(a_monnam, (struct monst *)); E const char *NDECL(rndmonnam); E const char *FDECL(hcolor, (const char *)); - E char *FDECL(self_pronoun, (const char *,const char *)); #ifdef REINCARNATION E const char *NDECL(roguename); #endif E struct obj *FDECL(realloc_obj, (struct obj *, int, genericptr_t, int, const char *)); ! E char *FDECL(coyotename, (char *)); /* ### do_wear.c ### */ --- 334,348 ---- E char *FDECL(Adjmonnam, (struct monst *,const char *)); E char *FDECL(Amonnam, (struct monst *)); E char *FDECL(a_monnam, (struct monst *)); + E char *FDECL(distant_monnam, (struct monst *,int,char *)); E const char *NDECL(rndmonnam); E const char *FDECL(hcolor, (const char *)); #ifdef REINCARNATION E const char *NDECL(roguename); #endif E struct obj *FDECL(realloc_obj, (struct obj *, int, genericptr_t, int, const char *)); ! E char *FDECL(coyotename, (struct monst *,char *)); /* ### do_wear.c ### */ *************** *** 417,423 **** E int NDECL(dofire); E void FDECL(hitfloor, (struct obj *)); E void FDECL(hurtle, (int,int,int,BOOLEAN_P)); ! E void FDECL(throwit, (struct obj *,long)); E int FDECL(omon_adj, (struct monst *,struct obj *,BOOLEAN_P)); E int FDECL(thitmonst, (struct monst *,struct obj *)); E int FDECL(hero_breaks, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P)); --- 427,434 ---- E int NDECL(dofire); E void FDECL(hitfloor, (struct obj *)); E void FDECL(hurtle, (int,int,int,BOOLEAN_P)); ! E void FDECL(mhurtle, (struct monst *,int,int,int)); ! E void FDECL(throwit, (struct obj *,long,BOOLEAN_P)); E int FDECL(omon_adj, (struct monst *,struct obj *,BOOLEAN_P)); E int FDECL(thitmonst, (struct monst *,struct obj *)); E int FDECL(hero_breaks, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P)); *************** *** 516,521 **** --- 527,534 ---- E void FDECL(food_disappears, (struct obj *)); E void FDECL(food_substitution, (struct obj *,struct obj *)); E void NDECL(fix_petrification); + E void FDECL(consume_oeaten, (struct obj *,int)); + E boolean FDECL(maybe_finished_meal, (BOOLEAN_P)); /* ### end.c ### */ *************** *** 568,574 **** /* ### explode.c ### */ ! E void FDECL(explode, (int,int,int,int,CHAR_P)); E void FDECL(scatter, (int, int, int, unsigned int, struct obj *)); E void FDECL(splatter_burning_oil, (int, int)); --- 581,587 ---- /* ### explode.c ### */ ! E void FDECL(explode, (int,int,int,int,CHAR_P,int)); E void FDECL(scatter, (int, int, int, unsigned int, struct obj *)); E void FDECL(splatter_burning_oil, (int, int)); *************** *** 617,624 **** --- 630,643 ---- E void FDECL(uncompress, (const char *)); E boolean FDECL(lock_file, (const char *,int,int)); E void FDECL(unlock_file, (const char *)); + #ifdef USER_SOUNDS + E boolean FDECL(can_read_file, (const char *)); + #endif E void FDECL(read_config_file, (const char *)); E void FDECL(check_recordfile, (const char *)); + #if defined(WIZARD) + E void NDECL(read_wizkit); + #endif /* ### fountain.c ### */ *************** *** 643,648 **** --- 662,668 ---- E boolean FDECL(may_passwall, (XCHAR_P,XCHAR_P)); E boolean FDECL(bad_rock, (struct permonst *,XCHAR_P,XCHAR_P)); E boolean FDECL(invocation_pos, (XCHAR_P,XCHAR_P)); + E boolean FDECL(test_move, (int, int, int, int, BOOLEAN_P)); E void NDECL(domove); E void NDECL(invocation_message); E void FDECL(spoteffects, (BOOLEAN_P)); *************** *** 661,666 **** --- 681,689 ---- E int NDECL(max_capacity); E boolean FDECL(check_capacity, (const char *)); E int NDECL(inv_cnt); + #ifdef GOLDOBJ + E long FDECL(money_cnt, (struct obj *)); + #endif /* ### hacklib.c ### */ *************** *** 669,674 **** --- 692,698 ---- E char FDECL(highc, (CHAR_P)); E char FDECL(lowc, (CHAR_P)); E char *FDECL(lcase, (char *)); + E char *FDECL(upstart, (char *)); E char *FDECL(mungspaces, (char *)); E char *FDECL(eos, (char *)); E char *FDECL(s_suffix, (const char *)); *************** *** 731,749 **** E struct obj *FDECL(g_at, (int,int)); E struct obj *FDECL(mkgoldobj, (long)); E struct obj *FDECL(getobj, (const char *,const char *)); ! E int FDECL(ggetobj, (const char *,int (*)(OBJ_P),int,BOOLEAN_P)); E void FDECL(fully_identify_obj, (struct obj *)); E int FDECL(identify, (struct obj *)); E void FDECL(identify_pack, (int)); E int FDECL(askchain, (struct obj **,const char *,int,int (*)(OBJ_P), int (*)(OBJ_P),int,const char *)); E void FDECL(prinv, (const char *,struct obj *,long)); ! E char *FDECL(xprname, (struct obj *,const char *,CHAR_P,BOOLEAN_P,long)); E int NDECL(ddoinv); E char FDECL(display_inventory, (const char *,BOOLEAN_P)); E int FDECL(display_binventory, (int,int,BOOLEAN_P)); E struct obj *FDECL(display_cinventory,(struct obj *)); ! E struct obj *FDECL(display_minventory,(struct monst *,int)); E int NDECL(dotypeinv); E const char *FDECL(dfeature_at, (int,int,char *)); E int FDECL(look_here, (int,BOOLEAN_P)); --- 755,773 ---- E struct obj *FDECL(g_at, (int,int)); E struct obj *FDECL(mkgoldobj, (long)); E struct obj *FDECL(getobj, (const char *,const char *)); ! E int FDECL(ggetobj, (const char *,int (*)(OBJ_P),int,BOOLEAN_P,unsigned *)); E void FDECL(fully_identify_obj, (struct obj *)); E int FDECL(identify, (struct obj *)); E void FDECL(identify_pack, (int)); E int FDECL(askchain, (struct obj **,const char *,int,int (*)(OBJ_P), int (*)(OBJ_P),int,const char *)); E void FDECL(prinv, (const char *,struct obj *,long)); ! E char *FDECL(xprname, (struct obj *,const char *,CHAR_P,BOOLEAN_P,long,long)); E int NDECL(ddoinv); E char FDECL(display_inventory, (const char *,BOOLEAN_P)); E int FDECL(display_binventory, (int,int,BOOLEAN_P)); E struct obj *FDECL(display_cinventory,(struct obj *)); ! E struct obj *FDECL(display_minventory,(struct monst *,int,char *)); E int NDECL(dotypeinv); E const char *FDECL(dfeature_at, (int,int,char *)); E int FDECL(look_here, (int,BOOLEAN_P)); *************** *** 763,769 **** --- 787,795 ---- E void NDECL(reassign); E int NDECL(doorganize); E int FDECL(count_unpaid, (struct obj *)); + E int FDECL(count_buc, (struct obj *,int)); E void FDECL(carry_obj_effects, (struct obj *)); + E const char *FDECL(currency, (long)); /* ### ioctl.c ### */ *************** *** 878,887 **** E boolean FDECL(peace_minded, (struct permonst *)); E void FDECL(set_malign, (struct monst *)); E void FDECL(set_mimic_sym, (struct monst *)); /* ### mcastu.c ### */ ! E int FDECL(castmu, (struct monst *,struct attack *)); E int FDECL(buzzmu, (struct monst *,struct attack *)); /* ### mhitm.c ### */ --- 904,921 ---- E boolean FDECL(peace_minded, (struct permonst *)); E void FDECL(set_malign, (struct monst *)); E void FDECL(set_mimic_sym, (struct monst *)); + E int FDECL(mbirth_limit, (int)); + #ifdef GOLDOBJ + E void FDECL(mkmonmoney, (struct monst *, long)); + #endif + + /* ### mapglyph.c ### */ + + E void FDECL(mapglyph, (int, int *, int *, unsigned *, int, int)); /* ### mcastu.c ### */ ! E int FDECL(castmu, (struct monst *,struct attack *,BOOLEAN_P,BOOLEAN_P)); E int FDECL(buzzmu, (struct monst *,struct attack *)); /* ### mhitm.c ### */ *************** *** 898,903 **** --- 932,938 ---- E void NDECL(u_slow_down); E struct monst *NDECL(cloneu); E void FDECL(expels, (struct monst *,struct permonst *,BOOLEAN_P)); + E struct attack *FDECL(getmattk, (struct permonst *,int,int *,struct attack *)); E int FDECL(mattacku, (struct monst *)); E int FDECL(gazemu, (struct monst *,struct attack *)); E void FDECL(mdamageu, (struct monst *,int)); *************** *** 967,973 **** /* ### mkobj.c ### */ E struct obj *FDECL(mkobj_at, (CHAR_P,int,int,BOOLEAN_P)); ! E struct obj *FDECL(mksobj_at, (int,int,int,BOOLEAN_P)); E struct obj *FDECL(mkobj, (CHAR_P,BOOLEAN_P)); E int NDECL(rndmonnum); E struct obj *FDECL(splitobj, (struct obj *,long)); --- 1002,1008 ---- /* ### mkobj.c ### */ E struct obj *FDECL(mkobj_at, (CHAR_P,int,int,BOOLEAN_P)); ! E struct obj *FDECL(mksobj_at, (int,int,int,BOOLEAN_P,BOOLEAN_P)); E struct obj *FDECL(mkobj, (CHAR_P,BOOLEAN_P)); E int NDECL(rndmonnum); E struct obj *FDECL(splitobj, (struct obj *,long)); *************** *** 992,997 **** --- 1027,1033 ---- E void FDECL(uncurse, (struct obj *)); E void FDECL(blessorcurse, (struct obj *,int)); E boolean FDECL(is_flammable, (struct obj *)); + E boolean FDECL(is_rottable, (struct obj *)); E void FDECL(place_object, (struct obj *,int,int)); E void FDECL(remove_object, (struct obj *)); E void FDECL(discard_minvent, (struct monst *)); *************** *** 999,1005 **** E void FDECL(extract_nobj, (struct obj *, struct obj **)); E void FDECL(extract_nexthere, (struct obj *, struct obj **)); E int FDECL(add_to_minv, (struct monst *, struct obj *)); ! E void FDECL(add_to_container, (struct obj *, struct obj *)); E void FDECL(add_to_migration, (struct obj *)); E void FDECL(add_to_buried, (struct obj *)); E void FDECL(dealloc_obj, (struct obj *)); --- 1035,1041 ---- E void FDECL(extract_nobj, (struct obj *, struct obj **)); E void FDECL(extract_nexthere, (struct obj *, struct obj **)); E int FDECL(add_to_minv, (struct monst *, struct obj *)); ! E struct obj *FDECL(add_to_container, (struct obj *, struct obj *)); E void FDECL(add_to_migration, (struct obj *)); E void FDECL(add_to_buried, (struct obj *)); E void FDECL(dealloc_obj, (struct obj *)); *************** *** 1030,1038 **** E int FDECL(undead_to_corpse, (int)); E int FDECL(pm_to_cham, (int)); ! E int FDECL(minwater, (struct monst *)); E int NDECL(movemon); ! E int FDECL(meatgold, (struct monst *)); E int FDECL(meatobj, (struct monst *)); E void FDECL(mpickgold, (struct monst *)); E boolean FDECL(mpickstuff, (struct monst *,const char *)); --- 1066,1074 ---- E int FDECL(undead_to_corpse, (int)); E int FDECL(pm_to_cham, (int)); ! E int FDECL(minliquid, (struct monst *)); E int NDECL(movemon); ! E int FDECL(meatmetal, (struct monst *)); E int FDECL(meatobj, (struct monst *)); E void FDECL(mpickgold, (struct monst *)); E boolean FDECL(mpickstuff, (struct monst *,const char *)); *************** *** 1047,1052 **** --- 1083,1089 ---- E void FDECL(replmon, (struct monst *,struct monst *)); E void FDECL(relmon, (struct monst *)); E struct obj *FDECL(mlifesaver, (struct monst *)); + E boolean FDECL(corpse_chance,(struct monst *,struct monst *,BOOLEAN_P)); E void FDECL(mondead, (struct monst *)); E void FDECL(mondied, (struct monst *)); E void FDECL(mongone, (struct monst *)); *************** *** 1070,1076 **** E void NDECL(restartcham); E void FDECL(restore_cham, (struct monst *)); E void FDECL(mon_animal_list, (BOOLEAN_P)); ! E int FDECL(newcham, (struct monst *,struct permonst *)); E int FDECL(can_be_hatched, (int)); E int FDECL(egg_type_from_parent, (int,BOOLEAN_P)); E boolean FDECL(dead_species, (int,BOOLEAN_P)); --- 1107,1113 ---- E void NDECL(restartcham); E void FDECL(restore_cham, (struct monst *)); E void FDECL(mon_animal_list, (BOOLEAN_P)); ! E int FDECL(newcham, (struct monst *,struct permonst *,BOOLEAN_P)); E int FDECL(can_be_hatched, (int)); E int FDECL(egg_type_from_parent, (int,BOOLEAN_P)); E boolean FDECL(dead_species, (int,BOOLEAN_P)); *************** *** 1082,1087 **** --- 1119,1125 ---- /* ### mondata.c ### */ E void FDECL(set_mon_data, (struct monst *,struct permonst *,int)); + E struct attack *FDECL(attacktype_fordmg, (struct permonst *,int,int)); E boolean FDECL(attacktype, (struct permonst *,int)); E boolean FDECL(poly_when_stoned, (struct permonst *)); E boolean FDECL(resists_drli, (struct monst *)); *************** *** 1095,1100 **** --- 1133,1139 ---- E boolean FDECL(sliparm, (struct permonst *)); E boolean FDECL(sticks, (struct permonst *)); /* E boolean FDECL(canseemon, (struct monst *)); */ + E struct attack *FDECL(dmgtype_fromattack, (struct permonst *,int,int)); E boolean FDECL(dmgtype, (struct permonst *,int)); E int FDECL(max_passive_dmg, (struct monst *,struct monst *)); E int FDECL(monsndx, (struct permonst *)); *************** *** 1105,1110 **** --- 1144,1150 ---- E int FDECL(little_to_big, (int)); E int FDECL(big_to_little, (int)); E const char *FDECL(locomotion, (const struct permonst *,const char *)); + E const char *FDECL(stagger, (const struct permonst *,const char *)); /* ### monmove.c ### */ *************** *** 1113,1118 **** --- 1153,1159 ---- E void FDECL(mon_regen, (struct monst *,BOOLEAN_P)); E int FDECL(dochugw, (struct monst *)); E boolean FDECL(onscary, (int,int,struct monst *)); + E void FDECL(monflee, (struct monst *, int, BOOLEAN_P, BOOLEAN_P)); E int FDECL(dochug, (struct monst *)); E int FDECL(m_move, (struct monst *,int)); E boolean FDECL(closed_door, (int,int)); *************** *** 1270,1291 **** E boolean FDECL(obj_is_pname, (struct obj *)); E char *FDECL(distant_name, (struct obj *,char *(*)(OBJ_P))); E char *FDECL(xname, (struct obj *)); E char *FDECL(doname, (struct obj *)); E boolean FDECL(not_fully_identified, (struct obj *)); ! E const char *FDECL(corpse_xname, (struct obj *,BOOLEAN_P)); E const char *FDECL(singular, (struct obj *,char *(*)(OBJ_P))); E char *FDECL(an, (const char *)); E char *FDECL(An, (const char *)); E char *FDECL(The, (const char *)); E char *FDECL(the, (const char *)); E char *FDECL(aobjnam, (struct obj *,const char *)); E char *FDECL(Doname2, (struct obj *)); E char *FDECL(yname, (struct obj *)); E char *FDECL(Yname2, (struct obj *)); E char *FDECL(makeplural, (const char *)); E char *FDECL(makesingular, (const char *)); ! E struct obj *FDECL(readobjnam, (char *)); E int FDECL(rnd_class, (int,int)); /* ### options.c ### */ --- 1311,1339 ---- E boolean FDECL(obj_is_pname, (struct obj *)); E char *FDECL(distant_name, (struct obj *,char *(*)(OBJ_P))); E char *FDECL(xname, (struct obj *)); + E char *FDECL(mshot_xname, (struct obj *)); + E boolean FDECL(the_unique_obj, (struct obj *obj)); E char *FDECL(doname, (struct obj *)); E boolean FDECL(not_fully_identified, (struct obj *)); ! E char *FDECL(corpse_xname, (struct obj *,BOOLEAN_P)); ! E char *FDECL(cxname, (struct obj *)); E const char *FDECL(singular, (struct obj *,char *(*)(OBJ_P))); E char *FDECL(an, (const char *)); E char *FDECL(An, (const char *)); E char *FDECL(The, (const char *)); E char *FDECL(the, (const char *)); E char *FDECL(aobjnam, (struct obj *,const char *)); + E char *FDECL(Tobjnam, (struct obj *,const char *)); + E char *FDECL(otense, (struct obj *,const char *)); + E char *FDECL(vtense, (const char *,const char *)); E char *FDECL(Doname2, (struct obj *)); E char *FDECL(yname, (struct obj *)); E char *FDECL(Yname2, (struct obj *)); E char *FDECL(makeplural, (const char *)); E char *FDECL(makesingular, (const char *)); ! E struct obj *FDECL(readobjnam, (char *,struct obj *,BOOLEAN_P)); E int FDECL(rnd_class, (int,int)); + E const char *FDECL(cloak_simple_name, (struct obj *)); /* ### options.c ### */ *************** *** 1302,1307 **** --- 1350,1358 ---- E char FDECL(map_menu_cmd, (CHAR_P)); E void FDECL(assign_warnings, (uchar *)); E char *FDECL(nh_getenv, (const char *)); + E void FDECL(set_duplicate_opt_detection, (int)); + E void FDECL(set_wc_option_mod_status, (unsigned long, int)); + E void FDECL(set_option_mod_status, (char *, int)); /* ### pager.c ### */ *************** *** 1355,1361 **** /* ### pcunix.c ### */ #if defined(MICRO) - E void FDECL(gethdate, (char *)); E void FDECL(regularize, (char *)); #endif /* MICRO */ #if defined(PC_LOCKING) --- 1406,1411 ---- *************** *** 1364,1371 **** --- 1414,1426 ---- /* ### pickup.c ### */ + #ifdef GOLDOBJ + E int FDECL(collect_obj_classes, + (char *,struct obj *,BOOLEAN_P,boolean FDECL((*),(OBJ_P)))); + #else E int FDECL(collect_obj_classes, (char *,struct obj *,BOOLEAN_P,BOOLEAN_P,boolean FDECL((*),(OBJ_P)))); + #endif E void FDECL(add_valid_menu_class, (int)); E boolean FDECL(allow_all, (struct obj *)); E boolean FDECL(allow_category, (struct obj *)); *************** *** 1385,1390 **** --- 1440,1446 ---- E int NDECL(encumber_msg); E int NDECL(doloot); E int FDECL(use_container, (struct obj *,int)); + E int FDECL(loot_mon, (struct monst *,int *,boolean *)); /* ### pline.c ### */ *************** *** 1410,1416 **** E void NDECL(set_uasmon); E void NDECL(change_sex); ! E void NDECL(polyself); E int FDECL(polymon, (int)); E void NDECL(rehumanize); E int NDECL(dobreathe); --- 1466,1472 ---- E void NDECL(set_uasmon); E void NDECL(change_sex); ! E void FDECL(polyself, (BOOLEAN_P)); E int FDECL(polymon, (int)); E void NDECL(rehumanize); E int NDECL(dobreathe); *************** *** 1418,1426 **** E int NDECL(doremove); E int NDECL(dospinweb); E int NDECL(dosummon); ! E int NDECL(doconfuse); E int NDECL(dohide); E int NDECL(domindblast); E const char *FDECL(mbodypart, (struct monst *,int)); E const char *FDECL(body_part, (int)); E int NDECL(poly_gender); --- 1474,1483 ---- E int NDECL(doremove); E int NDECL(dospinweb); E int NDECL(dosummon); ! E int NDECL(dogaze); E int NDECL(dohide); E int NDECL(domindblast); + E void FDECL(skinback, (BOOLEAN_P)); E const char *FDECL(mbodypart, (struct monst *,int)); E const char *FDECL(body_part, (int)); E int NDECL(poly_gender); *************** *** 1447,1452 **** --- 1504,1510 ---- E int NDECL(dodip); E void FDECL(djinni_from_bottle, (struct obj *)); E struct monst *FDECL(split_mon, (struct monst *,struct monst *)); + E const char *NDECL(bottlename); /* ### pray.c ### */ *************** *** 1507,1513 **** E short FDECL(quest_info, (int)); E const char *NDECL(ldrname); E boolean FDECL(is_quest_artifact, (struct obj*)); - E boolean NDECL(leaderless); E void FDECL(com_pager, (int)); E void FDECL(qt_pager, (int)); E struct permonst *NDECL(qt_montype); --- 1565,1570 ---- *************** *** 1607,1623 **** E int FDECL(str2gend, (char *)); E int FDECL(str2align, (char *)); E boolean FDECL(ok_role, (int, int, int, int)); ! E int FDECL(pick_role, (int, int, int)); E boolean FDECL(ok_race, (int, int, int, int)); ! E int FDECL(pick_race, (int, int, int)); E boolean FDECL(ok_gend, (int, int, int, int)); ! E int FDECL(pick_gend, (int, int, int)); E boolean FDECL(ok_align, (int, int, int, int)); ! E int FDECL(pick_align, (int, int, int)); E void NDECL(role_init); E void NDECL(plnamesuffix); E const char *FDECL(Hello, (struct monst *)); E const char *NDECL(Goodbye); /* ### rumors.c ### */ --- 1664,1683 ---- E int FDECL(str2gend, (char *)); E int FDECL(str2align, (char *)); E boolean FDECL(ok_role, (int, int, int, int)); ! E int FDECL(pick_role, (int, int, int, int)); E boolean FDECL(ok_race, (int, int, int, int)); ! E int FDECL(pick_race, (int, int, int, int)); E boolean FDECL(ok_gend, (int, int, int, int)); ! E int FDECL(pick_gend, (int, int, int, int)); E boolean FDECL(ok_align, (int, int, int, int)); ! E int FDECL(pick_align, (int, int, int, int)); E void NDECL(role_init); + E void NDECL(rigid_role_checks); E void NDECL(plnamesuffix); E const char *FDECL(Hello, (struct monst *)); E const char *NDECL(Goodbye); + E char *FDECL(build_plselection_prompt, (char *, int, int, int, int, int)); + E char *FDECL(root_plselection_prompt, (char *, int, int, int, int, int)); /* ### rumors.c ### */ *************** *** 1631,1637 **** /* ### save.c ### */ E int NDECL(dosave); ! #if defined(UNIX) || defined(VMS) || defined(__EMX__) E void FDECL(hangup, (int)); #endif E int NDECL(dosave0); --- 1691,1697 ---- /* ### save.c ### */ E int NDECL(dosave); ! #if defined(UNIX) || defined(VMS) || defined(__EMX__) || defined(WIN32) E void FDECL(hangup, (int)); #endif E int NDECL(dosave0); *************** *** 1656,1661 **** --- 1716,1725 ---- /* ### shk.c ### */ + #ifdef GOLDOBJ + E long FDECL(money2mon, (struct monst *, long)); + E void FDECL(money2u, (struct monst *, long)); + #endif E char *FDECL(shkname, (struct monst *)); E void FDECL(shkgone, (struct monst *)); E void FDECL(set_residency, (struct monst *,BOOLEAN_P)); *************** *** 1663,1668 **** --- 1727,1733 ---- E void FDECL(restshk, (struct monst *,BOOLEAN_P)); E char FDECL(inside_shop, (XCHAR_P,XCHAR_P)); E void FDECL(u_left_shop, (char *,BOOLEAN_P)); + E void FDECL(remote_burglary, (XCHAR_P,XCHAR_P)); E void FDECL(u_entered_shop, (char *)); E boolean FDECL(same_price, (struct obj *,struct obj *)); E void NDECL(shopper_financial_report); *************** *** 1679,1685 **** E boolean FDECL(paybill, (BOOLEAN_P)); E void NDECL(finish_paybill); E struct obj *FDECL(find_oid, (unsigned)); ! E long FDECL(contained_cost, (struct obj *,struct monst *,long,BOOLEAN_P)); E long FDECL(contained_gold, (struct obj *)); E void FDECL(picked_container, (struct obj *)); E long FDECL(unpaid_cost, (struct obj *)); --- 1744,1750 ---- E boolean FDECL(paybill, (BOOLEAN_P)); E void NDECL(finish_paybill); E struct obj *FDECL(find_oid, (unsigned)); ! E long FDECL(contained_cost, (struct obj *,struct monst *,long,BOOLEAN_P, BOOLEAN_P)); E long FDECL(contained_gold, (struct obj *)); E void FDECL(picked_container, (struct obj *)); E long FDECL(unpaid_cost, (struct obj *)); *************** *** 1687,1696 **** E void FDECL(splitbill, (struct obj *,struct obj *)); E void FDECL(subfrombill, (struct obj *,struct monst *)); E long FDECL(stolen_value, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P,BOOLEAN_P)); ! E void FDECL(sellobj_state, (BOOLEAN_P)); E void FDECL(sellobj, (struct obj *,XCHAR_P,XCHAR_P)); E int FDECL(doinvbill, (int)); ! E int FDECL(shkcatch, (struct obj *,XCHAR_P,XCHAR_P)); E void FDECL(add_damage, (XCHAR_P,XCHAR_P,long)); E int FDECL(repair_damage, (struct monst *,struct damage *,BOOLEAN_P)); E int FDECL(shk_move, (struct monst *)); --- 1752,1761 ---- E void FDECL(splitbill, (struct obj *,struct obj *)); E void FDECL(subfrombill, (struct obj *,struct monst *)); E long FDECL(stolen_value, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P,BOOLEAN_P)); ! E void FDECL(sellobj_state, (int)); E void FDECL(sellobj, (struct obj *,XCHAR_P,XCHAR_P)); E int FDECL(doinvbill, (int)); ! E struct monst *FDECL(shkcatch, (struct obj *,XCHAR_P,XCHAR_P)); E void FDECL(add_damage, (XCHAR_P,XCHAR_P,long)); E int FDECL(repair_damage, (struct monst *,struct damage *,BOOLEAN_P)); E int FDECL(shk_move, (struct monst *)); *************** *** 1731,1737 **** E void FDECL(whimper, (struct monst *)); E void FDECL(beg, (struct monst *)); E int NDECL(dotalk); ! /* ### sys/msdos/sound.c ### */ --- 1796,1804 ---- E void FDECL(whimper, (struct monst *)); E void FDECL(beg, (struct monst *)); E int NDECL(dotalk); ! #ifdef USER_SOUNDS ! E int FDECL(add_sound_mapping, (const char *)); ! #endif /* ### sys/msdos/sound.c ### */ *************** *** 1755,1760 **** --- 1822,1828 ---- E int NDECL(learn); #endif E int FDECL(study_book, (struct obj *)); + E void FDECL(book_disappears, (struct obj *)); E void FDECL(book_substitution, (struct obj *,struct obj *)); E void NDECL(age_spells); E int NDECL(docast); *************** *** 1769,1781 **** #ifdef USE_TRAMPOLI E int NDECL(stealarm); #endif E long NDECL(somegold); E void FDECL(stealgold, (struct monst *)); E void FDECL(remove_worn_item, (struct obj *)); ! E int FDECL(steal, (struct monst *)); E int FDECL(mpickobj, (struct monst *,struct obj *)); E void FDECL(stealamulet, (struct monst *)); E void FDECL(relobj, (struct monst *,int,BOOLEAN_P)); /* ### steed.c ### */ --- 1837,1856 ---- #ifdef USE_TRAMPOLI E int NDECL(stealarm); #endif + #ifdef GOLDOBJ + E long FDECL(somegold, (long)); + #else E long NDECL(somegold); + #endif E void FDECL(stealgold, (struct monst *)); E void FDECL(remove_worn_item, (struct obj *)); ! E int FDECL(steal, (struct monst *, char *)); E int FDECL(mpickobj, (struct monst *,struct obj *)); E void FDECL(stealamulet, (struct monst *)); E void FDECL(relobj, (struct monst *,int,BOOLEAN_P)); + #ifdef GOLDOBJ + E struct obj *FDECL(findgold, (struct obj *)); + #endif /* ### steed.c ### */ *************** *** 1863,1875 **** E boolean FDECL(burnarmor,(struct monst *)); E boolean FDECL(rust_dmg, (struct obj *,const char *,int,BOOLEAN_P,struct monst *)); ! E void FDECL(grease_protect, (struct obj *,const char *,BOOLEAN_P,struct monst *)); E struct trap *FDECL(maketrap, (int,int,int)); E void FDECL(fall_through, (BOOLEAN_P)); E struct monst *FDECL(animate_statue, (struct obj *,XCHAR_P,XCHAR_P,int,int *)); E struct monst *FDECL(activate_statue_trap, (struct trap *,XCHAR_P,XCHAR_P,BOOLEAN_P)); ! E void FDECL(dotrap, (struct trap *)); E void FDECL(seetrap, (struct trap *)); E int FDECL(mintrap, (struct monst *)); E void FDECL(instapetrify, (const char *)); --- 1938,1950 ---- E boolean FDECL(burnarmor,(struct monst *)); E boolean FDECL(rust_dmg, (struct obj *,const char *,int,BOOLEAN_P,struct monst *)); ! E void FDECL(grease_protect, (struct obj *,const char *,struct monst *)); E struct trap *FDECL(maketrap, (int,int,int)); E void FDECL(fall_through, (BOOLEAN_P)); E struct monst *FDECL(animate_statue, (struct obj *,XCHAR_P,XCHAR_P,int,int *)); E struct monst *FDECL(activate_statue_trap, (struct trap *,XCHAR_P,XCHAR_P,BOOLEAN_P)); ! E void FDECL(dotrap, (struct trap *, unsigned)); E void FDECL(seetrap, (struct trap *)); E int FDECL(mintrap, (struct monst *)); E void FDECL(instapetrify, (const char *)); *************** *** 1879,1884 **** --- 1954,1960 ---- E void NDECL(float_up); E void FDECL(fill_pit, (int,int)); E int FDECL(float_down, (long, long)); + E int FDECL(fire_damage, (struct obj *,BOOLEAN_P,BOOLEAN_P,XCHAR_P,XCHAR_P)); E void FDECL(water_damage, (struct obj *,BOOLEAN_P,BOOLEAN_P)); E boolean NDECL(drown); E void FDECL(drain_en, (int)); *************** *** 1891,1896 **** --- 1967,1973 ---- E void FDECL(b_trapped, (const char *,int)); E boolean NDECL(unconscious); E boolean NDECL(lava_effects); + E void FDECL(blow_up_landmine, (struct trap *)); E int FDECL(launch_obj,(SHORT_P,int,int,int,int,int)); /* ### u_init.c ### */ *************** *** 1907,1912 **** --- 1984,1990 ---- E int FDECL(damageum, (struct monst *,struct attack *)); E void FDECL(missum, (struct monst *,struct attack *)); E int FDECL(passive, (struct monst *,BOOLEAN_P,int,UCHAR_P)); + E void FDECL(passive_obj, (struct monst *,struct obj *,struct attack *)); E void FDECL(stumble_onto_mimic, (struct monst *)); E int FDECL(flash_hits_mon, (struct monst *,struct obj *)); *************** *** 1933,1939 **** /* ### unixunix.c ### */ #ifdef UNIX - E void FDECL(gethdate, (const char *)); E void NDECL(getlock); E void FDECL(regularize, (char *)); # ifdef SHELL --- 2011,2016 ---- *************** *** 1944,1949 **** --- 2021,2034 ---- # endif #endif /* UNIX */ + /* ### unixres.c ### */ + + #ifdef UNIX + # ifdef GNOME_GRAPHICS + E int FDECL(hide_privileges, (BOOLEAN_P)); + # endif + #endif /* UNIX */ + /* ### vault.c ### */ E boolean FDECL(grddead, (struct monst *)); *************** *** 2049,2055 **** /* ### vmsunix.c ### */ - E void FDECL(gethdate, (const char *)); E void NDECL(getlock); E void FDECL(regularize, (char *)); E int NDECL(vms_getuid); --- 2134,2139 ---- *************** *** 2116,2130 **** E void NDECL(uwepgone); E void NDECL(uswapwepgone); E void NDECL(uqwepgone); ! E void FDECL(erode_weapon, (struct obj *,BOOLEAN_P)); E int FDECL(chwepon, (struct obj *,int)); E int FDECL(welded, (struct obj *)); E void FDECL(weldmsg, (struct obj *)); /* ### windows.c ### */ E void FDECL(choose_windows, (const char *)); E char FDECL(genl_message_menu, (CHAR_P,int,const char *)); /* ### wizard.c ### */ --- 2200,2216 ---- E void NDECL(uwepgone); E void NDECL(uswapwepgone); E void NDECL(uqwepgone); ! E void FDECL(erode_obj, (struct obj *,BOOLEAN_P,BOOLEAN_P)); E int FDECL(chwepon, (struct obj *,int)); E int FDECL(welded, (struct obj *)); E void FDECL(weldmsg, (struct obj *)); + E void FDECL(setmnotwielded, (struct monst *,struct obj *)); /* ### windows.c ### */ E void FDECL(choose_windows, (const char *)); E char FDECL(genl_message_menu, (CHAR_P,int,const char *)); + E void FDECL(genl_preference_update, (const char *)); /* ### wizard.c ### */ *************** *** 2135,2141 **** E void NDECL(aggravate); E void NDECL(clonewiz); E int NDECL(pick_nasty); ! E void FDECL(nasty, (struct monst*)); E void NDECL(resurrect); E void NDECL(intervene); E void NDECL(wizdead); --- 2221,2227 ---- E void NDECL(aggravate); E void NDECL(clonewiz); E int NDECL(pick_nasty); ! E int FDECL(nasty, (struct monst*)); E void NDECL(resurrect); E void NDECL(intervene); E void NDECL(wizdead); *************** *** 2164,2175 **** E void FDECL(setworn, (struct obj *,long)); E void FDECL(setnotworn, (struct obj *)); E void FDECL(mon_set_minvis, (struct monst *)); ! E void FDECL(mon_adjust_speed, (struct monst *,int)); E void FDECL(update_mon_intrinsics, (struct monst *,struct obj *,BOOLEAN_P)); E int FDECL(find_mac, (struct monst *)); E void FDECL(m_dowear, (struct monst *,BOOLEAN_P)); E struct obj *FDECL(which_armor, (struct monst *,long)); ! E void FDECL(mon_break_armor, (struct monst *)); /* ### write.c ### */ --- 2250,2263 ---- E void FDECL(setworn, (struct obj *,long)); E void FDECL(setnotworn, (struct obj *)); E void FDECL(mon_set_minvis, (struct monst *)); ! E void FDECL(mon_adjust_speed, (struct monst *,int,struct obj *)); E void FDECL(update_mon_intrinsics, (struct monst *,struct obj *,BOOLEAN_P)); E int FDECL(find_mac, (struct monst *)); E void FDECL(m_dowear, (struct monst *,BOOLEAN_P)); E struct obj *FDECL(which_armor, (struct monst *,long)); ! E void FDECL(mon_break_armor, (struct monst *,BOOLEAN_P)); ! E void FDECL(bypass_obj, (struct obj *)); ! E void NDECL(clear_bypasses); /* ### write.c ### */ *************** *** 2181,2192 **** E void FDECL(probe_monster, (struct monst *)); E boolean FDECL(get_obj_location, (struct obj *,xchar *,xchar *,int)); E boolean FDECL(get_mon_location, (struct monst *,xchar *,xchar *,int)); E struct monst *FDECL(montraits, (struct obj *,coord *)); E struct monst *FDECL(revive, (struct obj *)); E int FDECL(unturn_dead, (struct monst *)); E void FDECL(cancel_item, (struct obj *)); E boolean FDECL(drain_item, (struct obj *)); ! E void FDECL(poly_obj, (struct obj *, int)); E boolean FDECL(obj_resists, (struct obj *,int,int)); E boolean FDECL(obj_shudders, (struct obj *)); E void FDECL(do_osshock, (struct obj *)); --- 2269,2281 ---- E void FDECL(probe_monster, (struct monst *)); E boolean FDECL(get_obj_location, (struct obj *,xchar *,xchar *,int)); E boolean FDECL(get_mon_location, (struct monst *,xchar *,xchar *,int)); + E struct monst *FDECL(get_container_location, (struct obj *obj, int *, int *)); E struct monst *FDECL(montraits, (struct obj *,coord *)); E struct monst *FDECL(revive, (struct obj *)); E int FDECL(unturn_dead, (struct monst *)); E void FDECL(cancel_item, (struct obj *)); E boolean FDECL(drain_item, (struct obj *)); ! E struct obj *FDECL(poly_obj, (struct obj *, int)); E boolean FDECL(obj_resists, (struct obj *,int,int)); E boolean FDECL(obj_shudders, (struct obj *)); E void FDECL(do_osshock, (struct obj *)); *************** *** 2206,2212 **** E struct monst *FDECL(bhit, (int,int,int,int,int (*)(MONST_P,OBJ_P), int (*)(OBJ_P,OBJ_P),struct obj *)); E struct monst *FDECL(boomhit, (int,int)); ! E int FDECL(burn_floor_paper, (int,int,BOOLEAN_P)); E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int)); E void FDECL(melt_ice, (XCHAR_P,XCHAR_P)); E int FDECL(zap_over_floor, (XCHAR_P,XCHAR_P,int,boolean *)); --- 2295,2301 ---- E struct monst *FDECL(bhit, (int,int,int,int,int (*)(MONST_P,OBJ_P), int (*)(OBJ_P,OBJ_P),struct obj *)); E struct monst *FDECL(boomhit, (int,int)); ! E int FDECL(burn_floor_paper, (int,int,BOOLEAN_P,BOOLEAN_P)); E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int)); E void FDECL(melt_ice, (XCHAR_P,XCHAR_P)); E int FDECL(zap_over_floor, (XCHAR_P,XCHAR_P,int,boolean *)); *** nethack-3.3.1/include/flag.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/flag.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)flag.h 3.3 2000/01/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)flag.h 3.4 2000/01/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 22,27 **** --- 22,28 ---- #ifdef MFLOPPY boolean asksavedisk; #endif + boolean autodig; /* MRKR: Automatically dig */ boolean autoquiver; /* Automatically fill quiver */ boolean beginner; #ifdef MAIL *************** *** 53,58 **** --- 54,60 ---- boolean mon_moving; /* monsters' turn to move */ boolean move; boolean mv; + boolean bypasses; /* bypass flag is set on at least one fobj */ boolean nap; /* `timed_delay' option for display effects */ boolean nopick; /* do not pickup objects (as when running) */ boolean null; /* OK to send nulls to the terminal */ *************** *** 74,79 **** --- 76,82 ---- boolean silent; /* whether the bell rings or not */ boolean sortpack; /* sorted inventory */ boolean soundok; /* ok to tell about sounds heard */ + boolean sparkle; /* show "resisting" special FX (Scott Bigham) */ boolean standout; /* use standout for --More-- */ boolean time; /* display elapsed 'time' */ boolean tombstone; /* print tombstone */ *************** *** 87,101 **** #define NEW_MOON 0 #define FULL_MOON 4 unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */ unsigned run; /* 0: h (etc), 1: H (etc), 2: fh (etc) */ /* 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF- */ unsigned long warntype; /* warn_of_mon monster type M2 */ int warnlevel; int djinni_count, ghost_count; /* potion effect tuning */ int pickup_burden; /* maximum burden before prompt */ char inv_order[MAXOCLASSES]; char pickup_types[MAXOCLASSES]; ! char end_disclose[6]; /* disclose various info upon exit */ char menu_style; /* User interface style setting */ #ifdef AMII_GRAPHICS int numcols; --- 90,112 ---- #define NEW_MOON 0 #define FULL_MOON 4 unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */ + boolean travel; /* find way automatically to u.tx,u.ty */ unsigned run; /* 0: h (etc), 1: H (etc), 2: fh (etc) */ /* 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF- */ + /* 8: travel */ unsigned long warntype; /* warn_of_mon monster type M2 */ int warnlevel; int djinni_count, ghost_count; /* potion effect tuning */ int pickup_burden; /* maximum burden before prompt */ char inv_order[MAXOCLASSES]; char pickup_types[MAXOCLASSES]; ! #define NUM_DISCLOSURE_OPTIONS 5 ! #define DISCLOSE_PROMPT_DEFAULT_YES 'y' ! #define DISCLOSE_PROMPT_DEFAULT_NO 'n' ! #define DISCLOSE_YES_WITHOUT_PROMPT '+' ! #define DISCLOSE_NO_WITHOUT_PROMPT '-' ! char end_disclose[NUM_DISCLOSURE_OPTIONS + 1]; /* disclose various info ! upon exit */ char menu_style; /* User interface style setting */ #ifdef AMII_GRAPHICS int numcols; *************** *** 133,138 **** --- 144,150 ---- int initrace; /* starting race (index into races[]) */ int initgend; /* starting gender (index into genders[]) */ int initalign; /* starting alignment (index into aligns[]) */ + int randomall; /* randomly assign everything not specified */ int pantheon; /* deity selection for priest character */ }; *************** *** 146,179 **** boolean cbreak; /* in cbreak mode, rogue format */ boolean DECgraphics; /* use DEC VT-xxx extended character set */ boolean echo; /* 1 to echo characters */ - #ifdef TTY_GRAPHICS - boolean eight_bit_tty; /* pass eight-bit characters through to tty */ - boolean extmenu; /* extended commands use menu interface */ - #endif boolean IBMgraphics; /* use IBM extended character set */ unsigned msg_history; /* hint: # of top lines to save */ boolean num_pad; /* use numbers for movement commands */ boolean news; /* print news */ boolean window_inited; /* true if init_nhwindows() completed */ int purge_monsters; /* # of dead monsters still on fmon list */ ! #ifdef WIZARD boolean sanity_check; /* run sanity checks */ #endif ! #ifdef TEXTCOLOR ! boolean hilite_pet; /* hilight pets on monochome displays */ ! boolean use_color; /* use color graphics */ ! #endif ! #ifdef MAC_GRAPHICS_ENV ! boolean large_font; /* draw in larger fonts (say, 12pt instead ! of 9pt) */ ! boolean MACgraphics; /* use Macintosh extended character set, as ! as defined in the special font HackFont */ ! unsigned use_stone; /* use the stone ppats */ ! #endif ! #ifdef MAC ! boolean popup_dialog; /* put queries in pop up dialogs instead of ! in the message window */ #endif #ifdef MFLOPPY boolean checkspace; /* check disk space before writing files */ --- 158,181 ---- boolean cbreak; /* in cbreak mode, rogue format */ boolean DECgraphics; /* use DEC VT-xxx extended character set */ boolean echo; /* 1 to echo characters */ boolean IBMgraphics; /* use IBM extended character set */ unsigned msg_history; /* hint: # of top lines to save */ boolean num_pad; /* use numbers for movement commands */ boolean news; /* print news */ boolean window_inited; /* true if init_nhwindows() completed */ + boolean vision_inited; /* true if vision is ready */ + boolean menu_tab_sep; /* Use tabs to separate option menu fields */ int purge_monsters; /* # of dead monsters still on fmon list */ ! int *opt_booldup; /* for duplication of boolean opts in config file */ ! int *opt_compdup; /* for duplication of compound opts in config file */ ! uchar bouldersym; /* symbol for boulder display */ #ifdef WIZARD boolean sanity_check; /* run sanity checks */ + boolean mon_polycontrol; /* debug: control monster polymorphs */ #endif ! #ifdef TTY_GRAPHICS ! boolean prevmsg_window; /* show more old messages at a time */ ! boolean extmenu; /* extended commands use menu interface */ #endif #ifdef MFLOPPY boolean checkspace; /* check disk space before writing files */ *************** *** 184,212 **** boolean BIOS; /* use IBM or ST BIOS calls when appropriate */ boolean rawio; /* whether can use rawio (IOCTL call) */ #endif ! #ifdef MSDOS ! boolean hasvga; /* has a vga adapter */ ! boolean usevga; /* use the vga adapter */ ! boolean has8514; ! boolean use8514; ! boolean hasvesa; ! boolean usevesa; ! boolean grmode; /* currently in graphics mode */ #endif #if defined(MSDOS) || defined(WIN32) boolean hassound; /* has a sound card */ boolean usesound; /* use the sound card */ boolean usepcspeaker; /* use the pc speaker */ - boolean preload_tiles; /* preload the tiles into RAM */ boolean tile_view; boolean over_view; boolean traditional_view; #endif #ifdef LAN_FEATURES boolean lan_mail; /* mail is initialized */ boolean lan_mail_fetched; /* mail is awaiting display */ #endif }; extern NEARDATA struct flag flags; extern NEARDATA struct instance_flags iflags; --- 186,277 ---- boolean BIOS; /* use IBM or ST BIOS calls when appropriate */ boolean rawio; /* whether can use rawio (IOCTL call) */ #endif ! #ifdef MAC_GRAPHICS_ENV ! boolean MACgraphics; /* use Macintosh extended character set, as ! as defined in the special font HackFont */ ! unsigned use_stone; /* use the stone ppats */ #endif #if defined(MSDOS) || defined(WIN32) boolean hassound; /* has a sound card */ boolean usesound; /* use the sound card */ boolean usepcspeaker; /* use the pc speaker */ boolean tile_view; boolean over_view; boolean traditional_view; #endif + #ifdef MSDOS + boolean hasvga; /* has a vga adapter */ + boolean usevga; /* use the vga adapter */ + boolean grmode; /* currently in graphics mode */ + #endif #ifdef LAN_FEATURES boolean lan_mail; /* mail is initialized */ boolean lan_mail_fetched; /* mail is awaiting display */ #endif + /* + * Window capability support. + */ + boolean wc_color; /* use color graphics */ + boolean wc_hilite_pet; /* hilight pets */ + boolean wc_ascii_map; /* show map using traditional ascii */ + boolean wc_tiled_map; /* show map using tiles */ + boolean wc_preload_tiles; /* preload tiles into memory */ + int wc_tile_width; /* tile width */ + int wc_tile_height; /* tile height */ + char *wc_tile_file; /* name of tile file;overrides default */ + boolean wc_inverse; /* use inverse video for some things */ + int wc_align_status; /* status win at top|bot|right|left */ + int wc_align_message; /* message win at top|bot|right|left */ + int wc_vary_msgcount; /* show more old messages at a time */ + char *wc_foregrnd_menu; /* points to foregrnd color name for menu win */ + char *wc_backgrnd_menu; /* points to backgrnd color name for menu win */ + char *wc_foregrnd_message; /* points to foregrnd color name for msg win */ + char *wc_backgrnd_message; /* points to backgrnd color name for msg win */ + char *wc_foregrnd_status; /* points to foregrnd color name for status win */ + char *wc_backgrnd_status; /* points to backgrnd color name for status win */ + char *wc_foregrnd_text; /* points to foregrnd color name for text win */ + char *wc_backgrnd_text; /* points to backgrnd color name for text win */ + char *wc_font_map; /* points to font name for the map win */ + char *wc_font_message; /* points to font name for message win */ + char *wc_font_status; /* points to font name for status win */ + char *wc_font_menu; /* points to font name for menu win */ + char *wc_font_text; /* points to font name for text win */ + int wc_fontsiz_map; /* font size for the map win */ + int wc_fontsiz_message; /* font size for the message window */ + int wc_fontsiz_status; /* font size for the status window */ + int wc_fontsiz_menu; /* font size for the menu window */ + int wc_fontsiz_text; /* font size for text windows */ + int wc_scroll_margin; /* scroll map when this far from + the edge */ + int wc_map_mode; /* specify map viewing options, mostly + for backward compatibility */ + int wc_player_selection; /* method of choosing character */ + boolean wc_splash_screen; /* display an opening splash screen or not */ + boolean wc_popup_dialog; /* put queries in pop up dialogs instead of + in the message window */ + boolean wc_large_font; /* draw in larger fonts (say, 12pt instead + of 9pt) */ + boolean wc_eight_bit_input; /* allow eight bit input */ }; + + /* + * Old deprecated names + */ + #ifdef TTY_GRAPHICS + #define eight_bit_tty wc_eight_bit_input + #endif + #ifdef TEXTCOLOR + #define use_color wc_color + #endif + #define hilite_pet wc_hilite_pet + #define use_inverse wc_inverse + #ifdef MAC_GRAPHICS_ENV + #define large_font wc_large_font + #endif + #ifdef MAC + #define popup_dialog wc_popup_dialog + #endif + #define preload_tiles wc_preload_tiles extern NEARDATA struct flag flags; extern NEARDATA struct instance_flags iflags; *** nethack-3.3.1/include/func_tab.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/func_tab.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)func_tab.h 3.3 92/04/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)func_tab.h 3.4 1992/04/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/global.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/global.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)global.h 3.3 99/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)global.h 3.4 2002/03/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,14 **** #include ! /*#define BETA */ /* if a beta-test copy [MRS] */ /* * Files expected to exist in the playground directory. --- 8,14 ---- #include ! /* #define BETA */ /* if a beta-test copy [MRS] */ /* * Files expected to exist in the playground directory. *************** *** 215,221 **** # define PORT_ID "VMS" # endif # ifdef WIN32 ! # define PORT_ID "NT" # endif #endif --- 215,226 ---- # define PORT_ID "VMS" # endif # ifdef WIN32 ! # define PORT_ID "Windows" ! # ifdef MSWIN_GRAPHICS ! # define PORT_SUB_ID "graphical" ! # else ! # define PORT_SUB_ID "tty" ! # endif # endif #endif *************** *** 246,252 **** # define EXIT_FAILURE 1 #endif ! #if defined(X11_GRAPHICS) || defined(QT_GRAPHICS) || defined(GNOME_GRAPHICS) # ifndef USE_TILES # define USE_TILES /* glyph2tile[] will be available */ # endif --- 251,257 ---- # define EXIT_FAILURE 1 #endif ! #if defined(X11_GRAPHICS) || defined(QT_GRAPHICS) || defined(GNOME_GRAPHICS) || defined(MSWIN_GRAPHICS) # ifndef USE_TILES # define USE_TILES /* glyph2tile[] will be available */ # endif *** nethack-3.3.1/include/hack.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/hack.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)hack.h 3.3 2000/01/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)hack.h 3.4 2001/04/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 43,51 **** #define DISMOUNT_THROWN 2 #define DISMOUNT_POLY 3 #define DISMOUNT_ENGULFED 4 ! #define DISMOUNT_BYCHOICE 5 #endif /* * This is the way the game ends. If these are rearranged, the arrays * in end.c and topten.c will need to be changed. Some parts of the --- 43,64 ---- #define DISMOUNT_THROWN 2 #define DISMOUNT_POLY 3 #define DISMOUNT_ENGULFED 4 ! #define DISMOUNT_BONES 5 ! #define DISMOUNT_BYCHOICE 6 #endif + /* Special returns from mapglyph() */ + #define MG_CORPSE 0x01 + #define MG_INVIS 0x02 + #define MG_DETECT 0x04 + #define MG_PET 0x08 + #define MG_RIDDEN 0x10 + + /* sellobj_state() states */ + #define SELL_NORMAL (0) + #define SELL_DELIBERATE (1) + #define SELL_DONTSELL (2) + /* * This is the way the game ends. If these are rearranged, the arrays * in end.c and topten.c will need to be changed. Some parts of the *************** *** 125,130 **** --- 138,147 ---- #define MM_EMIN 0x08 /* add emin structure */ #define MM_ANGRY 0x10 /* monster is created angry */ #define MM_NONAME 0x20 /* monster is not christened */ + #define MM_NOCOUNTBIRTH 0x40 /* don't increment born counter (for revival) */ + + /* flags for special ggetobj status returns */ + #define ALL_FINISHED 0x01 /* called routine already finished the job */ /* flags to control query_objlist() */ #define BY_NEXTHERE 0x1 /* follow objlist by nexthere field */ *************** *** 141,146 **** --- 158,168 ---- #define ALL_TYPES 0x10 #define BILLED_TYPES 0x20 #define CHOOSE_ALL 0x40 + #define BUC_BLESSED 0x80 + #define BUC_CURSED 0x100 + #define BUC_UNCURSED 0x200 + #define BUC_UNKNOWN 0x400 + #define BUC_ALLBKNOWN (BUC_BLESSED|BUC_CURSED|BUC_UNCURSED) #define ALL_TYPES_SELECTED -2 /* Flags to control find_mid() */ *************** *** 149,154 **** --- 171,183 ---- #define FM_MYDOGS 0x04 /* search mydogs */ #define FM_EVERYWHERE (FM_FMON | FM_MIGRATE | FM_MYDOGS) + /* Flags to control pick_[race,role,gend,align] routines in role.c */ + #define PICK_RANDOM 0 + #define PICK_RIGID 1 + + /* Flags to control dotrap() in trap.c */ + #define NOWEBMSG 0x01 /* suppress stumble into web message */ + /*** some utility macros ***/ #define yn(query) yn_function(query,ynchars, 'n') #define ynq(query) yn_function(query,ynqchars, 'q') *************** *** 169,174 **** --- 198,213 ---- #define ROLL 1 #define FLING 2 + /* Macros for explosion types */ + #define EXPL_DARK 0 + #define EXPL_NOXIOUS 1 + #define EXPL_MUDDY 2 + #define EXPL_WET 3 + #define EXPL_MAGICAL 4 + #define EXPL_FIERY 5 + #define EXPL_FROSTY 6 + #define EXPL_MAX 7 + /* Macros for messages referring to hands, eyes, feet, etc... */ #define ARM 0 #define EYE 1 *************** *** 187,192 **** --- 226,233 ---- #define HAIR 14 #define BLOOD 15 #define LUNG 16 + #define NOSE 17 + #define STOMACH 18 /* Flags to control menus */ #define MENUTYPELEN sizeof("traditional ") *************** *** 197,202 **** --- 238,253 ---- #define MENU_SELECTED TRUE #define MENU_UNSELECTED FALSE + + /* + * Option flags + * Each higher number includes the characteristics of the numbers + * below it. + */ + #define SET_IN_FILE 0 /* config file option only */ + #define SET_VIA_PROG 1 /* may be set via extern program, not seen in game */ + #define DISP_IN_GAME 2 /* may be set via extern program, displayed in game */ + #define SET_IN_GAME 3 /* may be set via extern program or set in the game */ #define FEATURE_NOTICE_VER(major,minor,patch) (((unsigned long)major << 24) | \ ((unsigned long)minor << 16) | \ *** nethack-3.3.1/include/lev.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/lev.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)lev.h 3.3 94/03/18 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)lev.h 3.4 1994/03/18 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 14,18 **** --- 14,49 ---- /* operations of the various saveXXXchn & co. routines */ #define perform_bwrite(mode) ((mode) & (COUNT_SAVE|WRITE_SAVE)) #define release_data(mode) ((mode) & FREE_SAVE) + + /* The following are used in mkmaze.c */ + struct container { + struct container *next; + xchar x, y; + short what; + genericptr_t list; + }; + + #define CONS_OBJ 0 + #define CONS_MON 1 + #define CONS_HERO 2 + #define CONS_TRAP 3 + + struct bubble { + xchar x, y; /* coordinates of the upper left corner */ + schar dx, dy; /* the general direction of the bubble's movement */ + uchar *bm; /* pointer to the bubble bit mask */ + struct bubble *prev, *next; /* need to traverse the list up and down */ + struct container *cons; + }; + + /* used in light.c */ + typedef struct ls_t { + struct ls_t *next; + xchar x, y; /* source's position */ + short range; /* source's current range */ + short flags; + short type; /* type of light source */ + genericptr_t id; /* source's identifier */ + } light_source; #endif /* LEV_H */ *** nethack-3.3.1/include/macconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/macconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)macconf.h 3.3 99/10/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)macconf.h 3.4 1999/10/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 9,17 **** /* * Compiler selection is based on the following symbols: * ! * applec MPW compiler * THINK_C Think C compiler ! * __MWERKS__ Metrowerks compiler * * We use these early in config.h to define some needed symbols, * including MAC. --- 9,18 ---- /* * Compiler selection is based on the following symbols: * ! * __SC__ sc, a MPW 68k compiler ! * __MRC__ mrc, a MPW PowerPC compiler * THINK_C Think C compiler ! * __MWERKS__ Metrowerks' Codewarrior compiler * * We use these early in config.h to define some needed symbols, * including MAC. *************** *** 20,40 **** # WIDENED_PROTOTYPES (defined if UNWIDENED_PROTOTYPES is undefined and # NHSTDC is defined). */ - # ifdef applec - # define MAC_MPW32 /* Headers, and for avoiding a bug */ - # endif - - # ifndef __powerc - # define MAC68K /* 68K mac (non-powerpc) */ - # endif - - # define RANDOM - # define NO_SIGNAL /* You wouldn't believe our signals ... */ - # define FILENAME 256 - # define NO_TERMS /* For tty port (see wintty.h) */ ! # define TEXTCOLOR /* For Mac TTY interface */ ! # define CHANGE_COLOR /* Use these two includes instead of system.h. */ #include --- 21,38 ---- # WIDENED_PROTOTYPES (defined if UNWIDENED_PROTOTYPES is undefined and # NHSTDC is defined). */ ! #ifndef __powerc ! # define MAC68K /* 68K mac (non-powerpc) */ ! #endif ! ! #define RANDOM ! #define NO_SIGNAL /* You wouldn't believe our signals ... */ ! #define FILENAME 256 ! #define NO_TERMS /* For tty port (see wintty.h) */ ! ! #define TEXTCOLOR /* For Mac TTY interface */ ! #define CHANGE_COLOR /* Use these two includes instead of system.h. */ #include *************** *** 42,102 **** /* Uncomment this line if your headers don't already define off_t */ /*typedef long off_t;*/ /* * Try and keep the number of files here to an ABSOLUTE minimum ! * include the relevant files in the relevant .c files instead ! */ #include - /* - * Turn off the Macsbug calls for the production version. - */ - #if 0 - # undef Debugger - # undef DebugStr - # define Debugger() - # define DebugStr(aStr) - #endif /* * We could use the PSN under sys 7 here ... */ ! #ifndef __CONDITIONALMACROS__ /* universal headers */ ! # define getpid() 1 ! # define getuid() 1 ! #endif ! # define index strchr ! # define rindex strrchr ! # define Rand random extern void error(const char *,...); ! # if !defined(O_WRONLY) ! # ifdef __MWERKS__ ! #include ! # ifndef O_EXCL ! /* MW 4.5 doesn't have this, so just use a bogus value */ ! # define O_EXCL 0x80000000 ! # endif ! # else ! #include ! # endif # endif /* * Don't redefine these Unix IO functions when making LevComp or DgnComp for * MPW. With MPW, we make them into MPW tools, which use unix IO. SPEC_LEV * and DGN_COMP are defined when compiling for LevComp and DgnComp respectively. */ ! #if !(defined(applec) && (defined(SPEC_LEV) || defined(DGN_COMP))) # define creat maccreat # define open macopen # define close macclose # define read macread # define write macwrite # define lseek macseek #endif # define TEXT_TYPE 'TEXT' # define LEVL_TYPE 'LEVL' # define BONE_TYPE 'BONE' --- 40,89 ---- /* Uncomment this line if your headers don't already define off_t */ /*typedef long off_t;*/ + #include /* for time_t */ /* * Try and keep the number of files here to an ABSOLUTE minimum ! * include the relevant files in the relevant .c files instead ! */ #include /* * We could use the PSN under sys 7 here ... + * ...but it wouldn't matter... */ ! #define getpid() 1 ! #define getuid() 1 ! #define index strchr ! #define rindex strrchr ! #define Rand random extern void error(const char *,...); ! #if !defined(O_WRONLY) ! # ifdef __MWERKS__ ! # include # endif + # include + #endif /* * Don't redefine these Unix IO functions when making LevComp or DgnComp for * MPW. With MPW, we make them into MPW tools, which use unix IO. SPEC_LEV * and DGN_COMP are defined when compiling for LevComp and DgnComp respectively. */ ! #if !((defined(__SC__) || defined(__MRC__)) && (defined(SPEC_LEV) || defined(DGN_COMP))) # define creat maccreat # define open macopen # define close macclose # define read macread # define write macwrite # define lseek macseek + # define unlink _unlink #endif + #define YY_NEVER_INTERACTIVE + # define TEXT_TYPE 'TEXT' # define LEVL_TYPE 'LEVL' # define BONE_TYPE 'BONE' *************** *** 104,109 **** --- 91,97 ---- # define PREF_TYPE 'PREF' # define DATA_TYPE 'DATA' # define MAC_CREATOR 'nh31' /* Registered with DTS ! */ + # define TEXT_CREATOR 'ttxt' /* Something the user can actually edit */ /* * Define PORT_HELP to be the name of the port-specfic help file. *** nethack-3.3.1/include/macpopup.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/macpopup.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)macpopup.h 3.3 99/10/25 */ /* Copyright (c) Nethack Develpment Team, 1999. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)macpopup.h 3.4 1999/10/25 */ /* Copyright (c) Nethack Develpment Team, 1999. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,22 **** extern char topl_yn_function(const char *query, const char *resp, char def); extern int get_line_from_key_queue(char *bufp); - #define ENABLE_MAC_POPUP 0 - #if ENABLE_MAC_POPUP - - extern char popup_yn_function(const char *query, const char *resp, char def); - extern void popup_getlin (const char *query, char *bufp); - - #endif /* ENABLE_MAC_POPUP */ #endif /* MACPOPUP_H */ --- 12,15 ---- *** nethack-3.3.1/include/mactty.h Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/include/mactty.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mactty.h 3.3 93/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mactty.h 3.4 1993/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/macwin.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/macwin.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)macwin.h 3.3 96/01/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)macwin.h 3.4 1996/01/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/mail.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/mail.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mail.h 3.3 91/10/11 */ /* NetHack may be freely redistributed. See license for details. */ /* used by ckmailstatus() to pass information to the mail-daemon in newmail() */ --- 1,4 ---- ! /* SCCS Id: @(#)mail.h 3.4 1991/10/11 */ /* NetHack may be freely redistributed. See license for details. */ /* used by ckmailstatus() to pass information to the mail-daemon in newmail() */ *** nethack-3.3.1/include/mfndpos.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/mfndpos.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mfndpos.h 3.3 93/05/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mfndpos.h 3.4 1993/05/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/micro.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/micro.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)micro.h 3.3 90/02/22 */ /* micro.h - function declarations for various microcomputers */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)micro.h 3.4 1990/02/22 */ /* micro.h - function declarations for various microcomputers */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/mkroom.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/mkroom.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mkroom.h 3.3 92/11/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mkroom.h 3.4 1992/11/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/monattk.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/monattk.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)monattk.h 3.3 95/01/28 */ /* NetHack may be freely redistributed. See license for details. */ /* Copyright 1988, M. Stephenson */ --- 1,4 ---- ! /* SCCS Id: @(#)monattk.h 3.4 1995/01/28 */ /* NetHack may be freely redistributed. See license for details. */ /* Copyright 1988, M. Stephenson */ *************** *** 75,81 **** #define AD_FAMN 39 /* for Famine only */ #define AD_SLIM 40 /* turns you into green slime */ #define AD_ENCH 41 /* remove enchantment (disenchanter) */ ! #define AD_CORRODE 42 /* corrode armor (black pudding) */ #define AD_CLRC 240 /* random clerical spell */ #define AD_SPEL 241 /* random magic spell */ --- 75,81 ---- #define AD_FAMN 39 /* for Famine only */ #define AD_SLIM 40 /* turns you into green slime */ #define AD_ENCH 41 /* remove enchantment (disenchanter) */ ! #define AD_CORR 42 /* corrode armor (black pudding) */ #define AD_CLRC 240 /* random clerical spell */ #define AD_SPEL 241 /* random magic spell */ *** nethack-3.3.1/include/mondata.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/mondata.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mondata.h 3.3 2000/07/14 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mondata.h 3.4 2001/02/14 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 33,44 **** --- 33,48 ---- #define hides_under(ptr) (((ptr)->mflags1 & M1_CONCEAL) != 0L) #define is_hider(ptr) (((ptr)->mflags1 & M1_HIDE) != 0L) #define haseyes(ptr) (((ptr)->mflags1 & M1_NOEYES) == 0L) + #define eyecount(ptr) (!haseyes(ptr) ? 0 : \ + ((ptr) == &mons[PM_CYCLOPS] || \ + (ptr) == &mons[PM_FLOATING_EYE]) ? 1 : 2) #define nohands(ptr) (((ptr)->mflags1 & M1_NOHANDS) != 0L) #define nolimbs(ptr) (((ptr)->mflags1 & M1_NOLIMBS) == M1_NOLIMBS) #define notake(ptr) (((ptr)->mflags1 & M1_NOTAKE) != 0L) #define has_head(ptr) (((ptr)->mflags1 & M1_NOHEAD) == 0L) #define is_whirly(ptr) ((ptr)->mlet == S_VORTEX || \ (ptr) == &mons[PM_AIR_ELEMENTAL]) + #define is_silent(ptr) ((ptr)->msound == MS_SILENT) #define unsolid(ptr) (((ptr)->mflags1 & M1_UNSOLID) != 0L) #define mindless(ptr) (((ptr)->mflags1 & M1_MINDLESS) != 0L) #define humanoid(ptr) (((ptr)->mflags1 & M1_HUMANOID) != 0L) *************** *** 90,95 **** --- 94,100 ---- #define strongmonst(ptr) (((ptr)->mflags2 & M2_STRONG) != 0L) #define can_breathe(ptr) attacktype(ptr, AT_BREA) #define cantwield(ptr) (nohands(ptr) || verysmall(ptr)) + #define could_twoweap(ptr) ((ptr)->mattk[1].aatyp == AT_WEAP) #define cantweararm(ptr) (breakarm(ptr) || sliparm(ptr)) #define throws_rocks(ptr) (((ptr)->mflags2 & M2_ROCKTHROW) != 0L) #define type_is_pname(ptr) (((ptr)->mflags2 & M2_PNAME) != 0L) *************** *** 125,130 **** --- 130,138 ---- (ptr) == &mons[PM_GIANT] || \ (ptr) == &mons[PM_ELF] || \ (ptr) == &mons[PM_HUMAN]) + /* return TRUE if the monster tends to revive */ + #define is_reviver(ptr) (is_rider(ptr) || (ptr)->mlet == S_TROLL) + /* this returns the light's range, or 0 if none; if we add more light emitting monsters, we'll likely have to add a new light range field to mons[] */ #define emits_light(ptr) (((ptr)->mlet == S_LIGHT || \ *************** *** 149,155 **** #define is_mind_flayer(ptr) ((ptr) == &mons[PM_MIND_FLAYER] || \ (ptr) == &mons[PM_MASTER_MIND_FLAYER]) ! #define nonliving(ptr) (is_golem(ptr) || is_undead(ptr)) /* Used for conduct with corpses, tins, and digestion attacks */ /* G_NOCORPSE monsters might still be swallowed as a purple worm */ --- 157,164 ---- #define is_mind_flayer(ptr) ((ptr) == &mons[PM_MIND_FLAYER] || \ (ptr) == &mons[PM_MASTER_MIND_FLAYER]) ! #define nonliving(ptr) (is_golem(ptr) || is_undead(ptr) || \ ! (ptr)->mlet == S_VORTEX) /* Used for conduct with corpses, tins, and digestion attacks */ /* G_NOCORPSE monsters might still be swallowed as a purple worm */ *************** *** 168,172 **** --- 177,184 ---- #define vegetarian(ptr) (vegan(ptr) || \ ((ptr)->mlet == S_PUDDING && \ (ptr) != &mons[PM_BLACK_PUDDING])) + + #define befriend_with_obj(ptr, obj) ((obj)->oclass == FOOD_CLASS && \ + is_domestic(ptr)) #endif /* MONDATA_H */ *** nethack-3.3.1/include/monflag.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/monflag.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)monflag.h 3.3 96/05/04 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)monflag.h 3.4 1996/05/04 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/monst.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/monst.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)monst.h 3.3 99/01/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)monst.h 3.4 1999/01/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 83,89 **** Bitfield(mspeed,2); /* current speed */ Bitfield(permspeed,2); /* intrinsic mspeed value */ Bitfield(mrevived,1); /* has been revived from the dead */ ! Bitfield(not_used,1); /*** available ***/ Bitfield(mflee,1); /* fleeing */ Bitfield(mfleetim,7); /* timeout for mflee */ --- 83,89 ---- Bitfield(mspeed,2); /* current speed */ Bitfield(permspeed,2); /* intrinsic mspeed value */ Bitfield(mrevived,1); /* has been revived from the dead */ ! Bitfield(mavenge,1); /* did something to deserve retaliation */ Bitfield(mflee,1); /* fleeing */ Bitfield(mfleetim,7); /* timeout for mflee */ *************** *** 128,134 **** --- 128,136 ---- long mtrapseen; /* bitmap of traps we've been trapped in */ long mlstmv; /* for catching up with lost time */ + #ifndef GOLDOBJ long mgold; + #endif struct obj *minvent; struct obj *mw; *** nethack-3.3.1/include/monsym.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/monsym.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)monsym.h 3.3 92/10/18 */ /* Monster symbols and creation information rev 1.0 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)monsym.h 3.4 1992/10/18 */ /* Monster symbols and creation information rev 1.0 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/mttypriv.h Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/include/mttypriv.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mttypriv.h 3.3 93/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mttypriv.h 3.4 1993/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/nhlan.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/nhlan.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)nhlan.h 3.3 97/04/12 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)nhlan.h 3.4 1997/04/12 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/ntconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/ntconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)ntconf.h 3.3 96/10/14 */ /* Copyright (c) NetHack PC Development Team 1993, 1994. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)ntconf.h 3.4 2002/03/10 */ /* Copyright (c) NetHack PC Development Team 1993, 1994. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,22 **** /* #define SHELL /* nt use of pcsys routines caused a hang */ #define RANDOM /* have Berkeley random(3) */ - #define TEXTCOLOR /* Color text */ - #define PATHLEN 64 /* maximum pathlength */ - #define FILENAME 80 /* maximum filename length (conservative) */ #define EXEPATH /* Allow .exe location to be used as HACKDIR */ #define TRADITIONAL_GLYPHMAP /* Store glyph mappings at level change time */ #ifdef WIN32CON ! #define LAN_FEATURES /* Include code for lan-aware features. */ #endif #define PC_LOCKING /* Prevent overwrites of aborted or in-progress games */ --- 8,19 ---- /* #define SHELL /* nt use of pcsys routines caused a hang */ #define RANDOM /* have Berkeley random(3) */ #define TEXTCOLOR /* Color text */ #define EXEPATH /* Allow .exe location to be used as HACKDIR */ #define TRADITIONAL_GLYPHMAP /* Store glyph mappings at level change time */ #ifdef WIN32CON ! #define LAN_FEATURES /* Include code for lan-aware features. Untested in 3.4.0*/ #endif #define PC_LOCKING /* Prevent overwrites of aborted or in-progress games */ *************** *** 36,41 **** --- 33,50 ---- #define NO_TERMS #define ASCIIGRAPH + #ifdef OPTIONS_USED + #undef OPTIONS_USED + #endif + #ifdef MSWIN_GRAPHICS + #define OPTIONS_USED "guioptions" + #else + #define OPTIONS_USED "ttyoptions" + #endif + #define OPTIONS_FILE OPTIONS_USED + + #define PORT_HELP "porthelp" + /* The following is needed for prototypes of certain functions */ #if defined(_MSC_VER) #include /* Provides prototypes of exit(), spawn() */ *************** *** 48,53 **** --- 57,79 ---- #include #include + #ifdef __BORLANDC__ + #undef randomize + #undef random + #endif + + #define PATHLEN BUFSZ /* maximum pathlength */ + #define FILENAME BUFSZ /* maximum filename length (conservative) */ + + #if defined(_MAX_PATH) && defined(_MAX_FNAME) + # if (_MAX_PATH < BUFSZ) && (_MAX_FNAME < BUFSZ) + #undef PATHLEN + #undef FILENAME + #define PATHLEN _MAX_PATH + #define FILENAME _MAX_FNAME + # endif + #endif + #define NO_SIGNAL #define index strchr *************** *** 85,92 **** --- 111,130 ---- #endif #include + #ifndef __BORLANDC__ #include #include + #else + int _RTLENTRY _EXPFUNC _chdrive(int __drive); + int _RTLENTRYF _EXPFUNC32 chdir( const char _FAR *__path ); + char _FAR * _RTLENTRY _EXPFUNC getcwd( char _FAR *__buf, int __buflen ); + int _RTLENTRY _EXPFUNC write (int __handle, const void _FAR *__buf, unsigned __len); + int _RTLENTRY _EXPFUNC creat (const char _FAR *__path, int __amode); + int _RTLENTRY _EXPFUNC close (int __handle); + int _RTLENTRY _EXPFUNC open (const char _FAR *__path, int __access,... /*unsigned mode*/); + long _RTLENTRY _EXPFUNC lseek (int __handle, long __offset, int __fromwhere); + int _RTLENTRY _EXPFUNC read (int __handle, void _FAR *__buf, unsigned __len); + #endif #include #undef kbhit /* Use our special NT kbhit */ #define kbhit (*nt_kbhit) *************** *** 117,121 **** --- 155,161 ---- #pragma warning(disable:4102) /* unreferenced label */ #endif #endif + + extern int FDECL(set_win32_option, (const char *, const char *)); #endif /* NTCONF_H */ *** nethack-3.3.1/include/obj.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/obj.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)obj.h 3.3 1999/12/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)obj.h 3.4 2002/01/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 65,70 **** --- 65,71 ---- #define MAX_ERODE 3 #define orotten oeroded /* rotten food */ #define odiluted oeroded /* diluted potions */ + #define norevive oeroded2 Bitfield(oerodeproof,1); /* erodeproof weapon/armor */ Bitfield(olocked,1); /* object is locked */ Bitfield(obroken,1); /* lock has been broken */ *************** *** 84,90 **** #define OATTACHED_UNUSED3 3 Bitfield(in_use,1); /* for magic items before useup items */ ! /* 7 free bits */ int corpsenm; /* type of corpse is mons[corpsenm] */ #define leashmon corpsenm /* gets m_id of attached pet */ --- 85,92 ---- #define OATTACHED_UNUSED3 3 Bitfield(in_use,1); /* for magic items before useup items */ ! Bitfield(bypass,1); /* mark this as an object to be skipped by bhito() */ ! /* 6 free bits */ int corpsenm; /* type of corpse is mons[corpsenm] */ #define leashmon corpsenm /* gets m_id of attached pet */ *************** *** 197,206 **** --- 199,238 ---- #define Is_mbag(otmp) (otmp->otyp == BAG_OF_HOLDING || \ otmp->otyp == BAG_OF_TRICKS) + /* dragon gear */ + #define Is_dragon_scales(obj) ((obj)->otyp >= GRAY_DRAGON_SCALES && \ + (obj)->otyp <= YELLOW_DRAGON_SCALES) + #define Is_dragon_mail(obj) ((obj)->otyp >= GRAY_DRAGON_SCALE_MAIL && \ + (obj)->otyp <= YELLOW_DRAGON_SCALE_MAIL) + #define Is_dragon_armor(obj) (Is_dragon_scales(obj) || Is_dragon_mail(obj)) + #define Dragon_scales_to_pm(obj) &mons[PM_GRAY_DRAGON + (obj)->otyp \ + - GRAY_DRAGON_SCALES] + #define Dragon_mail_to_pm(obj) &mons[PM_GRAY_DRAGON + (obj)->otyp \ + - GRAY_DRAGON_SCALE_MAIL] + #define Dragon_to_scales(pm) (GRAY_DRAGON_SCALES + (pm - mons)) + /* Light sources */ #define Is_candle(otmp) (otmp->otyp == TALLOW_CANDLE || \ otmp->otyp == WAX_CANDLE) #define MAX_OIL_IN_FLASK 400 /* maximum amount of oil in a potion of oil */ + + /* special stones */ + #define is_graystone(obj) ((obj)->otyp == LUCKSTONE || \ + (obj)->otyp == LOADSTONE || \ + (obj)->otyp == FLINT || \ + (obj)->otyp == TOUCHSTONE) + + /* misc */ + #ifdef KOPS + #define is_flimsy(otmp) (objects[(otmp)->otyp].oc_material <= LEATHER || \ + (otmp)->otyp == RUBBER_HOSE) + #else + #define is_flimsy(otmp) (objects[(otmp)->otyp].oc_material <= LEATHER) + #endif + + /* helpers, simple enough to be macros */ + #define is_plural(o) ((o)->quan > 1 || \ + (o)->oartifact == ART_EYES_OF_THE_OVERWORLD) /* Flags for get_obj_location(). */ #define CONTAINED_TOO 0x1 *** nethack-3.3.1/include/objclass.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/objclass.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)objclass.h 3.3 96/06/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)objclass.h 3.4 1996/06/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 68,81 **** objects[otmp->otyp].oc_material <= MITHRIL) /* primary damage: fire/rust/--- */ ! /* is_flammable() in mkobj.c */ #define is_rustprone(otmp) (objects[otmp->otyp].oc_material == IRON) /* secondary damage: rot/acid/acid */ - #define is_rottable(otmp) is_flammable(otmp) /* we might want to change this */ #define is_corrodeable(otmp) (objects[otmp->otyp].oc_material == COPPER || objects[otmp->otyp].oc_material == IRON) ! #define is_damageable(otmp) (is_rustprone(otmp) || is_flammable(otmp) || is_corrodeable(otmp)) schar oc_subtyp; #define oc_skill oc_subtyp /* Skills of weapons, spellbooks, tools, gems */ --- 68,81 ---- objects[otmp->otyp].oc_material <= MITHRIL) /* primary damage: fire/rust/--- */ ! /* is_flammable(otmp), is_rottable(otmp) in mkobj.c */ #define is_rustprone(otmp) (objects[otmp->otyp].oc_material == IRON) /* secondary damage: rot/acid/acid */ #define is_corrodeable(otmp) (objects[otmp->otyp].oc_material == COPPER || objects[otmp->otyp].oc_material == IRON) ! #define is_damageable(otmp) (is_rustprone(otmp) || is_flammable(otmp) || \ ! is_rottable || is_corrodeable(otmp)) schar oc_subtyp; #define oc_skill oc_subtyp /* Skills of weapons, spellbooks, tools, gems */ *************** *** 91,99 **** uchar oc_oprop; /* property (invis, &c.) conveyed */ char oc_class; /* object class */ schar oc_delay; /* delay when using such an object */ ! #ifdef TEXTCOLOR ! uchar oc_color; /* display color of the object */ ! #endif /* TEXTCOLOR */ short oc_prob; /* probability, used in mkobj() */ unsigned short oc_weight; /* encumbrance (1 cn = 0.1 lb.) */ short oc_cost; /* base cost in shops */ --- 91,98 ---- uchar oc_oprop; /* property (invis, &c.) conveyed */ char oc_class; /* object class */ schar oc_delay; /* delay when using such an object */ ! uchar oc_color; /* color of the object */ ! short oc_prob; /* probability, used in mkobj() */ unsigned short oc_weight; /* encumbrance (1 cn = 0.1 lb.) */ short oc_cost; /* base cost in shops */ *** nethack-3.3.1/include/os2conf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/os2conf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)os2conf.h 3.3 96/10/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)os2conf.h 3.4 1996/10/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 13,19 **** */ /* #define OS2_MSC /* Microsoft C 5.1 and 6.0 */ ! /* #define OS2_GCC /* GCC emx 0.8f */ /* #define OS2_CSET2 /* IBM C Set/2 (courtesy Jeff Urlwin) */ /* #define OS2_CSET2_VER_1 /* CSet/2 version selection */ /* #define OS2_CSET2_VER_2 /* - " - */ --- 13,19 ---- */ /* #define OS2_MSC /* Microsoft C 5.1 and 6.0 */ ! #define OS2_GCC /* GCC emx 0.8f */ /* #define OS2_CSET2 /* IBM C Set/2 (courtesy Jeff Urlwin) */ /* #define OS2_CSET2_VER_1 /* CSet/2 version selection */ /* #define OS2_CSET2_VER_2 /* - " - */ *************** *** 34,40 **** * reason to touch the defaults, I think. */ ! #define MFLOPPY /* floppy and ramdisk support */ #define RANDOM /* Berkeley random(3) */ #define SHELL /* shell escape */ /* #define TERMLIB /* use termcap file */ --- 34,40 ---- * reason to touch the defaults, I think. */ ! /*#define MFLOPPY /* floppy and ramdisk support */ #define RANDOM /* Berkeley random(3) */ #define SHELL /* shell escape */ /* #define TERMLIB /* use termcap file */ *** nethack-3.3.1/include/patchlevel.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/patchlevel.h Thu Mar 21 07:37:36 2002 *************** *** 1,14 **** ! /* SCCS Id: @(#)patchlevel.h 3.3 2000/07/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ ! /* NetHack 3.3.1 */ #define VERSION_MAJOR 3 ! #define VERSION_MINOR 3 /* * PATCHLEVEL is updated for each release. */ ! #define PATCHLEVEL 1 /* * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. --- 1,14 ---- ! /* SCCS Id: @(#)patchlevel.h 3.4 2002/03/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ ! /* NetHack 3.4.0 */ #define VERSION_MAJOR 3 ! #define VERSION_MINOR 4 /* * PATCHLEVEL is updated for each release. */ ! #define PATCHLEVEL 0 /* * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. *************** *** 16,22 **** #define EDITLEVEL 0 #define COPYRIGHT_BANNER_A \ ! "NetHack, Copyright 1985-2000" #define COPYRIGHT_BANNER_B \ " By Stichting Mathematisch Centrum and M. Stephenson." --- 16,22 ---- #define EDITLEVEL 0 #define COPYRIGHT_BANNER_A \ ! "NetHack, Copyright 1985-2002" #define COPYRIGHT_BANNER_B \ " By Stichting Mathematisch Centrum and M. Stephenson." *************** *** 34,44 **** * PP = patch level, ee = edit level, L = literal suffix "L", * with all four numbers specified as two hexadecimal digits. */ ! #define VERSION_COMPATIBILITY 0x03030000L #endif /*****************************************************************************/ ! /* Version 3.3.1 */ /* Patch 1, August 9, 2000 * Many, many general fixes, including a number for riding, twoweapon, --- 34,74 ---- * PP = patch level, ee = edit level, L = literal suffix "L", * with all four numbers specified as two hexadecimal digits. */ ! #define VERSION_COMPATIBILITY 0x03030100L #endif /*****************************************************************************/ ! /* Version 3.4.0 */ ! ! /* ! * NetHack 3.4.0, March 20, 2002 ! * ! * Hundreds of general bug fixes including some for sliming, zapping, conduct, ! * and several more for riding ! * Eliminated a few potentially fatal bugs including one for stone-to-flesh, ! * trouble-fixing during prayer, riding down stairs while punished, ! * polyd player demon summoning, throwing digging tools into shops, and ! * a couple from having the vision system enabled at inappropriate times ! * Corrected some incorrect calculations in final scoring ! * Enhanced config file processing and alert to duplication of entries ! * Player selection prompt enhancements for TTY and X11 ! * Objects merge in containers ! * Wish for "nothing", and genocide "none" to preserve your conduct ! * Changes to Wizard quest ! * Added the travel command which works by mouse click or '_' command ! * Config file BOULDER option to specify the symbol for displaying boulders ! * Incorporate modified versions of several 3.3.1 patches that have been ! * in circulation in the NetHack community ! * New Gnomish Mines levels (courtesy Kelly Bailey) ! * Mac: command-key shortcuts in the player selection dialog ! * Amiga: screenmode requester, and several amiga specific bug fixes ! * Win32 graphical port contributed by Alex Kompel is now included ! */ ! ! /* Version 3.4 */ ! ! /*****************************************************************************/ ! /* Version 3.3.x */ /* Patch 1, August 9, 2000 * Many, many general fixes, including a number for riding, twoweapon, *************** *** 75,84 **** * updated COPYRIGHT_BANNER_A to reflect year of release. * Dozens of other bug fixes, and minor improvements. */ /* Version 3.3 */ /*****************************************************************************/ ! /* Version 3.2.3 */ /* Patch 3, December 10, 1999 * Released simultaneously with 3.3.0 for the benefit of --- 105,115 ---- * updated COPYRIGHT_BANNER_A to reflect year of release. * Dozens of other bug fixes, and minor improvements. */ + /* Version 3.3 */ /*****************************************************************************/ ! /* Version 3.2.x */ /* Patch 3, December 10, 1999 * Released simultaneously with 3.3.0 for the benefit of *** nethack-3.3.1/include/pcconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/pcconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pcconf.h 3.3 95/10/11 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pcconf.h 3.4 1995/10/11 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 17,23 **** * _MSC_VER is defined automatically by Microsoft C. * __BORLANDC__ is defined automatically by Borland C. * __SC__ is defined automatically by Symantec C. ! * Note: 3.3.0 was not verified with Symantec C. */ /* --- 17,23 ---- * _MSC_VER is defined automatically by Microsoft C. * __BORLANDC__ is defined automatically by Borland C. * __SC__ is defined automatically by Symantec C. ! * Note: 3.4.0 was not verified with Symantec C. */ /* *************** *** 29,35 **** * For pre-V7.0 Microsoft Compilers only, manually define OVERLAY here. */ ! /*#define OVERLAY /* Manual overlay definition (MSC 6.0ax only) */ # ifndef __GO32__ #define MFLOPPY /* Support for floppy drives and ramdisks by dgk */ --- 29,35 ---- * For pre-V7.0 Microsoft Compilers only, manually define OVERLAY here. */ ! /*#define OVERLAY */ /* Manual overlay definition (MSC 6.0ax only) */ # ifndef __GO32__ #define MFLOPPY /* Support for floppy drives and ramdisks by dgk */ *************** *** 51,73 **** * or NO_TERMS */ ! /* # define TERMLIB /* enable use of termcap file /etc/termcap */ /* or ./termcap for MSDOS (SAC) */ /* compile and link in Fred Fish's termcap library, */ /* enclosed in TERMCAP.ARC, to use this */ ! /* # define ANSI_DEFAULT /* allows NetHack to run without a ./termcap */ # define NO_TERMS /* Allows Nethack to run without ansi.sys by linking */ /* screen routines into the .exe */ # ifdef NO_TERMS /* if NO_TERMS select one screen package below */ #define SCREEN_BIOS /* Use bios calls for all screen control */ ! /* #define SCREEN_DJGPPFAST /* Use djgpp fast screen routines */ # endif ! /* # define PC9800 /* Allows NetHack to run on NEC PC-9800 machines */ /* Yamamoto Keizo */ --- 51,73 ---- * or NO_TERMS */ ! /* # define TERMLIB */ /* enable use of termcap file /etc/termcap */ /* or ./termcap for MSDOS (SAC) */ /* compile and link in Fred Fish's termcap library, */ /* enclosed in TERMCAP.ARC, to use this */ ! /* # define ANSI_DEFAULT */ /* allows NetHack to run without a ./termcap */ # define NO_TERMS /* Allows Nethack to run without ansi.sys by linking */ /* screen routines into the .exe */ # ifdef NO_TERMS /* if NO_TERMS select one screen package below */ #define SCREEN_BIOS /* Use bios calls for all screen control */ ! /* #define SCREEN_DJGPPFAST */ /* Use djgpp fast screen routines */ # endif ! /* # define PC9800 */ /* Allows NetHack to run on NEC PC-9800 machines */ /* Yamamoto Keizo */ *************** *** 99,105 **** /* amiconf.h). In the future this will be the */ /* hook for mail reader implementation. */ ! /*# define PC_LOCKING /* Allow confirmation before overwriting game */ /* that is in progress or aborted when another */ /* game is started with the same player name. */ --- 99,105 ---- /* amiconf.h). In the future this will be the */ /* hook for mail reader implementation. */ ! /*# define PC_LOCKING */ /* Allow confirmation before overwriting game */ /* that is in progress or aborted when another */ /* game is started with the same player name. */ *************** *** 139,144 **** --- 139,148 ---- # ifdef PCMUSIC #define TIMED_DELAY /* need it anyway */ # endif + #define NOCWD_ASSUMPTIONS /* Allow paths to be specified for HACKDIR, + LEVELDIR, SAVEDIR, BONESDIR, DATADIR, + SCOREDIR, LOCKDIR, and CONFIGDIR */ + #endif /* MSDOS configuration stuff */ #define PATHLEN 64 /* maximum pathlength */ *************** *** 146,151 **** --- 150,156 ---- #ifndef MICRO_H #include "micro.h" /* contains necessary externs for [os_name].c */ #endif + /* =================================================== * The remaining code shouldn't need modification. *** nethack-3.3.1/include/permonst.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/permonst.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)permonst.h 3.3 99/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)permonst.h 3.4 1999/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/prop.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/prop.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)prop.h 3.3 1999/07/07 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)prop.h 3.4 1999/07/07 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/qtext.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/qtext.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)qtext.h 3.3 97/02/02 */ /* Copyright (c) Mike Stephenson 1991. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)qtext.h 3.4 1997/02/02 */ /* Copyright (c) Mike Stephenson 1991. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 59,78 **** #define QT_NEXTTIME 2 #define QT_OTHERTIME 3 ! #define QT_GUARDTALK 5 /* 5 random things for guards to say */ ! #define QT_FIRSTLEADER 10 ! #define QT_NEXTLEADER 11 ! #define QT_OTHERLEADER 12 ! #define QT_LASTLEADER 13 ! #define QT_BADLEVEL 14 ! #define QT_BADALIGN 15 ! #define QT_ASSIGNQUEST 16 ! #define QT_ENCOURAGE 20 /* 1-10 random encouragement messages */ ! #define QT_FIRSTLOCATE 30 ! #define QT_NEXTLOCATE 31 #define QT_FIRSTGOAL 40 #define QT_NEXTGOAL 41 --- 59,79 ---- #define QT_NEXTTIME 2 #define QT_OTHERTIME 3 ! #define QT_GUARDTALK 5 /* 5 random things guards say before quest */ ! #define QT_GUARDTALK2 10 /* 5 random things guards say after quest */ ! #define QT_FIRSTLEADER 15 ! #define QT_NEXTLEADER 16 ! #define QT_OTHERLEADER 17 ! #define QT_LASTLEADER 18 ! #define QT_BADLEVEL 19 ! #define QT_BADALIGN 20 ! #define QT_ASSIGNQUEST 21 ! #define QT_ENCOURAGE 25 /* 1-10 random encouragement messages */ ! #define QT_FIRSTLOCATE 35 ! #define QT_NEXTLOCATE 36 #define QT_FIRSTGOAL 40 #define QT_NEXTGOAL 41 *** nethack-3.3.1/include/qt_clust.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/qt_clust.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)qt_clust.h 3.3 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)qt_clust.h 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/qt_kde0.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/qt_kde0.h Thu Mar 21 07:37:36 2002 *************** *** 1,10 **** ! /* SCCS Id: @(#)qt_kde0.h 3.3 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef QT_DUMMYKDE #define QT_DUMMYKDE ! class KTopLevelWidget : public QWidget { Q_OBJECT }; #endif --- 1,10 ---- ! /* SCCS Id: @(#)qt_kde0.h 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef QT_DUMMYKDE #define QT_DUMMYKDE ! class KTopLevelWidget : public QMainWindow { Q_OBJECT }; #endif *** nethack-3.3.1/include/qt_win.h Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/include/qt_win.h Thu Mar 21 07:37:36 2002 *************** *** 1,8 **** ! // SCCS Id: @(#)qt_win.h 3.3 1999/11/19 // Copyright (c) Warwick Allison, 1999. // NetHack may be freely redistributed. See license for details. // ! // Qt Binding for NetHack 3.3 // // Unfortunately, this doesn't use Qt as well as I would like, // primarily because NetHack is fundamentally a getkey-type --- 1,8 ---- ! // SCCS Id: @(#)qt_win.h 3.4 1999/11/19 // Copyright (c) Warwick Allison, 1999. // NetHack may be freely redistributed. See license for details. // ! // Qt Binding for NetHack 3.4 // // Unfortunately, this doesn't use Qt as well as I would like, // primarily because NetHack is fundamentally a getkey-type *************** *** 21,27 **** --- 21,31 ---- #include #include #include + #if defined(QWS) + #include + #else #include + #endif #include #include #include *************** *** 32,38 **** --- 36,50 ---- #include #include #include + #if QT_VERSION >= 300 + #include + // Should stop using QTableView + #define QTableView QtTableView + #else #include + #endif + #include + #include #ifdef KDE #include *************** *** 103,108 **** --- 115,121 ---- bool Full() const; void Put(int k, int ascii, int state); + void Put(char a); void Put(const char* str); int GetKey(); int GetAscii(); *************** *** 144,149 **** --- 157,168 ---- }; + class NetHackQtSavedGameSelector : public QDialog { + public: + NetHackQtSavedGameSelector(const char** saved); + + int choose(); + }; class NetHackQtPlayerSelector : private QDialog { Q_OBJECT *************** *** 175,180 **** --- 194,200 ---- NhPSListView* race; QRadioButton **gender; QRadioButton **alignment; + bool fully_specified_role; }; class NetHackQtStringRequestor : QDialog { *************** *** 268,273 **** --- 288,295 ---- QPixmap pet_annotation; Clusterizer change; QFont *rogue_font; + QString messages; + QRect messages_rect; void Changed(int x,int y); *************** *** 276,281 **** --- 298,304 ---- private slots: void updateTiles(); + void moveMessages(int x, int y); protected: virtual void paintEvent(QPaintEvent*); *************** *** 296,301 **** --- 319,329 ---- virtual void PrintGlyph(int x,int y,int glyph); void Scroll(int dx, int dy); + + // For messages + void displayMessages(bool block); + void putMessage(int attr, const char* text); + void clearMessages(); }; class NetHackQtScrollText; *************** *** 312,320 **** --- 340,351 ---- void Scroll(int dx, int dy); + void setMap(NetHackQtMapWindow*); + private: NetHackQtScrollText* list; bool changed; + NetHackQtMapWindow* map; private slots: void updateFont(); *************** *** 558,563 **** --- 589,595 ---- protected: virtual void paintEvent(QPaintEvent* event); + QSize sizeHint() const; }; *************** *** 580,586 **** protected: virtual void done(int); - virtual void resizeEvent(QResizeEvent*); virtual void keyPressEvent(QKeyEvent*); private slots: --- 612,617 ---- *************** *** 673,678 **** --- 704,710 ---- public slots: void doMenuItem(int); + void doKeys(const QString&); protected: virtual void resizeEvent(QResizeEvent*); *************** *** 681,686 **** --- 713,721 ---- private slots: void layout(); + void raiseMap(); + void raiseMessages(); + void raiseStatus(); private: void ShowIfReady(); *************** *** 693,706 **** NetHackQtMessageWindow* message; NetHackQtMapWindow* map; NetHackQtStatusWindow* status; ! NetHackQtInvUsageWindow invusage; NetHackQtKeyBuffer& keysink; const char* *macro; }; class NetHackQtYnDialog : QDialog { private: const char* question; const char* choices; --- 728,743 ---- NetHackQtMessageWindow* message; NetHackQtMapWindow* map; NetHackQtStatusWindow* status; ! NetHackQtInvUsageWindow* invusage; NetHackQtKeyBuffer& keysink; + QWidgetStack* stack; const char* *macro; }; class NetHackQtYnDialog : QDialog { + Q_OBJECT private: const char* question; const char* choices; *************** *** 711,716 **** --- 748,756 ---- virtual void keyPressEvent(QKeyEvent*); virtual void done(int); + private slots: + void doneItem(int); + public: NetHackQtYnDialog(NetHackQtKeyBuffer& keysource,const char*,const char*,char); *************** *** 719,724 **** --- 759,766 ---- #ifdef KDE #define NetHackQtBindBase KApplication + #elif defined(QWS) + #define NetHackQtBindBase QPEApplication #else #define NetHackQtBindBase QApplication #endif *************** *** 733,738 **** --- 775,781 ---- static NetHackQtKeyBuffer keybuffer; static NetHackQtClickBuffer clickbuffer; + static QWidget* splash; static NetHackQtMainWindow* main; public: *** nethack-3.3.1/include/qt_xpms.h Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/include/qt_xpms.h Thu Mar 21 07:37:36 2002 *************** *** 932,937 **** --- 932,950 ---- ".... ..." }; /* XPM */ + static const char *pet_mark_small_xpm[] = { + /* width height ncolors chars_per_pixel */ + "5 5 2 1", + /* colors */ + ". c None", + "X c #FF0000", + /* pixels */ + ".X.X.", + "XXXXX", + ".XXX.", + "..X.." + }; + /* XPM */ static const char *satiated_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 23 1", *** nethack-3.3.1/include/quest.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/quest.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)quest.h 3.3 92/11/15 */ /* Copyright (c) Mike Stephenson 1991. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)quest.h 3.4 1992/11/15 */ /* Copyright (c) Mike Stephenson 1991. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 25,30 **** --- 25,35 ---- Bitfield(touched_artifact,1); /* for a special message */ Bitfield(offered_artifact,1); /* offered to leader */ Bitfield(got_thanks,1); /* final message from leader */ + + /* keep track of leader presence/absence even if leader is + polymorphed, raised from dead, etc */ + Bitfield(leader_is_dead,1); + unsigned leader_m_id; }; #define MAX_QUEST_TRIES 7 /* exceed this and you "fail" */ *** nethack-3.3.1/include/rect.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/rect.h Thu Mar 21 07:37:36 2002 *************** *** 1,11 **** ! /* SCCS Id: @(#)rect.h 3.3 90/02/22 */ /* Copyright (c) 1990 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #ifndef RECT_H #define RECT_H ! typedef struct { xchar lx, ly; xchar hx, hy; } NhRect; --- 1,11 ---- ! /* SCCS Id: @(#)rect.h 3.4 1990/02/22 */ /* Copyright (c) 1990 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #ifndef RECT_H #define RECT_H ! typedef struct nhrect { xchar lx, ly; xchar hx, hy; } NhRect; *** nethack-3.3.1/include/region.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/region.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)region.h 3.3 96/06/17 */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)region.h 3.4 1996/06/17 */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/rm.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/rm.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)rm.h 3.3 1999/12/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)rm.h 3.4 1999/12/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 213,218 **** --- 213,219 ---- #define MAXDCHARS 41 /* maximum of mapped dungeon characters */ #define MAXTCHARS 22 /* maximum of mapped trap characters */ #define MAXECHARS 29 /* maximum of mapped effects characters */ + #define MAXEXPCHARS 9 /* number of explosion characters */ struct symdef { uchar sym; *************** *** 425,430 **** --- 426,432 ---- #define icedpool flags #define blessedftn horizontal /* a fountain that grants attribs */ + #define disturbed horizontal /* a grave that has been disturbed */ struct damage { struct damage *next; *** nethack-3.3.1/include/skills.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/skills.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)skills.h 3.3 1999/10/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985-1999. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)skills.h 3.4 1999/10/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985-1999. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/spell.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/spell.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)spell.h 3.3 95/06/01 */ /* Copyright 1986, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)spell.h 3.4 1995/06/01 */ /* Copyright 1986, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/sp_lev.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/sp_lev.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)sp_lev.h 3.3 96/05/08 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)sp_lev.h 3.4 1996/05/08 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/system.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/system.h Thu Mar 21 07:37:36 2002 *************** *** 1,11 **** ! /* SCCS Id: @(#)system.h 3.3 99/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef SYSTEM_H #define SYSTEM_H ! #ifndef __GO32__ /* djgpp compiler for msdos */ #define E extern --- 1,11 ---- ! /* SCCS Id: @(#)system.h 3.4 2001/12/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef SYSTEM_H #define SYSTEM_H ! #if !defined(__cplusplus) && !defined(__GO32__) #define E extern *************** *** 24,30 **** --- 24,32 ---- # if !defined(_SIZE_T) && !defined(__size_t) /* __size_t for CSet/2 */ # define _SIZE_T # if !((defined(MSDOS) || defined(OS2)) && defined(_SIZE_T_DEFINED)) /* MSC 5.1 */ + # if !(defined(__GNUC__) && defined(AMIGA)) typedef unsigned int size_t; + # endif # endif # endif #endif /* MICRO && !TOS */ *************** *** 44,50 **** typedef long off_t; #endif ! #endif /* __GO32__ */ /* You may want to change this to fit your system, as this is almost * impossible to get right automatically. --- 46,52 ---- typedef long off_t; #endif ! #endif /* !__cplusplus && !__GO32__ */ /* You may want to change this to fit your system, as this is almost * impossible to get right automatically. *************** *** 68,74 **** # define SIG_RET_TYPE int (*)() #endif ! #ifndef __GO32__ #if defined(BSD) || defined(ULTRIX) || defined(RANDOM) # ifdef random --- 70,76 ---- # define SIG_RET_TYPE int (*)() #endif ! #if !defined(__cplusplus) && !defined(__GO32__) #if defined(BSD) || defined(ULTRIX) || defined(RANDOM) # ifdef random *************** *** 116,122 **** # endif # endif #if !defined(__SASC_60) && !defined(_DCC) && !defined(__SC__) ! # if defined(AMIGA) && !defined(AZTEC_50) E int FDECL(perror, (const char *)); # else # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) --- 118,124 ---- # endif # endif #if !defined(__SASC_60) && !defined(_DCC) && !defined(__SC__) ! # if defined(AMIGA) && !defined(AZTEC_50) && !defined(__GNUC__) E int FDECL(perror, (const char *)); # else # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) *************** *** 247,253 **** E int FDECL(atoi, (const char *)); E int FDECL(chdir, (const char *)); E int FDECL(chown, (const char *,unsigned,unsigned)); ! # ifndef __DECC_VER /* suppress for recent DEC C */ E int FDECL(chmod, (const char *,int)); E int FDECL(umask, (int)); # endif --- 249,258 ---- E int FDECL(atoi, (const char *)); E int FDECL(chdir, (const char *)); E int FDECL(chown, (const char *,unsigned,unsigned)); ! # ifdef __DECC_VER ! E int FDECL(chmod, (const char *,mode_t)); ! E mode_t FDECL(umask, (mode_t)); ! # else E int FDECL(chmod, (const char *,int)); E int FDECL(umask, (int)); # endif *************** *** 361,367 **** E pid_t NDECL(getpid); E uid_t NDECL(getuid); E gid_t NDECL(getgid); ! # else # ifndef getpid /* Borland C defines getpid() as a macro */ E int NDECL(getpid); # endif --- 366,375 ---- E pid_t NDECL(getpid); E uid_t NDECL(getuid); E gid_t NDECL(getgid); ! # ifdef VMS ! E pid_t NDECL(getppid); ! # endif ! # else /*!POSIX_TYPES*/ # ifndef getpid /* Borland C defines getpid() as a macro */ E int NDECL(getpid); # endif *************** *** 370,383 **** E unsigned NDECL(getuid); E unsigned NDECL(getgid); # endif ! # endif ! # if defined(ULTRIX) && !defined(_UNISTD_H_) E unsigned NDECL(getuid); E unsigned NDECL(getgid); E int FDECL(setgid, (int)); E int FDECL(setuid, (int)); ! # endif ! #endif /* add more architectures as needed */ #if defined(HPUX) --- 378,391 ---- E unsigned NDECL(getuid); E unsigned NDECL(getgid); # endif ! # if defined(ULTRIX) && !defined(_UNISTD_H_) E unsigned NDECL(getuid); E unsigned NDECL(getgid); E int FDECL(setgid, (int)); E int FDECL(setuid, (int)); ! # endif ! # endif /*?POSIX_TYPES*/ ! #endif /*?(HPUX && !_POSIX_SOURCE)*/ /* add more architectures as needed */ #if defined(HPUX) *************** *** 538,543 **** #undef E ! #endif /* __GO32__ */ #endif /* SYSTEM_H */ --- 546,551 ---- #undef E ! #endif /* !__cplusplus && !__GO32__ */ #endif /* SYSTEM_H */ *** nethack-3.3.1/include/tcap.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/tcap.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tcap.h 3.3 92/10/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)tcap.h 3.4 1992/10/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/tile2x11.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/tile2x11.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tile2x11.h 3.3 95/01/25 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef TILE2X11_H --- 1,4 ---- ! /* SCCS Id: @(#)tile2x11.h 3.4 1995/01/25 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef TILE2X11_H *************** *** 13,18 **** --- 13,22 ---- unsigned long tile_width; unsigned long tile_height; unsigned long ntiles; + unsigned long per_row; } x11_header; + + /* how wide each row in the tile file is, in tiles */ + #define TILES_PER_ROW (40) #endif /* TILE2X11_H */ *** nethack-3.3.1/include/timeout.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/timeout.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)timeout.h 3.3 1999/02/13 */ /* Copyright 1994, Dean Luick */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)timeout.h 3.4 1999/02/13 */ /* Copyright 1994, Dean Luick */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 29,33 **** --- 29,44 ---- #define HATCH_EGG 4 #define FIG_TRANSFORM 5 #define NUM_TIME_FUNCS 6 + + /* used in timeout.c */ + typedef struct fe { + struct fe *next; /* next item in chain */ + long timeout; /* when we time out */ + unsigned long tid; /* timer ID */ + short kind; /* kind of use */ + short func_index; /* what to call when we time out */ + genericptr_t arg; /* pointer to timeout argument */ + Bitfield (needs_fixup,1); /* does arg need to be patched? */ + } timer_element; #endif /* TIMEOUT_H */ *** nethack-3.3.1/include/tradstdc.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/tradstdc.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tradstdc.h 3.3 93/05/30 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)tradstdc.h 3.4 1993/05/30 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 167,173 **** # define FDECL(f,p) f() # define VDECL(f,p) f() ! # if defined(AMIGA) || defined(HPUX) || defined(POSIX_TYPES) || defined(__DECC) # define genericptr void * # endif # ifndef genericptr --- 167,173 ---- # define FDECL(f,p) f() # define VDECL(f,p) f() ! # if defined(AMIGA) || defined(HPUX) || defined(POSIX_TYPES) || defined(__DECC) || defined(__BORLANDC__) # define genericptr void * # endif # ifndef genericptr *************** *** 203,209 **** #if defined(AMIGA) && !defined(AZTEC_50) #define UNWIDENED_PROTOTYPES #endif ! #if defined(applec) #define UNWIDENED_PROTOTYPES #endif #if defined(__MWERKS__) && defined(__BEOS__) --- 203,209 ---- #if defined(AMIGA) && !defined(AZTEC_50) #define UNWIDENED_PROTOTYPES #endif ! #if defined(macintosh) && (defined(__SC__) || defined(__MRC__)) #define UNWIDENED_PROTOTYPES #endif #if defined(__MWERKS__) && defined(__BEOS__) *** nethack-3.3.1/include/trampoli.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/trampoli.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)trampoli.h 3.3 95/06/01 */ /* Copyright (c) 1989, by Norm Meluch and Stephen Spackman */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)trampoli.h 3.4 1995/06/01 */ /* Copyright (c) 1989, by Norm Meluch and Stephen Spackman */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/trap.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/trap.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)trap.h 3.3 92/09/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)trap.h 3.4 2000/08/30 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 7,12 **** --- 7,17 ---- #ifndef TRAP_H #define TRAP_H + union vlaunchinfo { + short v_launch_otyp; /* type of object to be triggered */ + coord v_launch2; /* secondary launch point (for boulders) */ + }; + struct trap { struct trap *ntrap; xchar tx,ty; *************** *** 22,33 **** when you untrap a monster. It would be too easy to make a monster peaceful if you could set a trap for it and then untrap it. */ ! union { ! short v_launch_otyp; /* type of object to be triggered */ ! coord v_launch2; /* secondary launch point (for boulders) */ ! } v; ! #define launch_otyp v.v_launch_otyp ! #define launch2 v.v_launch2 }; extern struct trap *ftrap; --- 27,35 ---- when you untrap a monster. It would be too easy to make a monster peaceful if you could set a trap for it and then untrap it. */ ! union vlaunchinfo vl; ! #define launch_otyp vl.v_launch_otyp ! #define launch2 vl.v_launch2 }; extern struct trap *ftrap; *** nethack-3.3.1/include/unixconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/unixconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)unixconf.h 3.3 99/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)unixconf.h 3.4 1999/07/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 80,86 **** /* #define RANDOM */ /* if neither random/srandom nor lrand48/srand48 is available from your system */ ! /* see sys/unix/snd86.shr for more information on these */ /* #define UNIX386MUSIC */ /* play real music through speaker on systems with music driver installed */ /* #define VPIX_MUSIC */ /* play real music through speaker on systems --- 80,86 ---- /* #define RANDOM */ /* if neither random/srandom nor lrand48/srand48 is available from your system */ ! /* see sys/unix/snd86unx.shr for more information on these */ /* #define UNIX386MUSIC */ /* play real music through speaker on systems with music driver installed */ /* #define VPIX_MUSIC */ /* play real music through speaker on systems *************** *** 174,180 **** #define DEF_MAILREADER "/usr/ucb/Mail" # endif #else ! # if defined(SYSV) || defined(DGUX) || defined(HPUX) # if defined(M_XENIX) || defined(__FreeBSD__) #define DEF_MAILREADER "/usr/bin/mail" # else --- 174,180 ---- #define DEF_MAILREADER "/usr/ucb/Mail" # endif #else ! # if (defined(SYSV) || defined(DGUX) || defined(HPUX)) && !defined(LINUX) # if defined(M_XENIX) || defined(__FreeBSD__) #define DEF_MAILREADER "/usr/bin/mail" # else *************** *** 297,310 **** #endif /* Use the high quality random number routines. */ ! #if defined(BSD) || defined(ULTRIX) || defined(CYGWIN32) || defined(RANDOM) #define Rand() random() #else #define Rand() lrand48() #endif #ifdef TIMED_DELAY ! # if defined(SUNOS4) || defined(LINUX) # define msleep(k) usleep((k)*1000) # endif # ifdef ULTRIX --- 297,310 ---- #endif /* Use the high quality random number routines. */ ! #if defined(BSD) || defined(ULTRIX) || defined(CYGWIN32) || defined(RANDOM) || defined(__APPLE__) #define Rand() random() #else #define Rand() lrand48() #endif #ifdef TIMED_DELAY ! # if defined(SUNOS4) || defined(LINUX) || (defined(BSD) && !defined(ULTRIX)) # define msleep(k) usleep((k)*1000) # endif # ifdef ULTRIX *************** *** 319,324 **** --- 319,347 ---- # define __HC__ hc # undef hc #endif + + #if defined(GNOME_GRAPHICS) + #if defined(LINUX) + # include + # if defined(__NR_getresuid) && defined(__NR_getresgid) /* ie., >= v2.1.44 */ + # define GETRES_SUPPORT + # endif + #else + # if defined(BSD) || defined(SVR4) + /* + * [ALI] We assume that SVR4 means we can safely include syscall.h + * (although it's really a BSDism). This is certainly true for Solaris 2.5, + * Solaris 7, Solaris 8 and Compaq Tru64 5.1 + * Later BSD systems will have the getresid system calls. + */ + # include + # if (defined (SYS_getuid) || defined(SYS_getresuid)) && \ + (defined(SYS_getgid) || defined(SYS_getresgid)) + # define GETRES_SUPPORT + # endif + # endif /* BSD || SVR4 */ + #endif /* LINUX */ + #endif /* GNOME_GRAPHICS */ #endif /* UNIXCONF_H */ #endif /* UNIX */ *** nethack-3.3.1/include/vault.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/vault.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vault.h 3.3 97/05/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vault.h 3.4 1997/05/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/vision.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/vision.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vision.h 3.3 95/01/26 */ /* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vision.h 3.4 1995/01/26 */ /* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/vmsconf.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/vmsconf.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vmsconf.h 3.3 98/07/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vmsconf.h 3.4 2001/12/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 189,194 **** --- 189,198 ---- # ifndef __GID_T # define __GID_T typedef __gid_t gid_t; + # endif + # ifndef __MODE_T + # define __MODE_T + typedef __mode_t mode_t; # endif #endif /* _DECC_V4_SOURCE */ *** nethack-3.3.1/include/winami.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/winami.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winami.h 3.3 93/01/17 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991. */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winami.h 3.4 1993/01/17 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991. */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/wingem.h Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/include/wingem.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wingem.h 3.3 1999/12/10 */ /* Copyright (c) Christian Bressler, 1999 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wingem.h 3.4 1999/12/10 */ /* Copyright (c) Christian Bressler, 1999 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/winGnome.h Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/include/winGnome.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winGnome.h 3.3. 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winGnome.h 3.4. 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/winprocs.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/winprocs.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winprocs.h 3.3 96/02/18 */ /* Copyright (c) David Cohrs, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winprocs.h 3.4 1996/02/18 */ /* Copyright (c) David Cohrs, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 7,12 **** --- 7,13 ---- struct window_procs { const char *name; + unsigned long wincap; /* window port capability options supported */ void FDECL((*win_init_nhwindows), (int *, char **)); void NDECL((*win_player_selection)); void NDECL((*win_askname)); *************** *** 62,67 **** --- 63,69 ---- void NDECL((*win_end_screen)); void FDECL((*win_outrip), (winid,int)); + void FDECL((*win_preference_update), (const char *)); }; extern NEARDATA struct window_procs windowprocs; *************** *** 125,128 **** #define end_screen (*windowprocs.win_end_screen) #define outrip (*windowprocs.win_outrip) ! #endif --- 127,208 ---- #define end_screen (*windowprocs.win_end_screen) #define outrip (*windowprocs.win_outrip) ! #define preference_update (*windowprocs.win_preference_update) ! ! /* ! * WINCAP ! * Window port preference capability bits. ! * Some day this might be better in its own wincap.h file. ! */ ! #define WC_COLOR 0x01L /* 01 Port can display things in color */ ! #define WC_HILITE_PET 0x02L /* 02 supports hilite pet */ ! #define WC_ASCII_MAP 0x04L /* 03 supports an ascii map */ ! #define WC_TILED_MAP 0x08L /* 04 supports a tiled map */ ! #define WC_PRELOAD_TILES 0x10L /* 05 supports pre-loading tiles */ ! #define WC_TILE_WIDTH 0x20L /* 06 prefer this width of tile */ ! #define WC_TILE_HEIGHT 0x40L /* 07 prefer this height of tile */ ! #define WC_TILE_FILE 0x80L /* 08 alternative tile file name */ ! #define WC_INVERSE 0x100L /* 09 Port supports inverse video */ ! #define WC_ALIGN_MESSAGE 0x200L /* 10 supports message alignmt top|b|l|r */ ! #define WC_ALIGN_STATUS 0x400L /* 11 supports status alignmt top|b|l|r */ ! #define WC_VARY_MSGCOUNT 0x800L /* 12 supports varying message window */ ! #define WC_FONT_MAP 0x1000L /* 13 supports specification of map win font */ ! #define WC_FONT_MESSAGE 0x2000L /* 14 supports specification of msg win font */ ! #define WC_FONT_STATUS 0x4000L /* 15 supports specification of sts win font */ ! #define WC_FONT_MENU 0x8000L /* 16 supports specification of mnu win font */ ! #define WC_FONT_TEXT 0x10000L /* 17 supports specification of txt win font */ ! #define WC_FONTSIZ_MAP 0x20000L /* 18 supports specification of map win font */ ! #define WC_FONTSIZ_MESSAGE 0x40000L /* 19 supports specification of msg win font */ ! #define WC_FONTSIZ_STATUS 0x80000L /* 20 supports specification of sts win font */ ! #define WC_FONTSIZ_MENU 0x100000L /* 21 supports specification of mnu win font */ ! #define WC_FONTSIZ_TEXT 0x200000L /* 22 supports specification of txt win font */ ! #define WC_SCROLL_MARGIN 0x400000L /* 23 supports setting scroll margin for map */ ! #define WC_SPLASH_SCREEN 0x800000L /* 24 supports setting scroll margin for map */ ! #define WC_POPUP_DIALOG 0x1000000L /* 25 supports queries in pop dialogs */ ! #define WC_LARGE_FONT 0x2000000L /* 26 Port supports large font */ ! #define WC_EIGHT_BIT_IN 0x4000000L /* 27 8-bit character input */ ! #define WC_PERM_INVENT 0x8000000L /* 28 8-bit character input */ ! #define WC_MAP_MODE 0x10000000L /* 29 map_mode option */ ! #define WC_WINDOWCOLORS 0x20000000L /* 30 background color for message window */ ! #define WC_PLAYER_SELECTION 0x40000000L /* 31 background color for message window */ ! /* 1 free bit */ ! ! #define ALIGN_LEFT 1 ! #define ALIGN_RIGHT 2 ! #define ALIGN_TOP 3 ! #define ALIGN_BOTTOM 4 ! ! /* player_selection */ ! #define VIA_DIALOG 0 ! #define VIA_PROMPTS 1 ! ! /* map_mode settings - deprecated */ ! #define MAP_MODE_TILES 0 ! #define MAP_MODE_ASCII4x6 1 ! #define MAP_MODE_ASCII6x8 2 ! #define MAP_MODE_ASCII8x8 3 ! #define MAP_MODE_ASCII16x8 4 ! #define MAP_MODE_ASCII7x12 5 ! #define MAP_MODE_ASCII8x12 6 ! #define MAP_MODE_ASCII16x12 7 ! #define MAP_MODE_ASCII12x16 8 ! #define MAP_MODE_ASCII10x18 9 ! #define MAP_MODE_ASCII_FIT_TO_SCREEN 10 ! #define MAP_MODE_TILES_FIT_TO_SCREEN 11 ! ! #if 0 ! #define WC_SND_SOUND 0x01L /* 01 Port has some sound capabilities */ ! #define WC_SND_SPEAKER 0x02L /* 02 Sound supported via built-in speaker */ ! #define WC_SND_STEREO 0x04L /* 03 Stereo sound supported */ ! #define WC_SND_RAW 0x08L /* 04 Raw sound supported */ ! #define WC_SND_WAVE 0x10L /* 05 Wave support */ ! #define WC_SND_MIDI 0x20L /* 06 Midi support */ ! /* 26 free bits */ ! #endif ! ! struct wc_Opt { ! char *wc_name; ! unsigned long wc_bit; ! }; ! ! #endif /* WINPROCS_H */ *** nethack-3.3.1/include/wintty.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/wintty.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wintty.h 3.3 96/02/18 */ /* Copyright (c) David Cohrs, 1991,1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wintty.h 3.4 1996/02/18 */ /* Copyright (c) David Cohrs, 1991,1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 111,117 **** #endif E void FDECL(xputs, (const char *)); #if defined(SCREEN_VGA) || defined(SCREEN_8514) ! E void FDECL(xputg, (int, int)); #endif E void NDECL(cl_end); E void NDECL(clear_screen); --- 111,117 ---- #endif E void FDECL(xputs, (const char *)); #if defined(SCREEN_VGA) || defined(SCREEN_8514) ! E void FDECL(xputg, (int, int, unsigned)); #endif E void NDECL(cl_end); E void NDECL(clear_screen); *** nethack-3.3.1/include/wintype.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/wintype.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wintype.h 3.3 96/02/18 */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wintype.h 3.4 1996/02/18 */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/winX.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/winX.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winX.h 3.3 96/08/18 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winX.h 3.4 1996/08/18 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 56,61 **** --- 56,63 ---- unsigned short glyphs[ROWNO][COLNO]; /* Saved glyph numbers. */ GC white_gc; GC black_gc; + unsigned long image_width; /* dimensions of tile image */ + unsigned long image_height; }; struct map_info_t { *************** *** 277,282 **** --- 279,285 ---- /* ### winX.c ### */ E struct xwindow *FDECL(find_widget,(Widget)); E Boolean FDECL(nhApproxColor,(Screen*, Colormap, char*, XColor*)); + E Dimension FDECL(nhFontHeight,(Widget)); E char FDECL(key_event_to_char,(XKeyEvent*)); E void FDECL(msgkey, (Widget, XtPointer, XEvent*)); E void FDECL(nh_XtPopup, (Widget, int, Widget)); *** nethack-3.3.1/include/xwindow.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/xwindow.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)xwindow.h 3.3 92/03/07 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)xwindow.h 3.4 1992/03/07 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/xwindowp.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/xwindowp.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)xwindowp.h 3.3 92/03/07 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)xwindowp.h 3.4 1992/03/07 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/include/you.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/you.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)you.h 3.3 2000/05/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)you.h 3.4 2000/05/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 207,212 **** --- 207,218 ---- /* increment to 3 if you allow neuter roles */ extern const struct Gender genders[]; /* table of available genders */ + #define uhe() (genders[flags.female ? 1 : 0].he) + #define uhim() (genders[flags.female ? 1 : 0].him) + #define uhis() (genders[flags.female ? 1 : 0].his) + #define mhe(mtmp) (genders[pronoun_gender(mtmp)].he) + #define mhim(mtmp) (genders[pronoun_gender(mtmp)].him) + #define mhis(mtmp) (genders[pronoun_gender(mtmp)].his) /*** Unified structure specifying alignment information ***/ *************** *** 227,232 **** --- 233,239 ---- xchar ux, uy; schar dx, dy, dz; /* direction of move (or zap or ... ) */ schar di; /* direction of FF */ + xchar tx, ty; /* destination of travel */ xchar ux0, uy0; /* initial position FF */ d_level uz, uz0; /* your level on this and the previous turn */ d_level utolev; /* level monster teleported you to, or uz */ *************** *** 295,301 **** Bitfield(mfemale,1); /* saved human value of flags.female */ Bitfield(uinvulnerable,1); /* you're invulnerable (praying) */ Bitfield(uburied,1); /* you're buried */ ! /* 2 free bits! */ unsigned udg_cnt; /* how long you have been demigod */ struct u_event uevent; /* certain events have happened */ --- 302,309 ---- Bitfield(mfemale,1); /* saved human value of flags.female */ Bitfield(uinvulnerable,1); /* you're invulnerable (praying) */ Bitfield(uburied,1); /* you're buried */ ! Bitfield(uedibility,1); /* blessed food detection; sense unsafe food */ ! /* 1 free bit! */ unsigned udg_cnt; /* how long you have been demigod */ struct u_event uevent; /* certain events have happened */ *************** *** 328,334 **** --- 336,346 ---- int ugangr; /* if the gods are angry at you */ int ugifts; /* number of artifacts bestowed */ int ublessed, ublesscnt; /* blessing/duration from #pray */ + #ifndef GOLDOBJ long ugold, ugold0; + #else + long umoney0; + #endif long uexp, urexp; long ucleansed; /* to record moves when player was cleansed */ long usleep; /* sleeping; monstermove you last started */ *** nethack-3.3.1/include/youprop.h Thu Feb 14 07:59:27 2002 --- nethack-3.4.0/include/youprop.h Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)youprop.h 3.3 99/07/02 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)youprop.h 3.4 1999/07/02 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/src/allmain.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/allmain.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)allmain.c 3.3 2000/05/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)allmain.c 3.4 2002/01/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 138,143 **** --- 138,144 ---- /* once-per-turn things go here */ /********************************/ + if (flags.bypasses) clear_bypasses(); if(Glib) glibr(); nh_timeout(); run_regions(); *************** *** 156,171 **** if (u.uinvulnerable) { /* for the moment at least, you're in tiptop shape */ wtcap = UNENCUMBERED; } else if (Upolyd && u.mh < u.mhmax) { if (u.mh < 1) ! rehumanize(); else if (Regeneration || (wtcap < MOD_ENCUMBER && !(moves%20))) { flags.botl = 1; u.mh++; } } else if (u.uhp < u.uhpmax && ! (wtcap < MOD_ENCUMBER || !flags.mv || Regeneration)) { if (u.ulevel > 9 && !(moves % 3)) { int heal, Con = (int) ACURR(A_CON); --- 157,178 ---- if (u.uinvulnerable) { /* for the moment at least, you're in tiptop shape */ wtcap = UNENCUMBERED; + } else if (Upolyd && youmonst.data->mlet == S_EEL && !is_pool(u.ux,u.uy) && !Is_waterlevel(&u.uz)) { + if (u.mh > 1) { + u.mh--; + flags.botl = 1; + } else if (u.mh < 1) + rehumanize(); } else if (Upolyd && u.mh < u.mhmax) { if (u.mh < 1) ! rehumanize(); else if (Regeneration || (wtcap < MOD_ENCUMBER && !(moves%20))) { flags.botl = 1; u.mh++; } } else if (u.uhp < u.uhpmax && ! (wtcap < MOD_ENCUMBER || !u.umoved || Regeneration)) { if (u.ulevel > 9 && !(moves % 3)) { int heal, Con = (int) ACURR(A_CON); *************** *** 187,193 **** } } ! if (wtcap > MOD_ENCUMBER && flags.mv) { if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) { if (Upolyd && u.mh > 1) { u.mh--; --- 194,201 ---- } } ! /* moving around while encumbered is hard work */ ! if (wtcap > MOD_ENCUMBER && u.umoved) { if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) { if (Upolyd && u.mh > 1) { u.mh--; *************** *** 235,241 **** stop_occupation(); else nomul(0); ! if (change == 1) polyself(); else you_were(); change = 0; } --- 243,249 ---- stop_occupation(); else nomul(0); ! if (change == 1) polyself(FALSE); else you_were(); change = 0; } *************** *** 371,381 **** if (!multi) { /* lookaround may clear multi */ flags.move = 0; continue; } if (flags.mv) { if(multi < COLNO && !--multi) ! flags.mv = flags.run = 0; domove(); } else { --multi; --- 379,390 ---- if (!multi) { /* lookaround may clear multi */ flags.move = 0; + if (flags.time) flags.botl = 1; continue; } if (flags.mv) { if(multi < COLNO && !--multi) ! flags.travel = flags.mv = flags.run = 0; domove(); } else { --multi; *************** *** 406,413 **** stop_occupation() { if(occupation) { ! You("stop %s.", occtxt); occupation = 0; /* fainting stops your occupation, there's no reason to sync. sync_hunger(); */ --- 415,424 ---- stop_occupation() { if(occupation) { ! if (!maybe_finished_meal(TRUE)) ! You("stop %s.", occtxt); occupation = 0; + flags.botl = 1; /* in case u.uhs changed */ /* fainting stops your occupation, there's no reason to sync. sync_hunger(); */ *** nethack-3.3.1/src/alloc.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/alloc.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)alloc.c 3.3 95/10/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)alloc.c 3.4 1995/10/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/src/apply.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/apply.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)apply.c 3.3 2000/07/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)apply.c 3.4 2002/03/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 9,15 **** static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 }; static const char tools_too[] = { ALL_CLASSES, TOOL_CLASS, POTION_CLASS, ! WEAPON_CLASS, WAND_CLASS, 0 }; #ifdef TOURIST STATIC_DCL int FDECL(use_camera, (struct obj *)); --- 9,15 ---- static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 }; static const char tools_too[] = { ALL_CLASSES, TOOL_CLASS, POTION_CLASS, ! WEAPON_CLASS, WAND_CLASS, GEM_CLASS, 0 }; #ifdef TOURIST STATIC_DCL int FDECL(use_camera, (struct obj *)); *************** *** 30,35 **** --- 30,36 ---- STATIC_DCL void FDECL(use_figurine, (struct obj *)); STATIC_DCL void FDECL(use_grease, (struct obj *)); STATIC_DCL void FDECL(use_trap, (struct obj *)); + STATIC_DCL void FDECL(use_stone, (struct obj *)); STATIC_PTR int NDECL(set_trap); /* occupation callback */ STATIC_DCL int FDECL(use_whip, (struct obj *)); STATIC_DCL int FDECL(use_pole, (struct obj *)); *************** *** 37,42 **** --- 38,44 ---- STATIC_DCL int FDECL(do_break_wand, (struct obj *)); STATIC_DCL boolean FDECL(figurine_location_checks, (struct obj *, coord *, BOOLEAN_P)); + STATIC_DCL boolean NDECL(uhave_graystone); #ifdef AMIGA void FDECL( amii_speaker, ( struct obj *, char *, int ) ); *************** *** 61,72 **** pline(nothing_happens); return (1); } obj->spe--; if (obj->cursed && !rn2(2)) { (void) zapyourself(obj, TRUE); } else if (u.uswallow) { You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)), ! is_animal(u.ustuck->data) ? "stomach" : "interior"); } else if (u.dz) { You("take a picture of the %s.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); --- 63,75 ---- pline(nothing_happens); return (1); } + check_unpaid(obj); obj->spe--; if (obj->cursed && !rn2(2)) { (void) zapyourself(obj, TRUE); } else if (u.uswallow) { You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)), ! mbodypart(u.ustuck, STOMACH)); } else if (u.dz) { You("take a picture of the %s.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); *************** *** 275,280 **** --- 278,284 ---- case SCORR: You_hear(hollow_str, "passage"); lev->typ = CORR; + unblock_point(rx,ry); if (Blind) feel_location(rx,ry); else newsym(rx,ry); return res; *************** *** 356,366 **** } void ! m_unleash(mtmp) /* mtmp is about to die, or become untame */ register struct monst *mtmp; { register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) --- 360,377 ---- } void ! m_unleash(mtmp, feedback) /* mtmp is about to die, or become untame */ register struct monst *mtmp; + boolean feedback; { register struct obj *otmp; + if (feedback) { + if (canseemon(mtmp)) + pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp)); + else + Your("leash falls slack."); + } for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) *************** *** 377,383 **** for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == LEASH) otmp->leashmon = 0; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) ! if(mtmp->mtame) mtmp->mleashed = 0; } #define MAXLEASHED 2 --- 388,394 ---- for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == LEASH) otmp->leashmon = 0; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) ! mtmp->mleashed = 0; } #define MAXLEASHED 2 *************** *** 402,407 **** --- 413,425 ---- y = u.uy + u.dy; if((x == u.ux) && (y == u.uy)) { + #ifdef STEED + if (u.usteed && u.dz > 0) { + mtmp = u.usteed; + spotmon = 1; + goto got_target; + } + #endif pline("Leash yourself? Very funny..."); return; } *************** *** 412,417 **** --- 430,438 ---- } spotmon = canspotmon(mtmp); + #ifdef STEED + got_target: + #endif if(!mtmp->mtame) { if(!spotmon) *************** *** 492,497 **** --- 513,522 ---- } } } + #ifdef STEED + /* no pack mules for the Amulet */ + if (u.usteed && mon_has_amulet(u.usteed)) return FALSE; + #endif return(TRUE); } *************** *** 524,530 **** if(um_dist(mtmp->mx, mtmp->my, 5)) { pline("%s leash snaps loose!", s_suffix(Monnam(mtmp))); ! m_unleash(mtmp); } else { if(um_dist(mtmp->mx, mtmp->my, 3)) { You("pull on the leash."); --- 549,555 ---- if(um_dist(mtmp->mx, mtmp->my, 5)) { pline("%s leash snaps loose!", s_suffix(Monnam(mtmp))); ! m_unleash(mtmp, FALSE); } else { if(um_dist(mtmp->mx, mtmp->my, 3)) { You("pull on the leash."); *************** *** 641,647 **** } if(u.uswallow) { if (!Blind) You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)), ! is_animal(u.ustuck->data)? "stomach" : "interior"); return 1; } if(Underwater) { --- 666,672 ---- } if(u.uswallow) { if (!Blind) You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)), ! mbodypart(u.ustuck, STOMACH)); return 1; } if(Underwater) { *************** *** 676,682 **** } else if (mlet == S_VAMPIRE || mlet == S_GHOST) { if (vis) pline ("%s doesn't have a reflection.", Monnam(mtmp)); ! } else if(!mtmp->mcan && mtmp->data == &mons[PM_MEDUSA]) { if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!")) return 1; if (vis) --- 701,708 ---- } else if (mlet == S_VAMPIRE || mlet == S_GHOST) { if (vis) pline ("%s doesn't have a reflection.", Monnam(mtmp)); ! } else if(!mtmp->mcan && !mtmp->minvis && ! mtmp->data == &mons[PM_MEDUSA]) { if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!")) return 1; if (vis) *************** *** 687,695 **** mtmp->data == &mons[PM_FLOATING_EYE]) { int tmp = d((int)mtmp->m_lev, (int)mtmp->data->mattk[0].damd); if (!rn2(4)) tmp = 120; - /* Note: floating eyes cannot use their abilities while invisible, - * but Medusa and umber hulks can. - */ if (vis) pline("%s is frozen by its reflection.", Monnam(mtmp)); else You_hear("%s stop moving.",something); --- 713,718 ---- *************** *** 697,703 **** if ( (int) mtmp->mfrozen + tmp > 127) mtmp->mfrozen = 127; else mtmp->mfrozen += tmp; ! } else if(!mtmp->mcan && mtmp->data == &mons[PM_UMBER_HULK]) { if (vis) pline ("%s confuses itself!", Monnam(mtmp)); mtmp->mconf = 1; --- 720,727 ---- if ( (int) mtmp->mfrozen + tmp > 127) mtmp->mfrozen = 127; else mtmp->mfrozen += tmp; ! } else if(!mtmp->mcan && !mtmp->minvis && ! mtmp->data == &mons[PM_UMBER_HULK]) { if (vis) pline ("%s confuses itself!", Monnam(mtmp)); mtmp->mconf = 1; *************** *** 714,723 **** } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data) && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) { if (vis) ! pline ("%s is frightened by its reflection.", ! Monnam(mtmp)); ! mtmp->mflee = 1; ! mtmp->mfleetim += d(2,4); } else if (!Blind) { if (mtmp->minvis && !See_invisible) ; --- 738,745 ---- } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data) && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) { if (vis) ! pline("%s is frightened by its reflection.", Monnam(mtmp)); ! monflee(mtmp, d(2,4), FALSE, FALSE); } else if (!Blind) { if (mtmp->minvis && !See_invisible) ; *************** *** 727,733 **** Monnam(mtmp)); else pline("%s ignores %s reflection.", ! Monnam(mtmp), his[pronoun_gender(mtmp)]); } return 1; } --- 749,755 ---- Monnam(mtmp)); else pline("%s ignores %s reflection.", ! Monnam(mtmp), mhis(mtmp)); } return 1; } *************** *** 768,779 **** u.ux, u.uy, NO_MINVENT)) != 0) { You("summon %s!", a_monnam(mtmp)); if (!obj_resists(obj, 93, 100)) { ! pline("%s has shattered!", The(xname(obj))); useup(obj); } else switch (rn2(3)) { default: break; ! case 1: mon_adjust_speed(mtmp, 2); break; case 2: /* no explanation; it just happens... */ nomovemsg = ""; --- 790,802 ---- u.ux, u.uy, NO_MINVENT)) != 0) { You("summon %s!", a_monnam(mtmp)); if (!obj_resists(obj, 93, 100)) { ! pline("%s shattered!", Tobjnam(obj, "have")); useup(obj); } else switch (rn2(3)) { default: break; ! case 1: ! mon_adjust_speed(mtmp, 2, (struct obj *)0); break; case 2: /* no explanation; it just happens... */ nomovemsg = ""; *************** *** 803,810 **** wakem = TRUE; } else if (invoking) { ! pline("%s issues an unsettling shrill sound...", ! The(xname(obj))); #ifdef AMIGA amii_speaker( obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME ); #endif --- 826,833 ---- wakem = TRUE; } else if (invoking) { ! pline("%s an unsettling shrill sound...", ! Tobjnam(obj, "issue")); #ifdef AMIGA amii_speaker( obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME ); #endif *************** *** 852,901 **** use_candelabrum(obj) register struct obj *obj; { if(Underwater) { You("cannot make fire under water."); return; } if(obj->lamplit) { ! You("snuff the candle%s.", obj->spe > 1 ? "s" : ""); end_burn(obj, TRUE); return; } if(obj->spe <= 0) { ! pline("This %s has no candles.", xname(obj)); return; } if(u.uswallow || obj->cursed) { if (!Blind) ! pline_The("candle%s flicker%s for a moment, then die%s.", ! obj->spe > 1 ? "s" : "", ! obj->spe > 1 ? "" : "s", ! obj->spe > 1 ? "" : "s"); return; } if(obj->spe < 7) { ! There("%s only %d candle%s in %s.", ! obj->spe == 1 ? "is" : "are", ! obj->spe, ! obj->spe > 1 ? "s" : "", ! the(xname(obj))); if (!Blind) ! pline("%s lit. %s shines dimly.", ! obj->spe == 1 ? "It is" : "They are", The(xname(obj))); } else { ! pline("%s's candles burn%s", The(xname(obj)), (Blind ? "." : " brightly!")); } if (!invocation_pos(u.ux, u.uy)) { ! pline_The("candle%s being rapidly consumed!", ! (obj->spe > 1 ? "s are" : " is")); obj->age /= 2; } else { if(obj->spe == 7) { if (Blind) ! pline("%s radiates a strange warmth!", The(xname(obj))); else ! pline("%s glows with a strange light!", The(xname(obj))); } obj->known = 1; } --- 875,921 ---- use_candelabrum(obj) register struct obj *obj; { + char *s = obj->spe != 1 ? "candles" : "candle"; + if(Underwater) { You("cannot make fire under water."); return; } if(obj->lamplit) { ! You("snuff the %s.", s); end_burn(obj, TRUE); return; } if(obj->spe <= 0) { ! pline("This %s has no %s.", xname(obj), s); return; } if(u.uswallow || obj->cursed) { if (!Blind) ! pline_The("%s %s for a moment, then %s.", ! s, vtense(s, "flicker"), vtense(s, "die")); return; } if(obj->spe < 7) { ! There("%s only %d %s in %s.", ! vtense(s, "are"), obj->spe, s, the(xname(obj))); if (!Blind) ! pline("%s lit. %s dimly.", ! obj->spe == 1 ? "It is" : "They are", ! Tobjnam(obj, "shine")); } else { ! pline("%s's %s burn%s", The(xname(obj)), s, (Blind ? "." : " brightly!")); } if (!invocation_pos(u.ux, u.uy)) { ! pline_The("%s %s being rapidly consumed!", s, vtense(s, "are")); obj->age /= 2; } else { if(obj->spe == 7) { if (Blind) ! pline("%s a strange warmth!", Tobjnam(obj, "radiate")); else ! pline("%s with a strange light!", Tobjnam(obj, "glow")); } obj->known = 1; } *************** *** 907,912 **** --- 927,933 ---- register struct obj *obj; { register struct obj *otmp; + char *s = obj->quan != 1 ? "candles" : "candle"; char qbuf[QBUFSZ]; if(u.uswallow) { *************** *** 933,949 **** return; } else { if ((long)otmp->spe + obj->quan > 7L) ! (void)splitobj(obj, 7L - (long)otmp->spe); ! You("attach %ld%s candle%s to %s.", obj->quan, !otmp->spe ? "" : " more", ! plur(obj->quan), the(xname(otmp))); if (!otmp->spe || otmp->age > obj->age) otmp->age = obj->age; otmp->spe += (int)obj->quan; if (otmp->lamplit && !obj->lamplit) ! pline_The("new candle%s magically ignite%s!", ! plur(obj->quan), ! (obj->quan > 1L) ? "" : "s"); else if (!otmp->lamplit && obj->lamplit) pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes"); if (obj->unpaid) --- 954,968 ---- return; } else { if ((long)otmp->spe + obj->quan > 7L) ! obj = splitobj(obj, 7L - (long)otmp->spe); ! You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", ! s, the(xname(otmp))); if (!otmp->spe || otmp->age > obj->age) otmp->age = obj->age; otmp->spe += (int)obj->quan; if (otmp->lamplit && !obj->lamplit) ! pline_The("new %s magically %s!", s, vtense(s, "ignite")); else if (!otmp->lamplit && obj->lamplit) pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes"); if (obj->unpaid) *************** *** 952,959 **** (obj->quan > 1L) ? "them" : "it", (obj->quan > 1L) ? "them" : "it"); if (obj->quan < 7L && otmp->spe == 7) ! pline("%s now has seven%s candles attached.", ! The(xname(otmp)), otmp->lamplit ? " lit" : ""); /* candelabrum's light range might increase */ if (otmp->lamplit) obj_merge_light_sources(otmp, otmp); /* candles are no longer a separate light source */ --- 971,978 ---- (obj->quan > 1L) ? "them" : "it", (obj->quan > 1L) ? "them" : "it"); if (obj->quan < 7L && otmp->spe == 7) ! pline("%s now has seven%s %s attached.", ! The(xname(otmp)), otmp->lamplit ? " lit" : "", s); /* candelabrum's light range might increase */ if (otmp->lamplit) obj_merge_light_sources(otmp, otmp); /* candles are no longer a separate light source */ *************** *** 1001,1007 **** obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) { (void) get_obj_location(obj, &x, &y, 0); if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) ! pline("%s goes out!", Yname2(obj)); end_burn(obj, TRUE); return TRUE; } --- 1020,1026 ---- obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) { (void) get_obj_location(obj, &x, &y, 0); if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) ! pline("%s %s out!", Yname2(obj), otense(obj, "go")); end_burn(obj, TRUE); return TRUE; } *************** *** 1010,1015 **** --- 1029,1067 ---- return FALSE; } + /* Called when potentially lightable object is affected by fire_damage(). + Return TRUE if object was lit and FALSE otherwise --ALI */ + boolean + catch_lit(obj) + struct obj *obj; + { + xchar x, y; + + if (!obj->lamplit && (obj->otyp == CANDELABRUM_OF_INVOCATION || + obj->otyp == WAX_CANDLE || obj->otyp == TALLOW_CANDLE || + obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || + obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL)) { + if ((obj->otyp == MAGIC_LAMP || + obj->otyp == CANDELABRUM_OF_INVOCATION) && + obj->spe == 0) + return FALSE; + else if (obj->otyp != MAGIC_LAMP && obj->age == 0) + return FALSE; + if (!get_obj_location(obj, &x, &y, 0)) + return FALSE; + if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed) + return FALSE; + if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || + obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2)) + return FALSE; + if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) + pline("%s %s light!", Yname2(obj), otense(obj, "catch")); + begin_burn(obj, TRUE); + return TRUE; + } + return FALSE; + } + STATIC_OVL void use_lamp(obj) struct obj *obj; *************** *** 1038,1057 **** return; } if (obj->cursed && !rn2(2)) { ! pline("%s flicker%s for a moment, then die%s.", ! The(xname(obj)), ! obj->quan > 1L ? "" : "s", ! obj->quan > 1L ? "" : "s"); } else { if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN) { check_unpaid(obj); pline("%s lamp is now on.", Shk_Your(buf, obj)); } else { /* candle(s) */ ! pline("%s flame%s burn%s%s", s_suffix(Yname2(obj)), ! plur(obj->quan), ! obj->quan > 1L ? "" : "s", Blind ? "." : " brightly!"); if (obj->unpaid && costly_spot(u.ux, u.uy) && obj->age == 20L * (long)objects[obj->otyp].oc_cost) { --- 1090,1106 ---- return; } if (obj->cursed && !rn2(2)) { ! pline("%s for a moment, then %s.", ! Tobjnam(obj, "flicker"), otense(obj, "die")); } else { if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN) { check_unpaid(obj); pline("%s lamp is now on.", Shk_Your(buf, obj)); } else { /* candle(s) */ ! pline("%s flame%s %s%s", s_suffix(Yname2(obj)), ! plur(obj->quan), otense(obj, "burn"), Blind ? "." : " brightly!"); if (obj->unpaid && costly_spot(u.ux, u.uy) && obj->age == 20L * (long)objects[obj->otyp].oc_cost) { *************** *** 1098,1109 **** * for an item, but (Yendorian Fuel) Taxes are inevitable... */ check_unpaid(obj); bill_dummy_object(obj); } makeknown(obj->otyp); if (obj->quan > 1L) { ! (void) splitobj(obj, 1L); begin_burn(obj, FALSE); /* burn before free to get position */ obj_extract_self(obj); /* free from inv */ --- 1147,1159 ---- * for an item, but (Yendorian Fuel) Taxes are inevitable... */ check_unpaid(obj); + verbalize("That's in addition to the cost of the potion, of course."); bill_dummy_object(obj); } makeknown(obj->otyp); if (obj->quan > 1L) { ! obj = splitobj(obj, 1L); begin_burn(obj, FALSE); /* burn before free to get position */ obj_extract_self(obj); /* free from inv */ *************** *** 1114,1126 **** begin_burn(obj, FALSE); } ! static NEARDATA const char cuddly[] = { TOOL_CLASS, 0 }; int dorub() { struct obj *obj = getobj(cuddly, "rub"); if(!obj || (obj != uwep && !wield_tool(obj))) return 0; /* now uwep is obj */ --- 1164,1186 ---- begin_burn(obj, FALSE); } ! static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 }; int dorub() { struct obj *obj = getobj(cuddly, "rub"); + if (obj && obj->oclass == GEM_CLASS) { + if (is_graystone(obj)) { + use_stone(obj); + return 1; + } else { + pline("Sorry, I don't know how to use that."); + return 0; + } + } + if(!obj || (obj != uwep && !wield_tool(obj))) return 0; /* now uwep is obj */ *************** *** 1133,1138 **** --- 1193,1199 ---- uwep->spe = 0; /* for safety */ uwep->age = rn1(500,1000); if (uwep->lamplit) begin_burn(uwep, TRUE); + update_inventory(); } else if (rn2(2) && !Blind) You("see a puff of smoke."); else pline(nothing_happens); *************** *** 1180,1185 **** --- 1241,1251 ---- pline("This calls for swimming, not jumping!"); return 0; } else if (u.ustuck) { + if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) { + You("pull free from %s.", mon_nam(u.ustuck)); + u.ustuck = 0; + return 1; + } if (magic) { You("writhe a little in the grasp of %s!", mon_nam(u.ustuck)); return 1; *************** *** 1206,1212 **** if (wl == BOTH_SIDES) bp = makeplural(bp); #ifdef STEED if (u.usteed) ! pline("%s is in no shape for jumping.", Monnam(u.usteed)); else #endif Your("%s%s %s in no shape for jumping.", --- 1272,1278 ---- if (wl == BOTH_SIDES) bp = makeplural(bp); #ifdef STEED if (u.usteed) ! pline("%s is in no shape for jumping.", Monnam(u.usteed)); else #endif Your("%s%s %s in no shape for jumping.", *************** *** 1424,1439 **** /* collect property troubles */ if (Sick) prop_trouble(SICK); ! if (Blinded > (long)(u.ucreamed + 1)) prop_trouble(BLINDED); if (HHallucination) prop_trouble(HALLUC); if (Vomiting) prop_trouble(VOMITING); if (HConfusion) prop_trouble(CONFUSION); if (HStun) prop_trouble(STUNNED); ! /* keep track of unfixed trouble, for message adjustment below ! (can't "feel great" with these problems present) */ ! if (Stoned) unfixable_trbl++; ! if (Strangled) unfixable_trbl++; ! if (Wounded_legs) unfixable_trbl++; /* collect attribute troubles */ for (idx = 0; idx < A_MAX; idx++) { --- 1490,1502 ---- /* collect property troubles */ if (Sick) prop_trouble(SICK); ! if (Blinded > (long)u.ucreamed) prop_trouble(BLINDED); if (HHallucination) prop_trouble(HALLUC); if (Vomiting) prop_trouble(VOMITING); if (HConfusion) prop_trouble(CONFUSION); if (HStun) prop_trouble(STUNNED); ! ! unfixable_trbl = unfixable_trouble_count(TRUE); /* collect attribute troubles */ for (idx = 0; idx < A_MAX; idx++) { *************** *** 1482,1488 **** did_prop++; break; case prop2trbl(BLINDED): ! make_blinded(u.ucreamed ? (long)(u.ucreamed+1) : 0L, TRUE); did_prop++; break; case prop2trbl(HALLUC): --- 1545,1551 ---- did_prop++; break; case prop2trbl(BLINDED): ! make_blinded((long)u.ucreamed, TRUE); did_prop++; break; case prop2trbl(HALLUC): *************** *** 1551,1567 **** silent = (timeout != monstermoves); /* happened while away */ okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0); if (figurine->where == OBJ_INVENT || ! figurine->where == OBJ_MINVENT) ! okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]); if (!okay_spot || !figurine_location_checks(figurine,&cc, TRUE)) { ! /* reset the timer to try again later */ (void) start_timer((long)rnd(5000), TIMER_OBJECT, FIG_TRANSFORM, (genericptr_t)figurine); return; } ! cansee_spot = cansee(cc.x, cc.y); mtmp = make_familiar(figurine, cc.x, cc.y, TRUE); if (mtmp) { --- 1614,1630 ---- silent = (timeout != monstermoves); /* happened while away */ okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0); if (figurine->where == OBJ_INVENT || ! figurine->where == OBJ_MINVENT) ! okay_spot = enexto(&cc, cc.x, cc.y, &mons[figurine->corpsenm]); if (!okay_spot || !figurine_location_checks(figurine,&cc, TRUE)) { ! /* reset the timer to try again later */ (void) start_timer((long)rnd(5000), TIMER_OBJECT, FIG_TRANSFORM, (genericptr_t)figurine); return; } ! cansee_spot = cansee(cc.x, cc.y); mtmp = make_familiar(figurine, cc.x, cc.y, TRUE); if (mtmp) { *************** *** 1587,1594 **** case OBJ_MINVENT: if (cansee_spot && !silent) { ! struct monst *mon; ! mon = figurine->ocarry; /* figurine carring monster might be invisible */ if (canseemon(figurine->ocarry)) { Sprintf(carriedby, "%s pack", --- 1650,1657 ---- case OBJ_MINVENT: if (cansee_spot && !silent) { ! struct monst *mon; ! mon = figurine->ocarry; /* figurine carring monster might be invisible */ if (canseemon(figurine->ocarry)) { Sprintf(carriedby, "%s pack", *************** *** 1626,1632 **** boolean quietly; { xchar x,y; ! x = cc->x; y = cc->y; if (!isok(x,y)) { if (!quietly) --- 1689,1695 ---- boolean quietly; { xchar x,y; ! x = cc->x; y = cc->y; if (!isok(x,y)) { if (!quietly) *************** *** 1636,1642 **** if (IS_ROCK(levl[x][y].typ) && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x,y))) { if (!quietly) ! You("cannot place a figurine in solid rock!"); return FALSE; } if (sobj_at(BOULDER,x,y) && !passes_walls(&mons[obj->corpsenm]) --- 1699,1706 ---- if (IS_ROCK(levl[x][y].typ) && !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x,y))) { if (!quietly) ! You("cannot place a figurine in %s!", ! IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock"); return FALSE; } if (sobj_at(BOULDER,x,y) && !passes_walls(&mons[obj->corpsenm]) *************** *** 1654,1660 **** { xchar x, y; coord cc; ! if(!getdir((char *)0)) { flags.move = multi = 0; return; --- 1718,1724 ---- { xchar x, y; coord cc; ! if(!getdir((char *)0)) { flags.move = multi = 0; return; *************** *** 1688,1694 **** if (Glib) { dropx(obj); ! pline("%s slips from your %s.", The(xname(obj)), makeplural(body_part(FINGER))); return; } --- 1752,1758 ---- if (Glib) { dropx(obj); ! pline("%s from your %s.", Tobjnam(obj, "slip"), makeplural(body_part(FINGER))); return; } *************** *** 1698,1704 **** check_unpaid(obj); obj->spe--; dropx(obj); ! pline("%s slips from your %s.", The(xname(obj)), makeplural(body_part(FINGER))); return; } --- 1762,1768 ---- check_unpaid(obj); obj->spe--; dropx(obj); ! pline("%s from your %s.", Tobjnam(obj, "slip"), makeplural(body_part(FINGER))); return; } *************** *** 1735,1743 **** makeplural(body_part(FINGER))); } } else { ! pline("%s %s empty.", The(xname(obj)), ! obj->known ? "is" : "seems to be"); } } static struct trapinfo { --- 1799,1810 ---- makeplural(body_part(FINGER))); } } else { ! if (obj->known) ! pline("%s empty.", Tobjnam(obj, "are")); ! else ! pline("%s to be empty.", Tobjnam(obj, "seem")); } + update_inventory(); } static struct trapinfo { *************** *** 1752,1757 **** --- 1819,1956 ---- trapinfo.tobj = 0; } + /* touchstones - by Ken Arnold */ + STATIC_OVL void + use_stone(tstone) + struct obj *tstone; + { + struct obj *obj; + boolean do_scratch; + const char *streak_color; + char stonebuf[QBUFSZ]; + static const char scritch[] = "\"scritch, scritch\""; + static char allowall[3] = { GOLD_CLASS, ALL_CLASSES, 0 }; + #ifndef GOLDOBJ + struct obj goldobj; + #endif + + Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan)); + if ((obj = getobj(allowall, stonebuf)) == 0) + return; + #ifndef GOLDOBJ + if (obj->oclass == GOLD_CLASS) { + u.ugold += obj->quan; /* keep botl up to date */ + goldobj = *obj; + dealloc_obj(obj); + obj = &goldobj; + } + #endif + + if (obj == tstone && obj->quan == 1) { + You_cant("rub %s on itself.", the(xname(obj))); + return; + } + + if (tstone->otyp == TOUCHSTONE && tstone->cursed && + obj->oclass == GEM_CLASS && !is_graystone(obj) && + !obj_resists(obj, 80, 100)) { + if (Blind) + pline("You feel something shatter."); + else if (Hallucination) + pline("Oh, wow, look at the pretty shards."); + else + pline("A sharp crack shatters %s%s.", + (obj->quan > 1) ? "one of " : "", the(xname(obj))); + #ifndef GOLDOBJ + /* assert(obj != &goldobj); */ + #endif + useup(obj); + return; + } + + if (Blind) { + pline(scritch); + return; + } else if (Hallucination) { + pline("Oh wow, man: Fractals!"); + return; + } + + do_scratch = FALSE; + streak_color = 0; + + switch (obj->oclass) { + case GEM_CLASS: /* these have class-specific handling below */ + case RING_CLASS: + if (tstone->otyp != TOUCHSTONE) { + do_scratch = TRUE; + } else if (obj->oclass == GEM_CLASS && (tstone->blessed || + (!tstone->cursed && + (Role_if(PM_ARCHEOLOGIST) || Race_if(PM_GNOME))))) { + makeknown(TOUCHSTONE); + makeknown(obj->otyp); + prinv((char *)0, obj, 0L); + return; + } else { + /* either a ring or the touchstone was not effective */ + if (objects[obj->otyp].oc_material == GLASS) { + do_scratch = TRUE; + break; + } + } + streak_color = c_obj_colors[objects[obj->otyp].oc_color]; + break; /* gem or ring */ + + default: + switch (objects[obj->otyp].oc_material) { + case CLOTH: + pline("%s a little more polished now.", Tobjnam(tstone, "look")); + return; + case LIQUID: + if (!obj->known) /* note: not "whetstone" */ + You("must think this is a wetstone, do you?"); + else + pline("%s a little wetter now.", Tobjnam(tstone, "are")); + return; + case WAX: + streak_color = "waxy"; + break; /* okay even if not touchstone */ + case WOOD: + streak_color = "wooden"; + break; /* okay even if not touchstone */ + case GOLD: + do_scratch = TRUE; /* scratching and streaks */ + streak_color = "golden"; + break; + case SILVER: + do_scratch = TRUE; /* scratching and streaks */ + streak_color = "silvery"; + break; + default: + /* Objects passing the is_flimsy() test will not + scratch a stone. They will leave streaks on + non-touchstones and touchstones alike. */ + if (is_flimsy(obj)) + streak_color = c_obj_colors[objects[obj->otyp].oc_color]; + else + do_scratch = (tstone->otyp != TOUCHSTONE); + break; + } + break; /* default oclass */ + } + + Sprintf(stonebuf, "stone%s", plur(tstone->quan)); + if (do_scratch) + pline("You make %s%sscratch marks on the %s.", + streak_color ? streak_color : (const char *)"", + streak_color ? " " : "", stonebuf); + else if (streak_color) + pline("You see %s streaks on the %s.", streak_color, stonebuf); + else + pline(scritch); + return; + } + /* Place a landmine/bear trap. Helge Hafting */ STATIC_OVL void use_trap(otmp) *************** *** 1845,1851 **** } You("finish arming %s.", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); ! if ((otmp->cursed || Fumbling) && (rnl(10) > 5)) dotrap(ttmp); } else { /* this shouldn't happen */ Your("trap setting attempt fails."); --- 2044,2050 ---- } You("finish arming %s.", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); ! if ((otmp->cursed || Fumbling) && (rnl(10) > 5)) dotrap(ttmp, 0); } else { /* this shouldn't happen */ Your("trap setting attempt fails."); *************** *** 1930,1945 **** dam = rnd(2) + dbon() + obj->spe; if (dam <= 0) dam = 1; You("hit your %s with your bullwhip.", body_part(FOOT)); ! /* self_pronoun() won't work twice in a sentence */ ! Strcpy(buf, self_pronoun("killed %sself with %%s bullwhip", "him")); ! losehp(dam, self_pronoun(buf, "his"), NO_KILLER_PREFIX); flags.botl = 1; return 1; } else if ((Fumbling || Glib) && !rn2(5)) { pline_The("bullwhip slips out of your %s.", body_part(HAND)); dropx(obj); - setuwep((struct obj *)0); } else if (u.utrap && u.utraptype == TT_PIT) { /* --- 2129,2142 ---- dam = rnd(2) + dbon() + obj->spe; if (dam <= 0) dam = 1; You("hit your %s with your bullwhip.", body_part(FOOT)); ! Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis()); ! losehp(dam, buf, NO_KILLER_PREFIX); flags.botl = 1; return 1; } else if ((Fumbling || Glib) && !rn2(5)) { pline_The("bullwhip slips out of your %s.", body_part(HAND)); dropx(obj); } else if (u.utrap && u.utraptype == TT_PIT) { /* *************** *** 2005,2011 **** const char *mon_hand; boolean gotit = proficient && (!Fumbling || !rn2(10)); ! Strcpy(onambuf, xname(otmp)); if (gotit) { mon_hand = mbodypart(mtmp, HAND); if (bimanual(otmp)) mon_hand = makeplural(mon_hand); --- 2202,2208 ---- const char *mon_hand; boolean gotit = proficient && (!Fumbling || !rn2(10)); ! Strcpy(onambuf, cxname(otmp)); if (gotit) { mon_hand = mbodypart(mtmp, HAND); if (bimanual(otmp)) mon_hand = makeplural(mon_hand); *************** *** 2017,2023 **** if (gotit && otmp->cursed) { pline("%s welded to %s %s%c", (otmp->quan == 1L) ? "It is" : "They are", ! his[pronoun_gender(mtmp)], mon_hand, !otmp->bknown ? '!' : '.'); otmp->bknown = 1; gotit = FALSE; /* can't pull it free */ --- 2214,2220 ---- if (gotit && otmp->cursed) { pline("%s welded to %s %s%c", (otmp->quan == 1L) ? "It is" : "They are", ! mhis(mtmp), mon_hand, !otmp->bknown ? '!' : '.'); otmp->bknown = 1; gotit = FALSE; /* can't pull it free */ *************** *** 2025,2042 **** if (gotit) { obj_extract_self(otmp); possibly_unwield(mtmp); ! otmp->owornmask &= ~W_WEP; switch (rn2(proficient + 1)) { case 2: /* to floor near you */ You("yank %s %s to the %s!", s_suffix(mon_nam(mtmp)), onambuf, surface(u.ux, u.uy)); - if (otmp->otyp == CRYSKNIFE && - (!otmp->oerodeproof || !rn2(10))) { - otmp->otyp = WORM_TOOTH; - otmp->oerodeproof = 0; - } place_object(otmp, u.ux, u.uy); stackobj(otmp); break; --- 2222,2234 ---- if (gotit) { obj_extract_self(otmp); possibly_unwield(mtmp); ! setmnotwielded(mtmp,otmp); switch (rn2(proficient + 1)) { case 2: /* to floor near you */ You("yank %s %s to the %s!", s_suffix(mon_nam(mtmp)), onambuf, surface(u.ux, u.uy)); place_object(otmp, u.ux, u.uy); stackobj(otmp); break; *************** *** 2053,2059 **** dmgval(otmp, &youmonst), otmp, (char *)0); if (hitu) { ! You("The %s hits you as you try to snatch it!", the(onambuf)); } place_object(otmp, u.ux, u.uy); --- 2245,2251 ---- dmgval(otmp, &youmonst), otmp, (char *)0); if (hitu) { ! pline_The("%s hits you as you try to snatch it!", the(onambuf)); } place_object(otmp, u.ux, u.uy); *************** *** 2071,2077 **** char kbuf[BUFSZ]; Sprintf(kbuf, "%s corpse", ! an(mons[otmp->corpsenm].mname)); pline("Snatching %s is a fatal mistake.", kbuf); instapetrify(kbuf); } --- 2263,2269 ---- char kbuf[BUFSZ]; Sprintf(kbuf, "%s corpse", ! an(mons[otmp->corpsenm].mname)); pline("Snatching %s is a fatal mistake.", kbuf); instapetrify(kbuf); } *************** *** 2082,2092 **** /* to floor beneath mon */ You("yank %s from %s %s!", the(onambuf), s_suffix(mon_nam(mtmp)), mon_hand); ! if (otmp->otyp == CRYSKNIFE && ! (!otmp->oerodeproof || !rn2(10))) { ! otmp->otyp = WORM_TOOTH; ! otmp->oerodeproof = 0; ! } place_object(otmp, mtmp->mx, mtmp->my); stackobj(otmp); break; --- 2274,2280 ---- /* to floor beneath mon */ You("yank %s from %s %s!", the(onambuf), s_suffix(mon_nam(mtmp)), mon_hand); ! obj_no_longer_held(otmp); place_object(otmp, mtmp->mx, mtmp->my); stackobj(otmp); break; *************** *** 2096,2102 **** } wakeup(mtmp); } else { ! You("flick your bullwhip towards %s.", mon_nam(mtmp)); if (proficient) { if (attack(mtmp)) return 1; else pline(msg_snap); --- 2284,2293 ---- } wakeup(mtmp); } else { ! if (mtmp->m_ap_type && ! !Protection_from_shape_changers && !sensemon(mtmp)) ! stumble_onto_mimic(mtmp); ! else You("flick your bullwhip towards %s.", mon_nam(mtmp)); if (proficient) { if (attack(mtmp)) return 1; else pline(msg_snap); *************** *** 2165,2173 **** } /* Attack the monster there */ ! if ((mtmp = m_at(cc.x, cc.y)) != (struct monst *)0) (void) thitmonst(mtmp, uwep); ! else /* Now you know that nothing is there... */ pline(nothing_happens); return (1); --- 2356,2372 ---- } /* Attack the monster there */ ! if ((mtmp = m_at(cc.x, cc.y)) != (struct monst *)0) { ! int oldhp = mtmp->mhp; ! (void) thitmonst(mtmp, uwep); ! /* check the monster's HP because thitmonst() doesn't return ! * an indication of whether it hit. Not perfect (what if it's a ! * non-silver weapon on a shade?) ! */ ! if (mtmp->mhp < oldhp) ! u.uconduct.weaphit++; ! } else /* Now you know that nothing is there... */ pline(nothing_happens); return (1); *************** *** 2215,2222 **** } /* What did you hit? */ ! switch (rn2(5)) ! { case 0: /* Trap */ /* FIXME -- untrap needs to deal with non-adjacent traps */ break; --- 2414,2420 ---- } /* What did you hit? */ ! switch (rn2(5)) { case 0: /* Trap */ /* FIXME -- untrap needs to deal with non-adjacent traps */ break; *************** *** 2244,2252 **** } /* FALL THROUGH */ case 3: /* Surface */ ! You("are yanked toward the %s!", ! surface(cc.x, cc.y)); ! hurtle(sgn(cc.x-u.ux), sgn(cc.y-u.uy), 1, FALSE); return (1); default: /* Yourself (oops!) */ if (P_SKILL(typ) <= P_BASIC) { --- 2442,2454 ---- } /* FALL THROUGH */ case 3: /* Surface */ ! if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y)) ! pline_The("hook slices through the %s.", surface(cc.x, cc.y)); ! else { ! You("are yanked toward the %s!", surface(cc.x, cc.y)); ! hurtle(sgn(cc.x-u.ux), sgn(cc.y-u.uy), 1, FALSE); ! spoteffects(TRUE); ! } return (1); default: /* Yourself (oops!) */ if (P_SKILL(typ) <= P_BASIC) { *************** *** 2273,2279 **** register struct monst *mon; int dmg, damage; boolean affects_objects; ! char confirm[QBUFSZ], the_wand[BUFSZ]; Strcpy(the_wand, yname(obj)); Sprintf(confirm, "Are you really sure you want to break %s?", the_wand); --- 2475,2482 ---- register struct monst *mon; int dmg, damage; boolean affects_objects; ! int expltype = EXPL_MAGICAL; ! char confirm[QBUFSZ], the_wand[BUFSZ], buf[BUFSZ]; Strcpy(the_wand, yname(obj)); Sprintf(confirm, "Are you really sure you want to break %s?", the_wand); *************** *** 2289,2294 **** --- 2492,2505 ---- pline("Raising %s high above your %s, you break it in two!", the_wand, body_part(HEAD)); + /* [ALI] Do this first so that wand is removed from bill. Otherwise, + * the freeinv() below also hides it from setpaid() which causes problems. + */ + if (obj->unpaid) { + check_unpaid(obj); /* Extra charge for use */ + bill_dummy_object(obj); + } + current_wand = obj; /* destroy_item might reset this */ freeinv(obj); /* hide it from destroy_item instead... */ setnotworn(obj); /* so we need to do this ourselves */ *************** *** 2314,2325 **** goto discard_broken_wand; case WAN_DEATH: case WAN_LIGHTNING: ! dmg *= 2; case WAN_FIRE: case WAN_COLD: dmg *= 2; case WAN_MAGIC_MISSILE: ! explode(u.ux, u.uy, (obj->otyp - WAN_MAGIC_MISSILE), dmg, WAND_CLASS); makeknown(obj->otyp); /* explode described the effect */ goto discard_broken_wand; case WAN_STRIKING: --- 2525,2541 ---- goto discard_broken_wand; case WAN_DEATH: case WAN_LIGHTNING: ! dmg *= 4; ! goto wanexpl; case WAN_FIRE: + expltype = EXPL_FIERY; case WAN_COLD: + if (expltype == EXPL_MAGICAL) expltype = EXPL_FROSTY; dmg *= 2; case WAN_MAGIC_MISSILE: ! wanexpl: ! explode(u.ux, u.uy, ! (obj->otyp - WAN_MAGIC_MISSILE), dmg, WAND_CLASS, expltype); makeknown(obj->otyp); /* explode described the effect */ goto discard_broken_wand; case WAN_STRIKING: *************** *** 2337,2343 **** } /* magical explosion and its visual effect occur before specific effects */ ! explode(obj->ox, obj->oy, 0, rnd(dmg), WAND_CLASS); /* this makes it hit us last, so that we can see the action first */ for (i = 0; i <= 8; i++) { --- 2553,2559 ---- } /* magical explosion and its visual effect occur before specific effects */ ! explode(obj->ox, obj->oy, 0, rnd(dmg), WAND_CLASS, EXPL_MAGICAL); /* this makes it hit us last, so that we can see the action first */ for (i = 0; i <= 8; i++) { *************** *** 2366,2376 **** if (flags.botl) bot(); /* potion effects */ } damage = zapyourself(obj, FALSE); ! if (damage) ! losehp(damage, ! self_pronoun("killed %sself by breaking a wand", ! "him"), ! NO_KILLER_PREFIX); if (flags.botl) bot(); /* blindness */ } else if ((mon = m_at(x, y)) != 0) { (void) bhitm(mon, obj); --- 2582,2591 ---- if (flags.botl) bot(); /* potion effects */ } damage = zapyourself(obj, FALSE); ! if (damage) { ! Sprintf(buf, "killed %sself by breaking a wand", uhim()); ! losehp(damage, buf, NO_KILLER_PREFIX); ! } if (flags.botl) bot(); /* blindness */ } else if ((mon = m_at(x, y)) != 0) { (void) bhitm(mon, obj); *************** *** 2389,2403 **** discard_broken_wand: obj = current_wand; /* [see dozap() and destroy_item()] */ current_wand = 0; ! if (obj) { ! /* extra charge for _use_ prior to destruction */ ! check_unpaid(obj); delobj(obj); - } nomul(0); return 1; } int doapply() { --- 2604,2626 ---- discard_broken_wand: obj = current_wand; /* [see dozap() and destroy_item()] */ current_wand = 0; ! if (obj) delobj(obj); nomul(0); return 1; } + STATIC_OVL boolean + uhave_graystone() + { + register struct obj *otmp; + + for(otmp = invent; otmp; otmp = otmp->nobj) + if(is_graystone(otmp)) + return TRUE; + return FALSE; + } + int doapply() { *************** *** 2405,2411 **** register int res = 1; if(check_capacity((char *)0)) return (0); ! obj = getobj(carrying(POT_OIL) ? tools_too : tools, "use or apply"); if(!obj) return 0; if (obj->oclass == WAND_CLASS) --- 2628,2635 ---- register int res = 1; if(check_capacity((char *)0)) return (0); ! obj = getobj(carrying(POT_OIL) || uhave_graystone() ! ? tools_too : tools, "use or apply"); if(!obj) return 0; if (obj->oclass == WAND_CLASS) *************** *** 2419,2425 **** } else if (!ublindf) Blindf_on(obj); else You("are already %s.", ! ublindf->otyp == TOWEL ? "covered by a towel" : ublindf->otyp == BLINDFOLD ? "wearing a blindfold" : "wearing lenses"); break; --- 2643,2649 ---- } else if (!ublindf) Blindf_on(obj); else You("are already %s.", ! ublindf->otyp == TOWEL ? "covered by a towel" : ublindf->otyp == BLINDFOLD ? "wearing a blindfold" : "wearing lenses"); break; *************** *** 2589,2594 **** --- 2813,2824 ---- case BEARTRAP: use_trap(obj); break; + case FLINT: + case LUCKSTONE: + case LOADSTONE: + case TOUCHSTONE: + use_stone(obj); + break; default: /* Pole-weapons can strike at a distance */ if (is_pole(obj)) { *************** *** 2606,2611 **** --- 2836,2872 ---- if (res && obj->oartifact) arti_speak(obj); nomul(0); return res; + } + + /* Keep track of unfixable troubles for purposes of messages saying you feel + * great. + */ + int unfixable_trouble_count(is_horn) + boolean is_horn; + { + int unfixable_trbl = 0; + + if (Stoned) unfixable_trbl++; + if (Strangled) unfixable_trbl++; + if (Wounded_legs + #ifdef STEED + && !u.usteed + #endif + ) unfixable_trbl++; + if (Slimed) unfixable_trbl++; + /* lycanthropy is not desirable, but it doesn't actually make you feel + bad */ + + /* we'll assume that intrinsic stunning from being a bat/stalker + doesn't make you feel bad */ + if (!is_horn) { + if (Confusion) unfixable_trbl++; + if (Sick) unfixable_trbl++; + if (HHallucination) unfixable_trbl++; + if (Vomiting) unfixable_trbl++; + if (HStun) unfixable_trbl++; + } + return unfixable_trbl; } #endif /* OVLB */ *** nethack-3.3.1/src/artifact.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/artifact.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)artifact.c 3.3 2000/01/11 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)artifact.c 3.4 2002/02/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 23,35 **** STATIC_DCL int FDECL(spec_applies, (const struct artifact *,struct monst *)); STATIC_DCL int FDECL(arti_invoke, (struct obj*)); ! /* The amount added to normal damage which should guarantee that the victim will be killed even after damage bonus/penalty adjustments. ! It needs to be big enough so that halving will still kill, but not ! so big that doubling ends up overflowing 15 bits. This value used ! to be 1234, but it was possible for players to accumulate enough ! hit points so that taking (uhp + 1234)/2 damage was survivable. */ ! #define FATAL_DAMAGE 9999 #ifndef OVLB STATIC_DCL int spec_dbon_applies; --- 23,37 ---- STATIC_DCL int FDECL(spec_applies, (const struct artifact *,struct monst *)); STATIC_DCL int FDECL(arti_invoke, (struct obj*)); ! /* The amount added to the victim's total hit points to insure that the victim will be killed even after damage bonus/penalty adjustments. ! Most such penalties are small, and 200 is plenty; the exception is ! half physical damage. 3.3.1 and previous versions tried to use a very ! large number to account for this case; now, we just compute the fatal ! damage by adding it to 2 times the total hit points instead of 1 time. ! Note: this will still break if they have more than about half the number ! of hit points that will fit in a 15 bit integer. */ ! #define FATAL_DAMAGE_MODIFIER 200 #ifndef OVLB STATIC_DCL int spec_dbon_applies; *************** *** 60,66 **** /* Excalibur can be used by any lawful character, not just knights */ if (!Role_if(PM_KNIGHT)) ! artilist[ART_EXCALIBUR].role = 0; /****FIXME****/ /* Fix up the quest artifact */ if (urole.questarti) { --- 62,68 ---- /* Excalibur can be used by any lawful character, not just knights */ if (!Role_if(PM_KNIGHT)) ! artilist[ART_EXCALIBUR].role = NON_PM; /* Fix up the quest artifact */ if (urole.questarti) { *************** *** 472,487 **** /* all quest artifacts are self-willed; it this ever changes, `badclass' will have to be extended to explicitly include quest artifacts */ self_willed = ((oart->spfx & SPFX_INTEL) != 0); ! if (yours || !(mon->data->mflags3 & M3_WANTSALL)) { ! badclass = (self_willed && (!yours || ! (oart->role != NON_PM && !Role_if(oart->role)) || ! (oart->race != NON_PM && !Race_if(oart->race)))); ! badalign = (oart->spfx & SPFX_RESTR) && ! oart->alignment != A_NONE && ! ((oart->alignment != ! (yours ? u.ualign.type : sgn(mon->data->maligntyp))) || ! (yours && u.ualign.record < 0)); ! } else { /* an M3_WANTSxxx monster */ /* special monsters trying to take the Amulet, invocation tools or quest item can touch anything except for `spec_applies' artifacts */ badclass = badalign = FALSE; --- 474,491 ---- /* all quest artifacts are self-willed; it this ever changes, `badclass' will have to be extended to explicitly include quest artifacts */ self_willed = ((oart->spfx & SPFX_INTEL) != 0); ! if (yours) { ! badclass = self_willed && ! ((oart->role != NON_PM && !Role_if(oart->role)) || ! (oart->race != NON_PM && !Race_if(oart->race))); ! badalign = (oart->spfx & SPFX_RESTR) && oart->alignment != A_NONE && ! (oart->alignment != u.ualign.type || u.ualign.record < 0); ! } else if (!is_covetous(mon->data) && !is_mplayer(mon->data)) { ! badclass = self_willed && ! oart->role != NON_PM && oart != &artilist[ART_EXCALIBUR]; ! badalign = (oart->spfx & SPFX_RESTR) && oart->alignment != A_NONE && ! (oart->alignment != sgn(mon->data->maligntyp)); ! } else { /* an M3_WANTSxxx monster or a fake player */ /* special monsters trying to take the Amulet, invocation tools or quest item can touch anything except for `spec_applies' artifacts */ badclass = badalign = FALSE; *************** *** 511,517 **** /* can pick it up unless you're totally non-synch'd with the artifact */ if (badclass && badalign && self_willed) { ! if (yours) pline("%s evades your grasp!", The(xname(obj))); return 0; } --- 515,521 ---- /* can pick it up unless you're totally non-synch'd with the artifact */ if (badclass && badalign && self_willed) { ! if (yours) pline("%s your grasp!", Tobjnam(obj, "evade")); return 0; } *************** *** 596,603 **** { register const struct artifact *weap = get_artifact(otmp); ! if (weap && spec_applies(weap, mon)) ! return weap->attk.damn ? rnd((int)weap->attk.damn) : 0; return 0; } --- 600,610 ---- { register const struct artifact *weap = get_artifact(otmp); ! /* no need for an extra check for `NO_ATTK' because this will ! always return 0 for any artifact which has that attribute */ ! ! if (weap && weap->attk.damn && spec_applies(weap, mon)) ! return rnd((int)weap->attk.damn); return 0; } *************** *** 610,616 **** { register const struct artifact *weap = get_artifact(otmp); ! if ((spec_dbon_applies = (weap && spec_applies(weap, mon))) != 0) return weap->attk.damd ? rnd((int)weap->attk.damd) : max(tmp,1); return 0; } --- 617,629 ---- { register const struct artifact *weap = get_artifact(otmp); ! if (!weap || (weap->attk.adtyp == AD_PHYS && /* check for `NO_ATTK' */ ! weap->attk.damn == 0 && weap->attk.damd == 0)) ! spec_dbon_applies = FALSE; ! else ! spec_dbon_applies = spec_applies(weap, mon); ! ! if (spec_dbon_applies) return weap->attk.damd ? rnd((int)weap->attk.damd) : max(tmp,1); return 0; } *************** *** 695,703 **** boolean vis = (!youattack && magr && cansee(magr->mx, magr->my)) || (!youdefend && cansee(mdef->mx, mdef->my)); boolean realizes_damage; ! static const char you[] = "you"; ! const char *hittee = youdefend ? you : mon_nam(mdef); /* The following takes care of most of the damage, but not all-- * the exception being for level draining, which is specially --- 708,718 ---- boolean vis = (!youattack && magr && cansee(magr->mx, magr->my)) || (!youdefend && cansee(mdef->mx, mdef->my)); boolean realizes_damage; ! const char *wepdesc; static const char you[] = "you"; ! char hittee[BUFSZ]; ! ! Strcpy(hittee, youdefend ? you : mon_nam(mdef)); /* The following takes care of most of the damage, but not all-- * the exception being for level draining, which is specially *************** *** 706,756 **** *dmgptr += spec_dbon(otmp, mdef, *dmgptr); if (youattack && youdefend) { ! impossible("attacking yourself with weapon?"); ! return FALSE; ! } else if (!spec_dbon_applies) { ! /* since damage bonus didn't apply, nothing more to do */ ! return FALSE; } realizes_damage = (youdefend || vis); /* the four basic attacks: fire, cold, shock and missiles */ if (attacks(AD_FIRE, otmp)) { ! if (realizes_damage) { ! pline_The("fiery blade %s %s!", (mdef->data == &mons[PM_WATER_ELEMENTAL]) ? ! "vaporizes part of" : "burns", hittee); ! if (!rn2(4)) (void) destroy_mitem(mdef, POTION_CLASS, AD_FIRE); ! if (!rn2(4)) (void) destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE); ! if (!rn2(7)) (void) destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); ! return TRUE; ! } } if (attacks(AD_COLD, otmp)) { ! if (realizes_damage) { ! pline_The("ice-cold blade freezes %s!", hittee); ! if (!rn2(4)) (void) destroy_mitem(mdef, POTION_CLASS, AD_COLD); ! return TRUE; ! } } if (attacks(AD_ELEC, otmp)) { if (realizes_damage) { ! if(youattack && otmp != uwep) ! pline("%s hits %s!", The(xname(otmp)), hittee); ! pline("Lightning strikes %s!", hittee); ! if (!rn2(5)) (void) destroy_mitem(mdef, RING_CLASS, AD_ELEC); ! if (!rn2(5)) (void) destroy_mitem(mdef, WAND_CLASS, AD_ELEC); ! return TRUE; } } if (attacks(AD_MAGM, otmp)) { ! if (realizes_damage) { ! if(youattack && otmp != uwep) ! pline("%s hits %s!", The(xname(otmp)), hittee); ! pline("A hail of magic missiles strikes %s!", hittee); ! return TRUE; ! } } /* --- 721,781 ---- *dmgptr += spec_dbon(otmp, mdef, *dmgptr); if (youattack && youdefend) { ! impossible("attacking yourself with weapon?"); ! return FALSE; } realizes_damage = (youdefend || vis); /* the four basic attacks: fire, cold, shock and missiles */ if (attacks(AD_FIRE, otmp)) { ! if (realizes_damage) ! pline_The("fiery blade %s %s%c", ! !spec_dbon_applies ? "hits" : (mdef->data == &mons[PM_WATER_ELEMENTAL]) ? ! "vaporizes part of" : "burns", ! hittee, !spec_dbon_applies ? '.' : '!'); ! if (!rn2(4)) (void) destroy_mitem(mdef, POTION_CLASS, AD_FIRE); ! if (!rn2(4)) (void) destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE); ! if (!rn2(7)) (void) destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); ! if (youdefend && Slimed) burn_away_slime(); ! return realizes_damage; } if (attacks(AD_COLD, otmp)) { ! if (realizes_damage) ! pline_The("ice-cold blade %s %s%c", ! !spec_dbon_applies ? "hits" : "freezes", ! hittee, !spec_dbon_applies ? '.' : '!'); ! if (!rn2(4)) (void) destroy_mitem(mdef, POTION_CLASS, AD_COLD); ! return realizes_damage; } if (attacks(AD_ELEC, otmp)) { if (realizes_damage) { ! if (youattack ? otmp != uwep : !spec_dbon_applies) ! pline("%s %s%c", Tobjnam(otmp, "hit"), ! hittee, !spec_dbon_applies ? '.' : '!'); ! if (spec_dbon_applies) ! pline("Lightning strikes %s!", hittee); } + if (!rn2(5)) (void) destroy_mitem(mdef, RING_CLASS, AD_ELEC); + if (!rn2(5)) (void) destroy_mitem(mdef, WAND_CLASS, AD_ELEC); + return realizes_damage; } if (attacks(AD_MAGM, otmp)) { ! if (realizes_damage) { ! if (youattack ? otmp != uwep : !spec_dbon_applies) ! pline("%s %s%c", Tobjnam(otmp, "hit"), ! hittee, !spec_dbon_applies ? '.' : '!'); ! if (spec_dbon_applies) ! pline("A hail of magic missiles strikes %s!", hittee); ! } ! return realizes_damage; ! } ! ! if (!spec_dbon_applies) { ! /* since damage bonus didn't apply, nothing more to do; ! no further attacks have side-effects on inventory */ ! return FALSE; } /* *************** *** 803,809 **** else { nomul(-3); nomovemsg = ""; ! if ((magr == u.ustuck) && sticks(youmonst.data)) { u.ustuck = (struct monst *)0; You("release %s!", mon_nam(magr)); --- 828,834 ---- else { nomul(-3); nomovemsg = ""; ! if (magr && magr == u.ustuck && sticks(youmonst.data)) { u.ustuck = (struct monst *)0; You("release %s!", mon_nam(magr)); *************** *** 813,830 **** if (rn2(2) && resist(mdef,SPBOOK_CLASS,0,0)) { MB_RESIST_ATTACK; } else { ! if (mdef == u.ustuck) { ! if (u.uswallow) ! expels(mdef,mdef->data,TRUE); ! else { ! if (!sticks(youmonst.data)) { ! u.ustuck = (struct monst *)0; ! You("get released!"); ! } ! } ! } ! mdef->mflee = 1; ! mdef->mfleetim += 3; } } } --- 838,844 ---- if (rn2(2) && resist(mdef,SPBOOK_CLASS,0,0)) { MB_RESIST_ATTACK; } else { ! monflee(mdef, 3, FALSE, TRUE); } } } *************** *** 926,935 **** /* reverse from AD&D. */ if (spec_ability(otmp, SPFX_BEHEAD)) { if (otmp->oartifact == ART_TSURUGI_OF_MURAMASA && dieroll == 1) { /* not really beheading, but so close, why add another SPFX */ if (youattack && u.uswallow && mdef == u.ustuck) { You("slice %s wide open!", mon_nam(mdef)); ! *dmgptr = mdef->mhp + FATAL_DAMAGE; return TRUE; } if (!youdefend) { --- 940,950 ---- /* reverse from AD&D. */ if (spec_ability(otmp, SPFX_BEHEAD)) { if (otmp->oartifact == ART_TSURUGI_OF_MURAMASA && dieroll == 1) { + wepdesc = "The razor-sharp blade"; /* not really beheading, but so close, why add another SPFX */ if (youattack && u.uswallow && mdef == u.ustuck) { You("slice %s wide open!", mon_nam(mdef)); ! *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; return TRUE; } if (!youdefend) { *************** *** 943,961 **** mon_nam(mdef)); else if (vis) pline("%s cuts deeply into %s!", ! Monnam(magr), mon_nam(mdef)); *dmgptr *= 2; return TRUE; } ! *dmgptr = mdef->mhp + FATAL_DAMAGE; ! pline_The("razor-sharp blade cuts %s in half!", ! mon_nam(mdef)); otmp->dknown = TRUE; return TRUE; } else { if (bigmonst(youmonst.data)) { pline("%s cuts deeply into you!", ! Monnam(magr)); *dmgptr *= 2; return TRUE; } --- 958,975 ---- mon_nam(mdef)); else if (vis) pline("%s cuts deeply into %s!", ! Monnam(magr), hittee); *dmgptr *= 2; return TRUE; } ! *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; ! pline("%s cuts %s in half!", wepdesc, mon_nam(mdef)); otmp->dknown = TRUE; return TRUE; } else { if (bigmonst(youmonst.data)) { pline("%s cuts deeply into you!", ! magr ? Monnam(magr) : wepdesc); *dmgptr *= 2; return TRUE; } *************** *** 965,972 **** * value to the damage so that this reduction in * damage does not prevent death. */ ! *dmgptr = (Upolyd ? u.mh : u.uhp) + FATAL_DAMAGE; ! pline_The("razor-sharp blade cuts you in half!"); otmp->dknown = TRUE; return TRUE; } --- 979,986 ---- * value to the damage so that this reduction in * damage does not prevent death. */ ! *dmgptr = 2 * (Upolyd ? u.mh : u.uhp) + FATAL_DAMAGE_MODIFIER; ! pline("%s cuts you in half!", wepdesc); otmp->dknown = TRUE; return TRUE; } *************** *** 979,984 **** --- 993,999 ---- if (youattack && u.uswallow && mdef == u.ustuck) return FALSE; + wepdesc = artilist[ART_VORPAL_BLADE].name; if (!youdefend) { if (!has_head(mdef->data) || notonhead || u.uswallow) { if (youattack) *************** *** 991,1022 **** return ((boolean)(youattack || vis)); } if (noncorporeal(mdef->data) || amorphous(mdef->data)) { ! pline("%s slices through %s %s.", ! artilist[ART_VORPAL_BLADE].name, ! s_suffix(mon_nam(mdef)), mbodypart(mdef,NECK)); return TRUE; } ! *dmgptr = mdef->mhp + FATAL_DAMAGE; pline(behead_msg[rn2(SIZE(behead_msg))], ! artilist[ART_VORPAL_BLADE].name, ! mon_nam(mdef)); otmp->dknown = TRUE; return TRUE; } else { if (!has_head(youmonst.data)) { pline("Somehow, %s misses you wildly.", ! mon_nam(magr)); *dmgptr = 0; return TRUE; } if (noncorporeal(youmonst.data) || amorphous(youmonst.data)) { pline("%s slices through your %s.", ! artilist[ART_VORPAL_BLADE].name, body_part(NECK)); return TRUE; } ! *dmgptr = (Upolyd ? u.mh : u.uhp) + FATAL_DAMAGE; pline(behead_msg[rn2(SIZE(behead_msg))], ! artilist[ART_VORPAL_BLADE].name, "you"); otmp->dknown = TRUE; /* Should amulets fall off? */ return TRUE; --- 1006,1037 ---- return ((boolean)(youattack || vis)); } if (noncorporeal(mdef->data) || amorphous(mdef->data)) { ! pline("%s slices through %s %s.", wepdesc, ! s_suffix(mon_nam(mdef)), ! mbodypart(mdef,NECK)); return TRUE; } ! *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; pline(behead_msg[rn2(SIZE(behead_msg))], ! wepdesc, mon_nam(mdef)); otmp->dknown = TRUE; return TRUE; } else { if (!has_head(youmonst.data)) { pline("Somehow, %s misses you wildly.", ! magr ? mon_nam(magr) : wepdesc); *dmgptr = 0; return TRUE; } if (noncorporeal(youmonst.data) || amorphous(youmonst.data)) { pline("%s slices through your %s.", ! wepdesc, body_part(NECK)); return TRUE; } ! *dmgptr = 2 * (Upolyd ? u.mh : u.uhp) ! + FATAL_DAMAGE_MODIFIER; pline(behead_msg[rn2(SIZE(behead_msg))], ! wepdesc, "you"); otmp->dknown = TRUE; /* Should amulets fall off? */ return TRUE; *************** *** 1036,1042 **** mon_nam(mdef)); } if (mdef->m_lev == 0) { ! *dmgptr = mdef->mhp + FATAL_DAMAGE; } else { int drain = rnd(8); *dmgptr += drain; --- 1051,1057 ---- mon_nam(mdef)); } if (mdef->m_lev == 0) { ! *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; } else { int drain = rnd(8); *dmgptr += drain; *************** *** 1060,1066 **** pline("%s drains your life!", The(distant_name(otmp, xname))); losexp("life drainage"); ! if (magr->mhp < magr->mhpmax) { magr->mhp += (u.uhpmax - oldhpmax)/2; if (magr->mhp > magr->mhpmax) magr->mhp = magr->mhpmax; } --- 1075,1081 ---- pline("%s drains your life!", The(distant_name(otmp, xname))); losexp("life drainage"); ! if (magr && magr->mhp < magr->mhpmax) { magr->mhp += (u.uhpmax - oldhpmax)/2; if (magr->mhp > magr->mhpmax) magr->mhp = magr->mhpmax; } *************** *** 1111,1127 **** switch(oart->inv_prop) { case TAMING: { ! struct obj *pseudo = mksobj(SPE_CHARM_MONSTER, FALSE, FALSE); ! pseudo->blessed = pseudo->cursed = 0; ! pseudo->quan = 20L; /* do not let useup get it */ ! (void) seffects(pseudo); ! obfree(pseudo, (struct obj *)0); /* now, get rid of it */ break; } case HEALING: { int healamt = (u.uhpmax + 1 - u.uhp) / 2; if (Upolyd) healamt = (u.mhmax + 1 - u.mh) / 2; ! if(healamt || Sick || (Blinded > 1)) You_feel("better."); else goto nothing_special; --- 1126,1144 ---- switch(oart->inv_prop) { case TAMING: { ! struct obj pseudo; ! ! pseudo = zeroobj; /* neither cursed nor blessed */ ! pseudo.otyp = SCR_TAMING; ! (void) seffects(&pseudo); break; } case HEALING: { int healamt = (u.uhpmax + 1 - u.uhp) / 2; + long creamed = (long)u.ucreamed; + if (Upolyd) healamt = (u.mhmax + 1 - u.mh) / 2; ! if (healamt || Sick || Blinded > creamed) You_feel("better."); else goto nothing_special; *************** *** 1131,1137 **** } if(Sick) make_sick(0L,(char *)0,FALSE,SICK_ALL); if(Slimed) Slimed = 0L; ! if(Blinded > 1) make_blinded(0L,FALSE); flags.botl = 1; break; } --- 1148,1154 ---- } if(Sick) make_sick(0L,(char *)0,FALSE,SICK_ALL); if(Slimed) Slimed = 0L; ! if (Blinded > creamed) make_blinded(creamed, FALSE); flags.botl = 1; break; } *************** *** 1162,1169 **** obj->age = 0; return 0; } ! b_effect = obj->blessed && (Role_switch == oart->role || !oart->role); recharge(otmp, b_effect ? 1 : obj->cursed ? -1 : 0); break; } case LEV_TELE: --- 1179,1188 ---- obj->age = 0; return 0; } ! b_effect = obj->blessed && ! (Role_switch == oart->role || !oart->role); recharge(otmp, b_effect ? 1 : obj->cursed ? -1 : 0); + update_inventory(); break; } case LEV_TELE: *************** *** 1276,1283 **** else You_feel("the tension decrease around you."); break; case LEVITATION: ! if(on) float_up(); ! else (void) float_down(I_SPECIAL|TIMEOUT, W_ARTI); break; case INVIS: if (!See_invisible && !Blind) { --- 1295,1304 ---- else You_feel("the tension decrease around you."); break; case LEVITATION: ! if(on) { ! float_up(); ! spoteffects(FALSE); ! } else (void) float_down(I_SPECIAL|TIMEOUT, W_ARTI); break; case INVIS: if (!See_invisible && !Blind) { *************** *** 1297,1302 **** --- 1318,1331 ---- } + /* WAC return TRUE if artifact is always lit */ + boolean + artifact_light(obj) + struct obj *obj; + { + return (get_artifact(obj) && obj->oartifact == ART_SUNSWORD); + } + /* KMH -- Talking artifacts are finally implemented */ void arti_speak(obj) struct obj *obj; *************** *** 1313,1323 **** line = getrumor(bcsign(obj), buf, TRUE); if (!*line) line = "NetHack rumors file closed for renovation."; ! pline("%s whispers:", The(xname(obj))); verbalize("%s", line); return; } #endif /* OVLB */ --- 1342,1374 ---- line = getrumor(bcsign(obj), buf, TRUE); if (!*line) line = "NetHack rumors file closed for renovation."; ! pline("%s:", Tobjnam(obj, "whisper")); verbalize("%s", line); return; } + boolean + artifact_has_invprop(otmp, inv_prop) + struct obj *otmp; + uchar inv_prop; + { + const struct artifact *arti = get_artifact(otmp); + + return((boolean)(arti && (arti->inv_prop == inv_prop))); + } + + /* Return the price sold to the hero of a given artifact or unique item */ + long + arti_cost(otmp) + struct obj *otmp; + { + if (!otmp->oartifact) + return ((long)objects[otmp->otyp].oc_cost); + else if (artilist[(int) otmp->oartifact].cost) + return (artilist[(int) otmp->oartifact].cost); + else + return (100L * (long)objects[otmp->otyp].oc_cost); + } #endif /* OVLB */ *** nethack-3.3.1/src/attrib.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/attrib.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)attrib.c 3.3 2000/05/17 */ /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)attrib.c 3.4 2000/05/17 */ /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 155,161 **** (incr > 1 || incr < -1) ? "very ": "", (incr > 0) ? plusattr[ndx] : minusattr[ndx]); flags.botl = 1; ! if (moves > 0 && (ndx == A_STR || ndx == A_CON)) (void)encumber_msg(); return TRUE; } --- 155,161 ---- (incr > 1 || incr < -1) ? "very ": "", (incr > 0) ? plusattr[ndx] : minusattr[ndx]); flags.botl = 1; ! if (moves > 1 && (ndx == A_STR || ndx == A_CON)) (void)encumber_msg(); return TRUE; } *************** *** 350,356 **** if(Sick || Vomiting) exercise(A_CON, FALSE); if(Confusion || Hallucination) exercise(A_WIS, FALSE); ! if(Wounded_legs || Fumbling || HStun) exercise(A_DEX, FALSE); } } --- 350,360 ---- if(Sick || Vomiting) exercise(A_CON, FALSE); if(Confusion || Hallucination) exercise(A_WIS, FALSE); ! if((Wounded_legs ! #ifdef STEED ! && !u.usteed ! #endif ! ) || Fumbling || HStun) exercise(A_DEX, FALSE); } } *** nethack-3.3.1/src/ball.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/ball.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)ball.c 3.3 97/04/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)ball.c 3.4 1997/04/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 345,351 **** /* return TRUE if ball could be dragged * ! * Should not be called while swallowed. */ boolean drag_ball(x, y, bc_control, ballx, bally, chainx, chainy, cause_delay) --- 345,352 ---- /* return TRUE if ball could be dragged * ! * Should not be called while swallowed. Should be called before movement, ! * because we might want to move the ball or chain to the hero's old position. */ boolean drag_ball(x, y, bc_control, ballx, bally, chainx, chainy, cause_delay) *************** *** 368,394 **** return TRUE; } ! if (carried(uball) || dist2(x, y, uball->ox, uball->oy) < 3 || ! (uball->ox == uchain->ox && uball->oy == uchain->oy)) { ! /* ! * Case where the ball doesn't move but the chain can't just move ! * to the player's position: ! * @ _ ! * _ moving southwest becomes @_ and not @ ! * 0 0 0 ! */ *bc_control = BC_CHAIN; move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); ! if (dist2(x, y, uball->ox, uball->oy) == 2 && ! dist2(x, y, uchain->ox, uchain->oy) == 4) { ! if (uchain->oy == y) ! *chainx = uball->ox; ! else ! *chainy = uball->oy; ! } else { ! *chainx = u.ux; ! *chainy = u.uy; } return TRUE; } --- 369,476 ---- return TRUE; } ! /* only need to move the chain? */ ! if (carried(uball) || distmin(x, y, uball->ox, uball->oy) <= 2) { *bc_control = BC_CHAIN; move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); ! if (carried(uball)) { ! /* move chain only if necessary; assume they didn't teleport */ ! if (distmin(x, y, uchain->ox, uchain->oy) > 1) { ! *chainx = u.ux; ! *chainy = u.uy; ! } ! return TRUE; ! } ! #define CHAIN_IN_MIDDLE(chx, chy) \ ! (distmin(x, y, chx, chy) <= 1 && distmin(chx, chy, uball->ox, uball->oy) <= 1) ! switch(dist2(x, y, uball->ox, uball->oy)) { ! /* two spaces diagonal from ball, move chain inbetween */ ! case 8: ! *chainx = (uball->ox + x)/2; ! *chainy = (uball->oy + y)/2; ! break; ! ! /* player is distance 2/1 from ball; move chain to one of the ! * two spaces between ! * @ ! * __ ! * 0 ! */ ! case 5: { ! xchar tempx, tempy, tempx2, tempy2; ! ! /* find position closest to current position of chain */ ! /* no effect if current position is already OK */ ! if (abs(x - uball->ox) == 1) { ! tempx = x; ! tempx2 = uball->ox; ! tempy = tempy2 = (uball->oy + y)/2; ! } else { ! tempx = tempx2 = (uball->ox + x)/2; ! tempy = y; ! tempy2 = uball->oy; ! } ! if (dist2(tempx, tempy, uchain->ox, uchain->oy) < ! dist2(tempx2, tempy2, uchain->ox, uchain->oy) || ! ((dist2(tempx, tempy, uchain->ox, uchain->oy) == ! dist2(tempx2, tempy2, uchain->ox, uchain->oy)) && rn2(2))) { ! *chainx = tempx; ! *chainy = tempy; ! } else { ! *chainx = tempx2; ! *chainy = tempy2; ! } ! break; ! } ! ! /* ball is two spaces horizontal or vertical from player; move*/ ! /* chain inbetween *unless* current chain position is OK */ ! case 4: ! if (CHAIN_IN_MIDDLE(uchain->ox, uchain->oy)) ! break; ! *chainx = (x + uchain->ox)/2; ! *chainy = (y + uchain->oy)/2; ! break; ! ! /* ball is one space diagonal from player. Check for the ! * following special case: ! * @ ! * _ moving southwest becomes @_ ! * 0 0 ! * (This will also catch teleporting that happens to resemble ! * this case, but oh well.) Otherwise fall through. ! */ ! case 2: ! if (dist2(x, y, uball->ox, uball->oy) == 2 && ! dist2(x, y, uchain->ox, uchain->oy) == 4) { ! if (uchain->oy == y) ! *chainx = uball->ox; ! else ! *chainy = uball->oy; ! break; ! } ! /* fall through */ ! case 1: ! case 0: ! /* do nothing if possible */ ! if (CHAIN_IN_MIDDLE(uchain->ox, uchain->oy)) ! break; ! /* otherwise try to drag chain to player's old position */ ! if (CHAIN_IN_MIDDLE(u.ux, u.uy)) { ! *chainx = u.ux; ! *chainy = u.uy; ! break; ! } ! /* otherwise use player's new position (they must have ! teleported, for this to happen) */ ! *chainx = x; ! *chainy = y; ! break; ! ! default: impossible("bad chain movement"); ! break; } + #undef CHAIN_IN_MIDDLE return TRUE; } *************** *** 559,567 **** while (otmp) { nextobj = otmp->nobj; if ((otmp != uball) && (rnd(capacity) <= (int)otmp->owt)) { ! if (otmp == uwep) ! setuwep((struct obj *)0); ! if ((otmp != uwep) && (canletgo(otmp, ""))) { Your("%s you down the stairs.", aobjnam(otmp, "follow")); dropx(otmp); --- 641,647 ---- while (otmp) { nextobj = otmp->nobj; if ((otmp != uball) && (rnd(capacity) <= (int)otmp->owt)) { ! if (canletgo(otmp, "")) { Your("%s you down the stairs.", aobjnam(otmp, "follow")); dropx(otmp); *** nethack-3.3.1/src/bones.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/bones.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)bones.c 3.3 2000/05/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)bones.c 3.4 2001/04/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 126,136 **** while ((otmp = invent) != 0) { obj_extract_self(otmp); otmp->owornmask = 0; /* lamps don't go out when dropped */ ! if (cont && obj_is_burning(otmp)) /* smother in statue */ ! end_burn(otmp, otmp->otyp != MAGIC_LAMP); if(otmp->otyp == SLIME_MOLD) goodfruit(otmp->spe); --- 126,137 ---- while ((otmp = invent) != 0) { obj_extract_self(otmp); + obj_no_longer_held(otmp); otmp->owornmask = 0; /* lamps don't go out when dropped */ ! if ((cont || artifact_light(otmp)) && obj_is_burning(otmp)) ! end_burn(otmp, TRUE); /* smother in statue */ if(otmp->otyp == SLIME_MOLD) goodfruit(otmp->spe); *************** *** 138,154 **** if (mtmp) (void) add_to_minv(mtmp, otmp); else if (cont) ! add_to_container(cont, otmp); else place_object(otmp, u.ux, u.uy); } if(u.ugold) { long ugold = u.ugold; if (mtmp) mtmp->mgold = ugold; ! else if (cont) add_to_container(cont, mkgoldobj(ugold)); else (void)mkgold(ugold, u.ux, u.uy); u.ugold = ugold; /* undo mkgoldobj()'s removal */ } } /* check whether bones are feasible */ --- 139,158 ---- if (mtmp) (void) add_to_minv(mtmp, otmp); else if (cont) ! (void) add_to_container(cont, otmp); else place_object(otmp, u.ux, u.uy); } + #ifndef GOLDOBJ if(u.ugold) { long ugold = u.ugold; if (mtmp) mtmp->mgold = ugold; ! else if (cont) (void) add_to_container(cont, mkgoldobj(ugold)); else (void)mkgold(ugold, u.ux, u.uy); u.ugold = ugold; /* undo mkgoldobj()'s removal */ } + #endif + if (cont) cont->owt = weight(cont); } /* check whether bones are feasible */ *************** *** 208,214 **** --- 212,220 ---- return; } + #ifdef WIZARD make_bones: + #endif unleash_all(); /* in case these characters are not in their home bases */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { *************** *** 220,233 **** mongone(mtmp); } #ifdef STEED ! if (u.usteed) { ! coord cc; ! ! /* Move the steed to an adjacent square */ ! if (enexto(&cc, u.ux, u.uy, u.usteed->data)) ! rloc_to(u.usteed, cc.x, cc.y); ! u.usteed = 0; ! } #endif dmonsfree(); /* discard dead or gone monsters */ --- 226,232 ---- mongone(mtmp); } #ifdef STEED ! if (u.usteed) dismount_steed(DISMOUNT_BONES); #endif dmonsfree(); /* discard dead or gone monsters */ *** nethack-3.3.1/src/botl.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/botl.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)botl.c 3.3 96/07/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)botl.c 3.4 1996/07/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 147,156 **** --- 147,163 ---- botl_score() { int deepest = deepest_lev_reached(FALSE); + #ifndef GOLDOBJ long ugold = u.ugold + hidden_gold(); if ((ugold -= u.ugold0) < 0L) ugold = 0L; return ugold + u.urexp + (long)(50 * (deepest - 1)) + #else + long umoney = money_cnt(invent) + hidden_gold(); + + if ((umoney -= u.umoney0) < 0L) umoney = 0L; + return umoney + u.urexp + (long)(50 * (deepest - 1)) + #endif + (long)(deepest > 30 ? 10000 : deepest > 20 ? 1000*(deepest - 20) : 0); } *************** *** 248,254 **** (void) describe_level(newbot2); Sprintf(nb = eos(newbot2), "%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", oc_syms[GOLD_CLASS], ! u.ugold, hp, hpmax, u.uen, u.uenmax, u.uac); if (Upolyd) Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel); --- 255,266 ---- (void) describe_level(newbot2); Sprintf(nb = eos(newbot2), "%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", oc_syms[GOLD_CLASS], ! #ifndef GOLDOBJ ! u.ugold, ! #else ! money_cnt(invent), ! #endif ! hp, hpmax, u.uen, u.uenmax, u.uac); if (Upolyd) Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel); *** nethack-3.3.1/src/cmd.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/cmd.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)cmd.c 3.3 2000/05/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)cmd.c 3.4 2002/01/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 14,19 **** --- 14,21 ---- #define NR_OF_EOFS 20 #endif + #define CMD_TRAVEL (char)0x90 + #ifdef DEBUG /* * only one "wiz_debug_cmd" routine should be available (in whatever *************** *** 105,110 **** --- 107,113 ---- STATIC_PTR int NDECL(timed_occupation); STATIC_PTR int NDECL(doextcmd); STATIC_PTR int NDECL(domonability); + STATIC_PTR int NDECL(dotravel); # ifdef WIZARD STATIC_PTR int NDECL(wiz_wish); STATIC_PTR int NDECL(wiz_identify); *************** *** 112,122 **** STATIC_PTR int NDECL(wiz_genesis); STATIC_PTR int NDECL(wiz_where); STATIC_PTR int NDECL(wiz_detect); STATIC_PTR int NDECL(wiz_level_tele); STATIC_PTR int NDECL(wiz_show_seenv); STATIC_PTR int NDECL(wiz_show_vision); STATIC_PTR int NDECL(wiz_show_wmodes); ! #ifdef __BORLANDC__ extern void FDECL(show_borlandc_stats, (winid)); #endif STATIC_DCL void FDECL(count_obj, (struct obj *, long *, long *, BOOLEAN_P, BOOLEAN_P)); --- 115,128 ---- STATIC_PTR int NDECL(wiz_genesis); STATIC_PTR int NDECL(wiz_where); STATIC_PTR int NDECL(wiz_detect); + STATIC_PTR int NDECL(wiz_polyself); STATIC_PTR int NDECL(wiz_level_tele); + STATIC_PTR int NDECL(wiz_level_change); STATIC_PTR int NDECL(wiz_show_seenv); STATIC_PTR int NDECL(wiz_show_vision); + STATIC_PTR int NDECL(wiz_mon_polycontrol); STATIC_PTR int NDECL(wiz_show_wmodes); ! #if defined(__BORLANDC__) && !defined(_WIN32) extern void FDECL(show_borlandc_stats, (winid)); #endif STATIC_DCL void FDECL(count_obj, (struct obj *, long *, long *, BOOLEAN_P, BOOLEAN_P)); *************** *** 138,143 **** --- 144,151 ---- #endif #endif /* OVLB */ + static const char* readchar_queue=""; + STATIC_DCL char *NDECL(parse); #ifdef OVL1 *************** *** 297,303 **** putstr(datawin, 0, ""); for(efp = extcmdlist; efp->ef_txt; efp++) { ! Sprintf(buf, " %-14s - %s.", efp->ef_txt, efp->ef_desc); putstr(datawin, 0, buf); } display_nhwindow(datawin, FALSE); --- 305,311 ---- putstr(datawin, 0, ""); for(efp = extcmdlist; efp->ef_txt; efp++) { ! Sprintf(buf, " %-15s - %s.", efp->ef_txt, efp->ef_desc); putstr(datawin, 0, buf); } display_nhwindow(datawin, FALSE); *************** *** 433,439 **** if (can_breathe(youmonst.data)) return dobreathe(); else if (attacktype(youmonst.data, AT_SPIT)) return dospit(); else if (youmonst.data->mlet == S_NYMPH) return doremove(); ! else if (youmonst.data->mlet == S_UMBER) return doconfuse(); else if (is_were(youmonst.data)) return dosummon(); else if (webmaker(youmonst.data)) return dospinweb(); else if (is_hider(youmonst.data)) return dohide(); --- 441,447 ---- if (can_breathe(youmonst.data)) return dobreathe(); else if (attacktype(youmonst.data, AT_SPIT)) return dospit(); else if (youmonst.data->mlet == S_NYMPH) return doremove(); ! else if (attacktype(youmonst.data, AT_GAZE)) return dogaze(); else if (is_were(youmonst.data)) return dosummon(); else if (webmaker(youmonst.data)) return dospinweb(); else if (is_hider(youmonst.data)) return dohide(); *************** *** 549,554 **** --- 557,617 ---- } STATIC_PTR int + wiz_mon_polycontrol() + { + iflags.mon_polycontrol = !iflags.mon_polycontrol; + pline("Monster polymorph control is %s.", + iflags.mon_polycontrol ? "on" : "off"); + return 0; + } + + STATIC_PTR int + wiz_level_change() + { + char buf[BUFSZ]; + int newlevel; + int ret; + + getlin("To what experience level do you want to be set?", buf); + (void)mungspaces(buf); + if (buf[0] == '\033' || buf[0] == '\0') ret = 0; + else ret = sscanf(buf, "%d", &newlevel); + + if (ret != 1) { + pline(Never_mind); + return 0; + } + if (newlevel == u.ulevel) { + You("are already that experienced."); + } else if (newlevel < u.ulevel) { + if (u.ulevel == 1) { + You("are already as inexperienced as you can get."); + return 0; + } + if (newlevel < 1) newlevel = 1; + while (u.ulevel > newlevel) + losexp((const char *)0); + } else { + if (u.ulevel >= MAXULEV) { + You("are already as experienced as you can get."); + return 0; + } + if (newlevel > MAXULEV) newlevel = MAXULEV; + while (u.ulevel < newlevel) + pluslvl(FALSE); + } + u.ulevelmax = u.ulevel; + return 0; + } + + STATIC_PTR int + wiz_polyself() + { + polyself(TRUE); + return 0; + } + + STATIC_PTR int wiz_show_seenv() { winid win; *************** *** 639,645 **** lev = &levl[x][y]; if (x == u.ux && y == u.uy) row[x] = '@'; ! if (IS_WALL(lev->typ) || lev->typ == SDOOR) row[x] = '0' + (lev->wall_info & WM_MASK); else if (lev->typ == CORR) row[x] = '#'; --- 702,708 ---- lev = &levl[x][y]; if (x == u.ux && y == u.uy) row[x] = '@'; ! else if (IS_WALL(lev->typ) || lev->typ == SDOOR) row[x] = '0' + (lev->wall_info & WM_MASK); else if (lev->typ == CORR) row[x] = '#'; *************** *** 743,748 **** --- 806,812 ---- if (Stone_resistance) you_are("petrification resistant"); if (Invulnerable) you_are("invulnerable"); + if (u.uedibility) you_can("recognize detrimental food"); /*** Troubles ***/ if (Halluc_resistance) *************** *** 758,763 **** --- 822,839 ---- if (u.usick_type & SICK_NONVOMITABLE) you_are("sick from illness"); } + /* added by JDS */ + if (u.uhitinc) { + Sprintf(buf, "%s%i %s to hit", u.uhitinc > 0 ? "+" : "", + u.uhitinc, u.uhitinc > 0 ? "bonus" : "penalty"); + you_have(buf); + + } + if (u.udaminc) { + Sprintf(buf, "%s%i %s to damage", u.udaminc > 0 ? "+" : "", + u.udaminc, u.udaminc > 0 ? "bonus" : "penalty"); + you_have(buf); + } /* end JDS portion */ } if (Stoned) you_are("turning to stone"); if (Slimed) you_are("turning into slime"); *************** *** 767,776 **** you_have(buf); } if (Fumbling) enl_msg("You fumble", "", "d", ""); ! if (Wounded_legs) { Sprintf(buf, "wounded %s", makeplural(body_part(LEG))); you_have(buf); } if (Sleeping) enl_msg("You ", "fall", "fell", " asleep"); if (Hunger) enl_msg("You hunger", "", "ed", " rapidly"); --- 843,864 ---- you_have(buf); } if (Fumbling) enl_msg("You fumble", "", "d", ""); ! if (Wounded_legs ! #ifdef STEED ! && !u.usteed ! #endif ! ) { Sprintf(buf, "wounded %s", makeplural(body_part(LEG))); you_have(buf); } + #if defined(WIZARD) && defined(STEED) + if (Wounded_legs && u.usteed && wizard) { + Strcpy(buf, x_monnam(u.usteed, ARTICLE_YOUR, (char *)0, + SUPPRESS_SADDLE | SUPPRESS_HALLUCINATION, FALSE)); + *buf = highc(*buf); + enl_msg(buf, " has", " had", " wounded legs"); + } + #endif if (Sleeping) enl_msg("You ", "fall", "fell", " asleep"); if (Hunger) enl_msg("You hunger", "", "ed", " rapidly"); *************** *** 790,795 **** --- 878,884 ---- if (Clairvoyant) you_are("clairvoyant"); if (Infravision) you_have("infravision"); if (Detect_monsters) you_are("sensing the presence of monsters"); + if (u.umconf) you_are("going to confuse monsters"); /*** Appearance and behavior ***/ if (Adornment) you_are("adorned"); *************** *** 959,964 **** --- 1048,1054 ---- anything any; char buf[BUFSZ], buf2[BUFSZ]; static char fmtstr[] = "%-15s: %-12s"; + static char deity_fmtstr[] = "%-17s%s"; any.a_void = 0; buf[0] = buf2[0] = '\0'; *************** *** 986,992 **** add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Current", FALSE); Sprintf(buf, fmtstr, "race", Upolyd ? youmonst.data->mname : urace.noun); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! if (!Upolyd) { Sprintf(buf, fmtstr, "role", (flags.female && urole.name.f) ? urole.name.f : urole.name.m); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); --- 1076,1086 ---- add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Current", FALSE); Sprintf(buf, fmtstr, "race", Upolyd ? youmonst.data->mname : urace.noun); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! if (Upolyd) { ! Sprintf(buf, fmtstr, "role (base)", ! (u.mfemale && urole.name.f) ? urole.name.f : urole.name.m); ! add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! } else { Sprintf(buf, fmtstr, "role", (flags.female && urole.name.f) ? urole.name.f : urole.name.m); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); *************** *** 1006,1012 **** /* Deity list */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Deities", FALSE); ! Sprintf(buf2, "%-17s%s", align_gname(A_CHAOTIC), (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_CHAOTIC) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_CHAOTIC) ? " (s)" : --- 1100,1106 ---- /* Deity list */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Deities", FALSE); ! Sprintf(buf2, deity_fmtstr, align_gname(A_CHAOTIC), (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_CHAOTIC) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_CHAOTIC) ? " (s)" : *************** *** 1014,1020 **** Sprintf(buf, fmtstr, "chaotic deity", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! Sprintf(buf2, "%-17s%s", align_gname(A_NEUTRAL), (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_NEUTRAL) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_NEUTRAL) ? " (s)" : --- 1108,1114 ---- Sprintf(buf, fmtstr, "chaotic deity", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! Sprintf(buf2, deity_fmtstr, align_gname(A_NEUTRAL), (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_NEUTRAL) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_NEUTRAL) ? " (s)" : *************** *** 1022,1028 **** Sprintf(buf, fmtstr, "neutral deity", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! Sprintf(buf2, "%-17s%s", align_gname(A_LAWFUL), (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_LAWFUL) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_LAWFUL) ? " (s)" : (u.ualign.type == A_LAWFUL) ? " (c)" : ""); --- 1116,1122 ---- Sprintf(buf, fmtstr, "neutral deity", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); ! Sprintf(buf2, deity_fmtstr, align_gname(A_LAWFUL), (u.ualignbase[A_ORIGINAL] == u.ualign.type && u.ualign.type == A_LAWFUL) ? " (s,c)" : (u.ualignbase[A_ORIGINAL] == A_LAWFUL) ? " (s)" : (u.ualign.type == A_LAWFUL) ? " (c)" : ""); *************** *** 1273,1278 **** --- 1367,1373 ---- {GOLD_SYM, TRUE, doprgold}, {SPBOOK_SYM, TRUE, dovspell}, /* Mike Stephenson */ {'#', TRUE, doextcmd}, + {'_', TRUE, dotravel}, {0,0,0,0} }; *************** *** 1295,1301 **** #ifdef STEED {"ride", "ride (or stop riding) a monster", doride, FALSE}, #endif ! {"rub", "rub a lamp", dorub, FALSE}, {"sit", "sit down", dosit, FALSE}, {"turn", "turn undead", doturn, TRUE}, {"twoweapon", "toggle two-weapon combat", dotwoweapon, FALSE}, --- 1390,1396 ---- #ifdef STEED {"ride", "ride (or stop riding) a monster", doride, FALSE}, #endif ! {"rub", "rub a lamp or a stone", dorub, FALSE}, {"sit", "sit down", dosit, FALSE}, {"turn", "turn undead", doturn, TRUE}, {"twoweapon", "toggle two-weapon combat", dotwoweapon, FALSE}, *************** *** 1314,1319 **** --- 1409,1417 ---- {(char *)0, (char *)0, donull, TRUE}, {(char *)0, (char *)0, donull, TRUE}, {(char *)0, (char *)0, donull, TRUE}, + {(char *)0, (char *)0, donull, TRUE}, + {(char *)0, (char *)0, donull, TRUE}, + {(char *)0, (char *)0, donull, TRUE}, #ifdef DEBUG {(char *)0, (char *)0, donull, TRUE}, #endif *************** *** 1324,1330 **** --- 1422,1431 ---- #if defined(WIZARD) static const struct ext_func_tab debug_extcmdlist[] = { + {"levelchange", "change experience level", wiz_level_change, TRUE}, {"light sources", "show mobile light sources", wiz_light_sources, TRUE}, + {"monpoly_control", "control monster polymorphs", wiz_mon_polycontrol, TRUE}, + {"poly", "polymorph self", wiz_polyself, TRUE}, {"seenv", "show seen vectors", wiz_show_seenv, TRUE}, {"stats", "show memory statistics", wiz_show_stats, TRUE}, {"timeout", "look at timeout queue", wiz_timeout_queue, TRUE}, *************** *** 1531,1537 **** Sprintf(buf, template, "Total", total_mon_count, total_mon_size); putstr(win, 0, buf); ! #ifdef __BORLANDC__ show_borlandc_stats(win); #endif --- 1632,1638 ---- Sprintf(buf, template, "Total", total_mon_count, total_mon_size); putstr(win, 0, buf); ! #if defined(__BORLANDC__) && !defined(_WIN32) show_borlandc_stats(win); #endif *************** *** 1589,1594 **** --- 1690,1696 ---- /* handle most movement commands */ do_walk = do_rush = prefix_seen = FALSE; + flags.travel = 0; switch (*cmd) { case 'g': if (movecmd(cmd[1])) { flags.run = 2; *************** *** 1635,1640 **** --- 1737,1748 ---- flags.move = FALSE; multi = 0; return; + case CMD_TRAVEL: + flags.travel = 1; + flags.run = 8; + flags.nopick = 1; + do_rush = TRUE; + break; default: if (movecmd(*cmd)) { /* ordinary movement */ do_walk = TRUE; } else if (movecmd(iflags.num_pad ? *************** *** 1768,1775 **** { char dirsym; ! #ifdef REDO ! if(in_doagain) dirsym = readchar(); else #endif --- 1876,1883 ---- { char dirsym; ! #ifdef REDO ! if(in_doagain || *readchar_queue) dirsym = readchar(); else #endif *************** *** 1817,1850 **** /* * convert a MAP window position into a movecmd */ ! int click_to_cmd(x, y, mod) int x, y, mod; { x -= u.ux; y -= u.uy; ! /* convert without using floating point, allowing sloppy clicking */ ! if(x > 2*abs(y)) ! x = 1, y = 0; ! else if(y > 2*abs(x)) ! x = 0, y = 1; ! else if(x < -2*abs(y)) ! x = -1, y = 0; ! else if(y < -2*abs(x)) ! x = 0, y = -1; ! else x = sgn(x), y = sgn(y); ! if(x == 0 && y == 0) /* map click on player to "rest" command */ ! return '.'; ! x = xytod(x, y); if(mod == CLICK_1) { ! return (iflags.num_pad ? ndir[x] : sdir[x]); } else { ! return (iflags.num_pad ? M(ndir[x]) : ! (sdir[x] - 'a' + 'A')); /* run command */ } } STATIC_OVL char * --- 1925,2009 ---- /* * convert a MAP window position into a movecmd */ ! const char * click_to_cmd(x, y, mod) int x, y, mod; { + int dir; + static char cmd[4]; + cmd[1]=0; + x -= u.ux; y -= u.uy; ! ! if ( abs(x) <= 1 && abs(y) <= 1 ) { x = sgn(x), y = sgn(y); + } else { + u.tx = u.ux+x; + u.ty = u.uy+y; + cmd[0] = CMD_TRAVEL; + return cmd; + } ! if(x == 0 && y == 0) { ! /* here */ ! if(IS_FOUNTAIN(levl[u.ux][u.uy].typ) || IS_SINK(levl[u.ux][u.uy].typ)) { ! cmd[0]=mod == CLICK_1 ? 'q' : M('d'); ! return cmd; ! } else if(IS_THRONE(levl[u.ux][u.uy].typ)) { ! cmd[0]=M('s'); ! return cmd; ! } else if((u.ux == xupstair && u.uy == yupstair) ! || (u.ux == sstairs.sx && u.uy == sstairs.sy && sstairs.up) ! || (u.ux == xupladder && u.uy == yupladder)) { ! return "<"; ! } else if((u.ux == xdnstair && u.uy == ydnstair) ! || (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up) ! || (u.ux == xdnladder && u.uy == ydnladder)) { ! return ">"; ! } else if(OBJ_AT(u.ux, u.uy)) { ! cmd[0] = Is_container(level.objects[u.ux][u.uy]) ? M('l') : ','; ! return cmd; ! } else { ! return "."; /* just rest */ ! } ! } ! ! /* directional commands */ ! ! dir = xytod(x, y); ! ! if (!m_at(u.ux+x, u.uy+y) && !test_move(u.ux, u.uy, x, y, 1)) { ! cmd[1] = (iflags.num_pad ? ndir[dir] : sdir[dir]); ! cmd[2] = 0; ! if (IS_DOOR(levl[u.ux+x][u.uy+y].typ)) { ! /* slight assistance to the player: choose kick/open for them */ ! if (levl[u.ux+x][u.uy+y].doormask & D_LOCKED) { ! cmd[0] = C('d'); ! return cmd; ! } ! if (levl[u.ux+x][u.uy+y].doormask & D_CLOSED) { ! cmd[0] = 'o'; ! return cmd; ! } ! } ! if (levl[u.ux+x][u.uy+y].typ <= SCORR) { ! cmd[0] = 's'; ! cmd[1] = 0; ! return cmd; ! } ! } ! /* move, attack, etc. */ ! cmd[1] = 0; if(mod == CLICK_1) { ! cmd[0] = (iflags.num_pad ? ndir[dir] : sdir[dir]); } else { ! cmd[0] = (iflags.num_pad ? M(ndir[dir]) : ! (sdir[dir] - 'a' + 'A')); /* run command */ } + + return cmd; } STATIC_OVL char * *************** *** 1941,1950 **** register int sym; int x = u.ux, y = u.uy, mod = 0; #ifdef REDO ! sym = in_doagain ? Getchar() : nh_poskey(&x, &y, &mod); #else ! sym = Getchar(); #endif #ifdef UNIX --- 2100,2112 ---- register int sym; int x = u.ux, y = u.uy, mod = 0; + if ( *readchar_queue ) + sym = *readchar_queue++; + else #ifdef REDO ! sym = in_doagain ? Getchar() : nh_poskey(&x, &y, &mod); #else ! sym = Getchar(); #endif #ifdef UNIX *************** *** 1966,1975 **** end_of_input(); #endif /* UNIX */ ! if(sym == 0) /* click event */ ! sym = click_to_cmd(x, y, mod); return((char) sym); } #endif /* OVL0 */ /*cmd.c*/ --- 2128,2162 ---- end_of_input(); #endif /* UNIX */ ! if(sym == 0) { ! /* click event */ ! readchar_queue = click_to_cmd(x, y, mod); ! sym = *readchar_queue++; ! } return((char) sym); } + + STATIC_PTR int + dotravel() + { + /* Keyboard travel command */ + static char cmd[2]; + coord cc; + cmd[1]=0; + cc.x = u.ux; + cc.y = u.uy; + pline("Where do you want to travel to?"); + if (getpos(&cc, TRUE, "the desired destination") < 0) { + /* user pressed ESC */ + return 0; + } + u.tx = cc.x; + u.ty = cc.y; + cmd[0] = CMD_TRAVEL; + readchar_queue = cmd; + return 0; + } + #endif /* OVL0 */ /*cmd.c*/ *** nethack-3.3.1/src/dbridge.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dbridge.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dbridge.c 3.3 2000/02/05 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dbridge.c 3.4 2000/02/05 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 336,374 **** const char *verb; { static char wholebuf[80]; - char verbbuf[30]; Strcpy(wholebuf, is_u(etmp) ? "You" : Monnam(etmp->emon)); ! if (!*verb) ! return(wholebuf); Strcat(wholebuf, " "); - verbbuf[0] = '\0'; if (is_u(etmp)) ! Strcpy(verbbuf, verb); ! else { ! if (!strcmp(verb, "are")) ! Strcpy(verbbuf, "is"); ! if (!strcmp(verb, "have")) ! Strcpy(verbbuf, "has"); ! if (!verbbuf[0]) { ! Strcpy(verbbuf, verb); ! switch (verbbuf[strlen(verbbuf) - 1]) { ! case 'y': ! verbbuf[strlen(verbbuf) - 1] = '\0'; ! Strcat(verbbuf, "ies"); ! break; ! case 'h': ! case 'o': ! case 's': ! Strcat(verbbuf, "es"); ! break; ! default: ! Strcat(verbbuf, "s"); ! break; ! } ! } ! } ! Strcat(wholebuf, verbbuf); return(wholebuf); } --- 336,349 ---- const char *verb; { static char wholebuf[80]; Strcpy(wholebuf, is_u(etmp) ? "You" : Monnam(etmp->emon)); ! if (!*verb) return(wholebuf); Strcat(wholebuf, " "); if (is_u(etmp)) ! Strcat(wholebuf, verb); ! else ! Strcat(wholebuf, vtense((char *)0, verb)); return(wholebuf); } *** nethack-3.3.1/src/decl.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/decl.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)decl.c 3.3 99/05/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)decl.c 3.2 2001/12/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 20,26 **** --- 20,28 ---- NEARDATA int bases[MAXOCLASSES] = DUMMY; NEARDATA int multi = 0; + #if 0 NEARDATA int warnlevel = 0; /* used by movemon and dochugw */ + #endif NEARDATA int nroom = 0; NEARDATA int nsubroom = 0; NEARDATA int occtime = 0; *************** *** 48,53 **** --- 50,58 ---- NEARDATA int killer_format = 0; const char *killer = 0; const char *delayed_killer = 0; + #ifdef GOLDOBJ + NEARDATA long done_money = 0; + #endif char killer_buf[BUFSZ] = DUMMY; const char *nomovemsg = 0; const char nul[40] = DUMMY; /* contains zeros */ *************** *** 70,75 **** --- 75,82 ---- const char ynNaqchars[] = "yn#aq"; NEARDATA long yn_number = 0L; + const char disclosure_options[] = "iavgc"; + #ifdef MICRO char hackdir[PATHLEN]; /* where rumors, help, record are */ char levels[PATHLEN]; /* where levels are */ *************** *** 97,102 **** --- 104,113 ---- NEARDATA schar tbx = 0, tby = 0; /* mthrowu: target */ + /* for xname handling of multiple shot missile volleys: + number of shots, index of current one, validity check, shoot vs throw */ + NEARDATA struct multishot m_shot = { 0, 0, STRANGE_OBJECT, FALSE }; + NEARDATA struct dig_info digging; NEARDATA dungeon dungeons[MAXDUNGEON]; /* ini'ed by init_dungeon() */ *************** *** 184,199 **** /* used to zero all elements of a struct obj */ NEARDATA struct obj zeroobj = DUMMY; - /* monster pronouns, index is return value of gender(mtmp) */ - const char *he[3] = { "he", "she", "it" }; - const char *him[3] = { "him", "her", "it" }; - const char *his[3] = { "his", "her", "its" }; - /* originally from dog.c */ NEARDATA char dogname[PL_PSIZ] = DUMMY; NEARDATA char catname[PL_PSIZ] = DUMMY; NEARDATA char horsename[PL_PSIZ] = DUMMY; ! char preferred_pet; /* '\0', 'c', 'd' */ /* monsters that went down/up together with @ */ NEARDATA struct monst *mydogs = (struct monst *)0; /* monsters that are moving to another dungeon level */ --- 195,205 ---- /* used to zero all elements of a struct obj */ NEARDATA struct obj zeroobj = DUMMY; /* originally from dog.c */ NEARDATA char dogname[PL_PSIZ] = DUMMY; NEARDATA char catname[PL_PSIZ] = DUMMY; NEARDATA char horsename[PL_PSIZ] = DUMMY; ! char preferred_pet; /* '\0', 'c', 'd', 'n' (none) */ /* monsters that went down/up together with @ */ NEARDATA struct monst *mydogs = (struct monst *)0; /* monsters that are moving to another dungeon level */ *************** *** 208,217 **** "white" }; struct c_common_strings c_common_strings = { "Nothing happens.", "That's enough tries!", "That is a silly thing to %s.", "shudder for a moment.", ! "something", "Something", "You can move again.", "Never mind." }; /* NOTE: the order of these words exactly corresponds to the --- 214,243 ---- "white" }; + const char *c_obj_colors[] = { + "black", /* CLR_BLACK */ + "red", /* CLR_RED */ + "green", /* CLR_GREEN */ + "brown", /* CLR_BROWN */ + "blue", /* CLR_BLUE */ + "magenta", /* CLR_MAGENTA */ + "cyan", /* CLR_CYAN */ + "gray", /* CLR_GRAY */ + "transparent", /* no_color */ + "orange", /* CLR_ORANGE */ + "bright green", /* CLR_BRIGHT_GREEN */ + "yellow", /* CLR_YELLOW */ + "bright blue", /* CLR_BRIGHT_BLUE */ + "bright magenta", /* CLR_BRIGHT_MAGENTA */ + "bright cyan", /* CLR_BRIGHT_CYAN */ + "white", /* CLR_WHITE */ + }; + struct c_common_strings c_common_strings = { "Nothing happens.", "That's enough tries!", "That is a silly thing to %s.", "shudder for a moment.", ! "something", "Something", "You can move again.", "Never mind.", ! "vision quickly clears." }; /* NOTE: the order of these words exactly corresponds to the *** nethack-3.3.1/src/detect.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/detect.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)detect.c 3.3 1999/12/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)detect.c 3.4 1999/12/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 13,20 **** extern boolean known; /* from read.c */ STATIC_DCL void FDECL(do_dknown_of, (struct obj *)); ! STATIC_DCL boolean FDECL(check_map_spot, (int,int,CHAR_P)); ! STATIC_DCL boolean FDECL(clear_stale_map, (CHAR_P)); STATIC_DCL void FDECL(sense_trap, (struct trap *,XCHAR_P,XCHAR_P,int)); STATIC_DCL void FDECL(show_map_spot, (int,int)); STATIC_PTR void FDECL(findone,(int,int,genericptr_t)); --- 13,20 ---- extern boolean known; /* from read.c */ STATIC_DCL void FDECL(do_dknown_of, (struct obj *)); ! STATIC_DCL boolean FDECL(check_map_spot, (int,int,CHAR_P,unsigned)); ! STATIC_DCL boolean FDECL(clear_stale_map, (CHAR_P,unsigned)); STATIC_DCL void FDECL(sense_trap, (struct trap *,XCHAR_P,XCHAR_P,int)); STATIC_DCL void FDECL(show_map_spot, (int,int)); STATIC_PTR void FDECL(findone,(int,int,genericptr_t)); *************** *** 40,45 **** --- 40,65 ---- return (struct obj *) 0; } + /* Recursively search obj for an object made of specified material and return 1st found */ + struct obj * + o_material(obj, material) + struct obj* obj; + unsigned material; + { + register struct obj* otmp; + struct obj *temp; + + if (objects[obj->otyp].oc_material == material) return obj; + + if (Has_contents(obj)) { + for (otmp = obj->cobj; otmp; otmp = otmp->nobj) + if (objects[otmp->otyp].oc_material == material) return otmp; + else if (Has_contents(otmp) && (temp = o_material(otmp, material))) + return temp; + } + return (struct obj *) 0; + } + STATIC_OVL void do_dknown_of(obj) struct obj *obj; *************** *** 55,63 **** /* Check whether the location has an outdated object displayed on it. */ STATIC_OVL boolean ! check_map_spot(x, y, oclass) int x, y; register char oclass; { register int glyph; register struct obj *otmp; --- 75,84 ---- /* Check whether the location has an outdated object displayed on it. */ STATIC_OVL boolean ! check_map_spot(x, y, oclass, material) int x, y; register char oclass; + unsigned material; { register int glyph; register struct obj *otmp; *************** *** 69,88 **** if (oclass == ALL_CLASSES) { return((boolean)( !(level.objects[x][y] || /* stale if nothing here */ ((mtmp = m_at(x,y)) != 0 && ! (mtmp->mgold || mtmp->minvent))))); ! } else if (objects[glyph_to_obj(glyph)].oc_class == oclass) { ! /* the object shown here is of interest */ ! for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) ! if (o_in(otmp, oclass)) return FALSE; ! /* didn't find it; perhaps a monster is carrying it */ ! if ((mtmp = m_at(x,y)) != 0) { ! if (oclass == GOLD_CLASS && mtmp->mgold) ! return FALSE; ! else for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) ! if (o_in(otmp, oclass)) return FALSE; } ! /* detection indicates removal of this object from the map */ ! return TRUE; } } return FALSE; --- 90,134 ---- if (oclass == ALL_CLASSES) { return((boolean)( !(level.objects[x][y] || /* stale if nothing here */ ((mtmp = m_at(x,y)) != 0 && ! ( ! #ifndef GOLDOBJ ! mtmp->mgold || ! #endif ! mtmp->minvent))))); ! } else { ! if (material && objects[glyph_to_obj(glyph)].oc_material == material) { ! /* the object shown here is of interest because material matches */ ! for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) ! if (o_material(otmp, GOLD)) return FALSE; ! /* didn't find it; perhaps a monster is carrying it */ ! if ((mtmp = m_at(x,y)) != 0) { ! for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) ! if (o_material(otmp, GOLD)) return FALSE; ! } ! /* detection indicates removal of this object from the map */ ! return TRUE; } ! if (oclass && objects[glyph_to_obj(glyph)].oc_class == oclass) { ! /* the object shown here is of interest because its class matches */ ! for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) ! if (o_in(otmp, oclass)) return FALSE; ! /* didn't find it; perhaps a monster is carrying it */ ! #ifndef GOLDOBJ ! if ((mtmp = m_at(x,y)) != 0) { ! if (oclass == GOLD_CLASS && mtmp->mgold) ! return FALSE; ! else for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) ! if (o_in(otmp, oclass)) return FALSE; ! } ! #else ! if ((mtmp = m_at(x,y)) != 0) { ! for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) ! if (o_in(otmp, oclass)) return FALSE; ! } ! #endif ! /* detection indicates removal of this object from the map */ ! return TRUE; ! } } } return FALSE; *************** *** 95,109 **** change occurs. */ STATIC_OVL boolean ! clear_stale_map(oclass) register char oclass; { register int zx, zy; register boolean change_made = FALSE; for (zx = 1; zx < COLNO; zx++) for (zy = 0; zy < ROWNO; zy++) ! if (check_map_spot(zx, zy, oclass)) { unmap_object(zx, zy); change_made = TRUE; } --- 141,156 ---- change occurs. */ STATIC_OVL boolean ! clear_stale_map(oclass, material) register char oclass; + unsigned material; { register int zx, zy; register boolean change_made = FALSE; for (zx = 1; zx < COLNO; zx++) for (zy = 0; zy < ROWNO; zy++) ! if (check_map_spot(zx, zy, oclass,material)) { unmap_object(zx, zy); change_made = TRUE; } *************** *** 122,152 **** struct obj *temp; boolean stale; ! known = stale = clear_stale_map(GOLD_CLASS); /* look for gold carried by monsters (might be in a container) */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; /* probably not needed in this case but... */ if (mtmp->mgold || monsndx(mtmp->data) == PM_GOLD_GOLEM) { known = TRUE; goto outgoldmap; /* skip further searching */ } else for (obj = mtmp->minvent; obj; obj = obj->nobj) ! if (o_in(obj, GOLD_CLASS)) { known = TRUE; goto outgoldmap; /* skip further searching */ } } /* look for gold objects */ ! for (obj = fobj; obj; obj = obj->nobj) ! if (o_in(obj, GOLD_CLASS)) { known = TRUE; if (obj->ox != u.ux || obj->oy != u.uy) goto outgoldmap; } if (!known) { ! /* no gold found */ ! if (sobj) strange_feeling(sobj, "You feel materially poor."); return(1); } /* only under me - no separate display required */ --- 169,228 ---- struct obj *temp; boolean stale; ! known = stale = clear_stale_map(GOLD_CLASS, ! (unsigned)(sobj->blessed ? GOLD : 0)); /* look for gold carried by monsters (might be in a container) */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; /* probably not needed in this case but... */ + #ifndef GOLDOBJ if (mtmp->mgold || monsndx(mtmp->data) == PM_GOLD_GOLEM) { + #else + if (findgold(mtmp->minvent) || monsndx(mtmp->data) == PM_GOLD_GOLEM) { + #endif known = TRUE; goto outgoldmap; /* skip further searching */ } else for (obj = mtmp->minvent; obj; obj = obj->nobj) ! if (sobj->blessed && o_material(obj, GOLD)) { ! known = TRUE; ! goto outgoldmap; ! } else if (o_in(obj, GOLD_CLASS)) { known = TRUE; goto outgoldmap; /* skip further searching */ } } /* look for gold objects */ ! for (obj = fobj; obj; obj = obj->nobj) { ! if (sobj->blessed && o_material(obj, GOLD)) { ! known = TRUE; ! if (obj->ox != u.ux || obj->oy != u.uy) goto outgoldmap; ! } else if (o_in(obj, GOLD_CLASS)) { known = TRUE; if (obj->ox != u.ux || obj->oy != u.uy) goto outgoldmap; } + } if (!known) { ! /* no gold found on floor or monster's inventory. ! adjust message if you have gold in your inventory */ ! if (sobj) { ! char buf[BUFSZ]; ! if (youmonst.data == &mons[PM_GOLD_GOLEM]) { ! Sprintf(buf, "You feel like a million %s!", ! currency(2L)); ! } else if (hidden_gold() || ! #ifndef GOLDOBJ ! u.ugold) ! #else ! money_cnt(invent)) ! #endif ! Strcpy(buf, ! "You feel worried about your future financial situation."); ! else ! Strcpy(buf, "You feel materially poor."); ! strange_feeling(sobj, buf); ! } return(1); } /* only under me - no separate display required */ *************** *** 159,175 **** u.uinwater = 0; /* Discover gold locations. */ ! for (obj = fobj; obj; obj = obj->nobj) ! if ((temp = o_in(obj, GOLD_CLASS))) { if (temp != obj) { temp->ox = obj->ox; temp->oy = obj->oy; } map_object(temp,1); } for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; /* probably overkill here */ if (mtmp->mgold || monsndx(mtmp->data) == PM_GOLD_GOLEM) { struct obj gold; gold.otyp = GOLD_PIECE; --- 235,262 ---- u.uinwater = 0; /* Discover gold locations. */ ! for (obj = fobj; obj; obj = obj->nobj) { ! if (sobj->blessed && (temp = o_material(obj, GOLD))) { ! if (temp != obj) { ! temp->ox = obj->ox; ! temp->oy = obj->oy; ! } ! map_object(temp,1); ! } else if ((temp = o_in(obj, GOLD_CLASS))) { if (temp != obj) { temp->ox = obj->ox; temp->oy = obj->oy; } map_object(temp,1); } + } for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; /* probably overkill here */ + #ifndef GOLDOBJ if (mtmp->mgold || monsndx(mtmp->data) == PM_GOLD_GOLEM) { + #else + if (findgold(mtmp->minvent) || monsndx(mtmp->data) == PM_GOLD_GOLEM) { + #endif struct obj gold; gold.otyp = GOLD_PIECE; *************** *** 177,183 **** gold.oy = mtmp->my; map_object(&gold,1); } else for (obj = mtmp->minvent; obj; obj = obj->nobj) ! if ((temp = o_in(obj, GOLD_CLASS))) { temp->ox = mtmp->mx; temp->oy = mtmp->my; map_object(temp,1); --- 264,275 ---- gold.oy = mtmp->my; map_object(&gold,1); } else for (obj = mtmp->minvent; obj; obj = obj->nobj) ! if (sobj->blessed && (temp = o_material(obj, GOLD))) { ! temp->ox = mtmp->mx; ! temp->oy = mtmp->my; ! map_object(temp,1); ! break; ! } else if ((temp = o_in(obj, GOLD_CLASS))) { temp->ox = mtmp->mx; temp->oy = mtmp->my; map_object(temp,1); *************** *** 210,216 **** const char *what = confused ? something : "food"; int uw = u.uinwater; ! stale = clear_stale_map(oclass); for (obj = fobj; obj; obj = obj->nobj) if (o_in(obj, oclass)) { --- 302,308 ---- const char *what = confused ? something : "food"; int uw = u.uinwater; ! stale = clear_stale_map(oclass, 0); for (obj = fobj; obj; obj = obj->nobj) if (o_in(obj, oclass)) { *************** *** 231,242 **** if (stale) { docrt(); You("sense a lack of %s nearby.", what); ! } else if (sobj) ! strange_feeling(sobj, "Your nose twitches."); return !stale; } else if (!ct) { known = TRUE; You("%s %s nearby.", sobj ? "smell" : "sense", what); } else { struct obj *temp; known = TRUE; --- 323,353 ---- if (stale) { docrt(); You("sense a lack of %s nearby.", what); ! if (sobj && sobj->blessed) { ! if (!u.uedibility) Your("%s starts to tingle.", body_part(NOSE)); ! u.uedibility = 1; ! } ! } else if (sobj) { ! char buf[BUFSZ]; ! Sprintf(buf, "Your %s twitches%s.", body_part(NOSE), ! (sobj->blessed && !u.uedibility) ? " then starts to tingle" : ""); ! if (sobj->blessed && !u.uedibility) { ! boolean savebeginner = flags.beginner; /* prevent non-delivery of */ ! flags.beginner = FALSE; /* message */ ! strange_feeling(sobj, buf); ! flags.beginner = savebeginner; ! u.uedibility = 1; ! } else ! strange_feeling(sobj, buf); ! } return !stale; } else if (!ct) { known = TRUE; You("%s %s nearby.", sobj ? "smell" : "sense", what); + if (sobj && sobj->blessed) { + if (!u.uedibility) pline("Your %s starts to tingle.", body_part(NOSE)); + u.uedibility = 1; + } } else { struct obj *temp; known = TRUE; *************** *** 260,266 **** break; /* skip rest of this monster's inventory */ } newsym(u.ux,u.uy); ! if (sobj) Your("nose tingles and you smell %s.", what); else You("sense %s.", what); display_nhwindow(WIN_MAP, TRUE); exercise(A_WIS, TRUE); --- 371,384 ---- break; /* skip rest of this monster's inventory */ } newsym(u.ux,u.uy); ! if (sobj) { ! if (sobj->blessed) { ! Your("%s %s to tingle and you smell %s.", body_part(NOSE), ! u.uedibility ? "continues" : "starts", what); ! u.uedibility = 1; ! } else ! Your("%s tingles and you smell %s.", body_part(NOSE), what); ! } else You("sense %s.", what); display_nhwindow(WIN_MAP, TRUE); exercise(A_WIS, TRUE); *************** *** 329,341 **** } if ((is_cursed && mtmp->m_ap_type == M_AP_OBJECT && (!class || class == objects[mtmp->mappearance].oc_class)) || (mtmp->mgold && (!class || class == GOLD_CLASS))) { ct++; break; } } ! if (!clear_stale_map(!class ? ALL_CLASSES : class) && !ct) { if (!ctu) { if (detector) strange_feeling(detector, "You feel a lack of something."); --- 447,463 ---- } if ((is_cursed && mtmp->m_ap_type == M_AP_OBJECT && (!class || class == objects[mtmp->mappearance].oc_class)) || + #ifndef GOLDOBJ (mtmp->mgold && (!class || class == GOLD_CLASS))) { + #else + (findgold(mtmp->minvent) && (!class || class == GOLD_CLASS))) { + #endif ct++; break; } } ! if (!clear_stale_map(!class ? ALL_CLASSES : class, 0) && !ct) { if (!ctu) { if (detector) strange_feeling(detector, "You feel a lack of something."); *************** *** 407,413 **** --- 529,539 ---- temp.oy = mtmp->my; temp.corpsenm = PM_TENGU; /* if mimicing a corpse */ map_object(&temp, 1); + #ifndef GOLDOBJ } else if (mtmp->mgold && (!class || class == GOLD_CLASS)) { + #else + } else if (findgold(mtmp->minvent) && (!class || class == GOLD_CLASS)) { + #endif struct obj gold; gold.otyp = GOLD_PIECE; *************** *** 551,560 **** else found = TRUE; } } ! for (door = 0; door <= doorindex; door++) { cc = doors[door]; if (levl[cc.x][cc.y].doormask & D_TRAPPED) { ! if (cc.x != u.ux || cc.x != u.uy) goto outtrapmap; else found = TRUE; } --- 677,686 ---- else found = TRUE; } } ! for (door = 0; door < doorindex; door++) { cc = doors[door]; if (levl[cc.x][cc.y].doormask & D_TRAPPED) { ! if (cc.x != u.ux || cc.y != u.uy) goto outtrapmap; else found = TRUE; } *************** *** 579,585 **** if ((obj->otyp==LARGE_BOX || obj->otyp==CHEST) && obj->otrapped) sense_trap((struct trap *)0, obj->ox, obj->oy, sobj && sobj->cursed); ! for (door = 0; door <= doorindex; door++) { cc = doors[door]; if (levl[cc.x][cc.y].doormask & D_TRAPPED) sense_trap((struct trap *)0, cc.x, cc.y, sobj && sobj->cursed); --- 705,711 ---- if ((obj->otyp==LARGE_BOX || obj->otyp==CHEST) && obj->otrapped) sense_trap((struct trap *)0, obj->ox, obj->oy, sobj && sobj->cursed); ! for (door = 0; door < doorindex; door++) { cc = doors[door]; if (levl[cc.x][cc.y].doormask & D_TRAPPED) sense_trap((struct trap *)0, cc.x, cc.y, sobj && sobj->cursed); *************** *** 643,674 **** { char ch; int oops; - const char *bname = xname(obj); if (Blind) { ! pline("Too bad you can't see %s", the(bname)); return; } oops = (rnd(20) > ACURR(A_INT) || obj->cursed); if (oops && (obj->spe > 0)) { switch (rnd(obj->oartifact ? 4 : 5)) { ! case 1 : pline("%s is too much to comprehend!", The(bname)); break; ! case 2 : pline("%s confuses you!", The(bname)); make_confused(HConfusion + rnd(100),FALSE); break; case 3 : if (!resists_blnd(&youmonst)) { ! pline("%s damages your vision!", The(bname)); make_blinded(Blinded + rnd(100),FALSE); } else { ! pline("%s assaults your vision.", The(bname)); You("are unaffected!"); } break; ! case 4 : pline("%s zaps your mind!", The(bname)); make_hallucinated(HHallucination + rnd(100),FALSE,0L); break; ! case 5 : pline("%s explodes!", The(bname)); useup(obj); losehp(rnd(30), "exploding crystal ball", KILLED_BY_AN); break; --- 769,800 ---- { char ch; int oops; if (Blind) { ! pline("Too bad you can't see %s.", the(xname(obj))); return; } oops = (rnd(20) > ACURR(A_INT) || obj->cursed); if (oops && (obj->spe > 0)) { switch (rnd(obj->oartifact ? 4 : 5)) { ! case 1 : pline("%s too much to comprehend!", Tobjnam(obj, "are")); break; ! case 2 : pline("%s you!", Tobjnam(obj, "confuse")); make_confused(HConfusion + rnd(100),FALSE); break; case 3 : if (!resists_blnd(&youmonst)) { ! pline("%s your vision!", Tobjnam(obj, "damage")); make_blinded(Blinded + rnd(100),FALSE); + if (!Blind) Your(vision_clears); } else { ! pline("%s your vision.", Tobjnam(obj, "assault")); You("are unaffected!"); } break; ! case 4 : pline("%s your mind!", Tobjnam(obj, "zap")); make_hallucinated(HHallucination + rnd(100),FALSE,0L); break; ! case 5 : pline("%s!", Tobjnam(obj, "explode")); useup(obj); losehp(rnd(30), "exploding crystal ball", KILLED_BY_AN); break; *************** *** 711,717 **** if (flags.verbose) pline(Never_mind); return; } ! You("peer into %s...", the(bname)); nomul(-rnd(10)); nomovemsg = ""; if (obj->spe <= 0) --- 837,843 ---- if (flags.verbose) pline(Never_mind); return; } ! You("peer into %s...", the(xname(obj))); nomul(-rnd(10)); nomovemsg = ""; if (obj->spe <= 0) *************** *** 853,862 **** --- 979,991 ---- if(levl[zx][zy].typ == SDOOR) { cvt_sdoor_to_door(&levl[zx][zy]); /* .typ = DOOR */ + magic_map_background(zx, zy, 0); newsym(zx, zy); (*(int*)num)++; } else if(levl[zx][zy].typ == SCORR) { levl[zx][zy].typ = CORR; + unblock_point(zx,zy); + magic_map_background(zx, zy, 0); newsym(zx, zy); (*(int*)num)++; } else if ((ttmp = t_at(zx, zy)) != 0) { *************** *** 918,927 **** --- 1047,1058 ---- levl[zx][zy].doormask = D_NODOOR; } else levl[zx][zy].doormask = D_ISOPEN; + unblock_point(zx, zy); newsym(zx, zy); (*(int*)num)++; } else if(levl[zx][zy].typ == SCORR) { levl[zx][zy].typ = CORR; + unblock_point(zx, zy); newsym(zx, zy); (*(int*)num)++; } else if ((ttmp = t_at(zx, zy)) != 0) { *************** *** 970,983 **** struct trap *trap; { int tt = what_trap(trap->ttyp); - You("find %s.", an(defsyms[trap_to_defsym(tt)].explanation)); trap->tseen = 1; exercise(A_WIS, TRUE); if (Blind) feel_location(trap->tx, trap->ty); else newsym(trap->tx, trap->ty); } int --- 1101,1129 ---- struct trap *trap; { int tt = what_trap(trap->ttyp); + boolean cleared = FALSE; trap->tseen = 1; exercise(A_WIS, TRUE); if (Blind) feel_location(trap->tx, trap->ty); else newsym(trap->tx, trap->ty); + + if (levl[trap->tx][trap->ty].glyph != trap_to_glyph(trap)) { + /* There's too much clutter to see your find otherwise */ + cls(); + map_trap(trap, 1); + display_self(); + cleared = TRUE; + } + + You("find %s.", an(defsyms[trap_to_defsym(tt)].explanation)); + + if (cleared) { + display_nhwindow(WIN_MAP, TRUE); /* wait */ + docrt(); + } } int *************** *** 1003,1009 **** } else { int fund = (uwep && uwep->oartifact && spec_ability(uwep, SPFX_SEARCH)) ? ! ((uwep->spe > 5) ? 5 : uwep->spe) : 0; for(x = u.ux-1; x < u.ux+2; x++) for(y = u.uy-1; y < u.uy+2; y++) { if(!isok(x,y)) continue; --- 1149,1158 ---- } else { int fund = (uwep && uwep->oartifact && spec_ability(uwep, SPFX_SEARCH)) ? ! uwep->spe : 0; ! if (ublindf && ublindf->otyp == LENSES && !Blind) ! fund += 2; /* JDS: lenses help searching */ ! if (fund > 5) fund = 5; for(x = u.ux-1; x < u.ux+2; x++) for(y = u.uy-1; y < u.uy+2; y++) { if(!isok(x,y)) continue; *************** *** 1045,1062 **** You_feel("an unseen monster!"); map_invisible(x, y); } ! } else You("find %s.", a_monnam(mtmp)); return(1); } ! if(mtmp->mundetected && ! (is_hider(mtmp->data) || mtmp->data->mlet == S_EEL)) { ! mtmp->mundetected = 0; newsym(x,y); goto find; } - if (!canspotmon(mtmp)) - goto find; } /* see if an invisible monster has moved--if Blind, --- 1194,1210 ---- You_feel("an unseen monster!"); map_invisible(x, y); } ! } else if (!sensemon(mtmp)) You("find %s.", a_monnam(mtmp)); return(1); } ! if(!canspotmon(mtmp)) { ! if (mtmp->mundetected && ! (is_hider(mtmp->data) || mtmp->data->mlet == S_EEL)) ! mtmp->mundetected = 0; newsym(x,y); goto find; } } /* see if an invisible monster has moved--if Blind, *** nethack-3.3.1/src/dig.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dig.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dig.c 3.3 2000/04/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dig.c 3.4 2001/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 134,139 **** --- 134,148 ---- IS_TREE(levl[x][y].typ) ? 4: 0); } + boolean + is_digging() + { + if (occupation == dig) { + return TRUE; + } + return FALSE; + } + #define BY_YOU (&youmonst) #define BY_OBJECT ((struct monst *)0) *************** *** 211,234 **** } } if(Fumbling && !rn2(3)) { ! switch(rn2(3)) { ! case 0: if(!welded(uwep)) { ! You("fumble and drop your %s.", xname(uwep)); ! dropx(uwep); ! setuwep((struct obj *)0); ! } else { ! pline("Ouch! Your %s bounces and hits you!", ! xname(uwep)); ! set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); ! } ! break; ! case 1: pline("Bang! You hit with the broad side of %s!", ! the(xname(uwep))); ! break; ! default: Your("swing misses its mark."); ! break; ! } ! return(0); } digging.effort += 10 + rn2(5) + abon() + --- 220,253 ---- } } if(Fumbling && !rn2(3)) { ! switch(rn2(3)) { ! case 0: ! if(!welded(uwep)) { ! You("fumble and drop your %s.", xname(uwep)); ! dropx(uwep); ! } else { ! #ifdef STEED ! if (u.usteed) ! Your("%s %s and %s %s!", ! xname(uwep), ! otense(uwep, "bounce"), otense(uwep, "hit"), ! mon_nam(u.usteed)); ! else ! #endif ! pline("Ouch! Your %s %s and %s you!", ! xname(uwep), ! otense(uwep, "bounce"), otense(uwep, "hit")); ! set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); ! } ! break; ! case 1: ! pline("Bang! You hit with the broad side of %s!", ! the(xname(uwep))); ! break; ! default: Your("swing misses its mark."); ! break; ! } ! return(0); } digging.effort += 10 + rn2(5) + abon() + *************** *** 276,282 **** --- 295,308 ---- */ digtxt = (char *)0; } else if ((obj = sobj_at(BOULDER, dpx, dpy)) != 0) { + struct obj *bobj; + fracture_rock(obj); + if ((bobj = sobj_at(BOULDER, dpx, dpy)) != 0) { + /* another boulder here, restack it to the top */ + obj_extract_self(bobj); + place_object(bobj, dpx, dpy); + } digtxt = "The boulder falls apart."; } else if (lev->typ == STONE || lev->typ == SCORR || IS_TREE(lev->typ)) { *************** *** 326,337 **** lev->doormask = D_BROKEN; } else return(0); /* statue or boulder got taken */ ! unblock_point(dpx,dpy); /* vision: can see through */ if(Blind) feel_location(dpx, dpy); else newsym(dpx, dpy); ! if(digtxt) pline(digtxt); /* after newsym */ if(dmgtxt) pay_for_damage(dmgtxt); --- 352,364 ---- lev->doormask = D_BROKEN; } else return(0); /* statue or boulder got taken */ ! if(!does_block(dpx,dpy,&levl[dpx][dpy])) ! unblock_point(dpx,dpy); /* vision: can see through */ if(Blind) feel_location(dpx, dpy); else newsym(dpx, dpy); ! if(digtxt && !digging.quiet) pline(digtxt); /* after newsym */ if(dmgtxt) pay_for_damage(dmgtxt); *************** *** 356,361 **** --- 383,390 ---- newsym(dpx, dpy); } cleanup: + digging.lastdigtime = moves; + digging.quiet = FALSE; digging.level.dnum = 0; digging.level.dlevel = -1; return(0); *************** *** 462,468 **** ttyp = PIT; } ! Strcpy(surface_type, surface(x,y)); /* maketrap() might change it */ shopdoor = IS_DOOR(lev->typ) && *in_rooms(x, y, SHOPBASE); oldobjs = level.objects[x][y]; ttmp = maketrap(x, y, ttyp); --- 491,502 ---- ttyp = PIT; } ! /* maketrap() might change it, also, in this situation, ! surface() returns an inappropriate string for a grave */ ! if (IS_GRAVE(lev->typ)) ! Strcpy(surface_type, "grave"); ! else ! Strcpy(surface_type, surface(x,y)); shopdoor = IS_DOOR(lev->typ) && *in_rooms(x, y, SHOPBASE); oldobjs = level.objects[x][y]; ttmp = maketrap(x, y, ttyp); *************** *** 746,754 **** char dirsyms[12]; char qbuf[QBUFSZ]; register char *dsp = dirsyms; - register struct rm *lev; register int rx, ry; ! int dig_target, res = 0; register const char *sdp; if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ --- 780,787 ---- char dirsyms[12]; char qbuf[QBUFSZ]; register char *dsp = dirsyms; register int rx, ry; ! int res = 0; register const char *sdp; if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ *************** *** 777,782 **** --- 810,831 ---- Sprintf(qbuf, "In what direction do you want to dig? [%s]", dirsyms); if(!getdir(qbuf)) return(res); + + return(use_pick_axe2(obj)); + } + + /* MRKR: use_pick_axe() is split in two to allow autodig to bypass */ + /* the "In what direction do you want to dig?" query. */ + /* use_pick_axe2() uses the existing u.dx, u.dy and u.dz */ + + int + use_pick_axe2(obj) + struct obj *obj; + { + register int rx, ry; + register struct rm *lev; + int dig_target; + if (u.uswallow && attack(u.ustuck)) { ; /* return(1) */ } else if (Underwater) { *************** *** 793,802 **** dam = rnd(2) + dbon() + obj->spe; if (dam <= 0) dam = 1; You("hit yourself with %s.", yname(uwep)); ! /* self_pronoun() won't work twice in a sentence */ ! Strcpy(buf, self_pronoun("killed %sself with %%s pick-axe", ! "him")); ! losehp(dam, self_pronoun(buf, "his"), NO_KILLER_PREFIX); flags.botl=1; return(1); } else if(u.dz == 0) { --- 842,850 ---- dam = rnd(2) + dbon() + obj->spe; if (dam <= 0) dam = 1; You("hit yourself with %s.", yname(uwep)); ! Sprintf(buf, "%s own %s", uhis(), ! OBJ_NAME(objects[obj->otyp])); ! losehp(dam, buf, KILLED_BY); flags.botl=1; return(1); } else if(u.dz == 0) { *************** *** 820,827 **** seetrap(trap); There("is a spider web there!"); } ! Your("%s becomes entangled in the web.", ! aobjnam(obj, (char *)0)); /* you ought to be able to let go; tough luck */ /* (maybe `move_into_trap()' would be better) */ nomul(-d(2,2)); --- 868,875 ---- seetrap(trap); There("is a spider web there!"); } ! Your("%s entangled in the web.", ! aobjnam(obj, "become")); /* you ought to be able to let go; tough luck */ /* (maybe `move_into_trap()' would be better) */ nomul(-d(2,2)); *************** *** 837,856 **** "chopping at the door", "cutting the tree" }; if (digging.pos.x != rx || digging.pos.y != ry || !on_level(&digging.level, &u.uz) || digging.down) { digging.down = digging.chew = FALSE; digging.pos.x = rx; digging.pos.y = ry; assign_level(&digging.level, &u.uz); digging.effort = 0; ! You("start %s.", d_action[dig_target]); } else { You("%s %s.", digging.chew ? "begin" : "continue", d_action[dig_target]); digging.chew = FALSE; } - did_dig_msg = FALSE; set_occupation(dig, "digging", 0); } } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { --- 885,916 ---- "chopping at the door", "cutting the tree" }; + did_dig_msg = FALSE; + digging.quiet = FALSE; if (digging.pos.x != rx || digging.pos.y != ry || !on_level(&digging.level, &u.uz) || digging.down) { + if (flags.autodig && !dig_target && !digging.down && + digging.pos.x == u.ux && + digging.pos.y == u.uy && + (moves <= digging.lastdigtime+2 && + moves >= digging.lastdigtime)) { + /* avoid messages if repeated autodigging */ + did_dig_msg = TRUE; + digging.quiet = TRUE; + } digging.down = digging.chew = FALSE; + digging.warned = FALSE; digging.pos.x = rx; digging.pos.y = ry; assign_level(&digging.level, &u.uz); digging.effort = 0; ! if (!digging.quiet) ! You("start %s.", d_action[dig_target]); } else { You("%s %s.", digging.chew ? "begin" : "continue", d_action[dig_target]); digging.chew = FALSE; } set_occupation(dig, "digging", 0); } } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { *************** *** 867,872 **** --- 927,933 ---- !on_level(&digging.level, &u.uz) || !digging.down) { digging.chew = FALSE; digging.down = TRUE; + digging.warned = FALSE; digging.pos.x = u.ux; digging.pos.y = u.uy; assign_level(&digging.level, &u.uz); *************** *** 881,886 **** --- 942,997 ---- return(1); } + /* + * Town Watchmen frown on damage to the town walls or fountains. + * It's OK to dig holes in the ground, however. + * If mtmp is assumed to be a watchman, a watchman is found if mtmp == 0 + * zap == TRUE if wand/spell of digging, FALSE otherwise (chewing) + */ + void + watch_dig(mtmp, x, y, zap) + struct monst *mtmp; + xchar x, y; + boolean zap; + { + s_level *slev = Is_special(&u.uz); + struct rm *lev = &levl[x][y]; + + if (slev && slev->flags.town && + (closed_door(x, y) || lev->typ == SDOOR || + IS_WALL(lev->typ) || IS_FOUNTAIN(lev->typ))) { + if (!mtmp) { + for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { + if (DEADMONSTER(mtmp)) continue; + if ((mtmp->data == &mons[PM_WATCHMAN] || + mtmp->data == &mons[PM_WATCH_CAPTAIN]) && + mtmp->mcansee && m_canseeu(mtmp) && + couldsee(mtmp->mx, mtmp->my) && mtmp->mpeaceful) + break; + } + } + + if (mtmp) { + if(zap || digging.warned) { + verbalize("Halt, vandal! You're under arrest!"); + (void) angry_guards(!(flags.soundok)); + } else { + char *str; + if (IS_DOOR(lev->typ)) + str = "door"; + else if (IS_WALL(lev->typ)) + str = "wall"; + else + str = "fountain"; + verbalize("Hey, stop damaging that %s!", str); + digging.warned = TRUE; + } + if (is_digging()) + stop_occupation(); + } + } + } + #endif /* OVLB */ #ifdef OVL0 *************** *** 949,955 **** if (pile && pile < 5) /* leave behind some rocks? */ (void) mksobj_at((pile == 1) ? BOULDER : ROCK, ! mtmp->mx, mtmp->my, TRUE); newsym(mtmp->mx, mtmp->my); if (!sobj_at(BOULDER, mtmp->mx, mtmp->my)) unblock_point(mtmp->mx, mtmp->my); /* vision */ --- 1060,1066 ---- if (pile && pile < 5) /* leave behind some rocks? */ (void) mksobj_at((pile == 1) ? BOULDER : ROCK, ! mtmp->mx, mtmp->my, TRUE, FALSE); newsym(mtmp->mx, mtmp->my); if (!sobj_at(BOULDER, mtmp->mx, mtmp->my)) unblock_point(mtmp->mx, mtmp->my); /* vision */ *************** *** 983,989 **** if (!is_whirly(mtmp->data)) { if (is_animal(mtmp->data)) ! You("pierce %s stomach wall!", s_suffix(mon_nam(mtmp))); mtmp->mhp = 1; /* almost dead */ expels(mtmp, mtmp->data, !is_animal(mtmp->data)); } --- 1094,1101 ---- if (!is_whirly(mtmp->data)) { if (is_animal(mtmp->data)) ! You("pierce %s %s wall!", ! s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH)); mtmp->mhp = 1; /* almost dead */ expels(mtmp, mtmp->data, !is_animal(mtmp->data)); } *************** *** 1001,1012 **** pline("It falls on your %s!", body_part(HEAD)); losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), "falling rock", KILLED_BY_AN); ! if ((otmp = mksobj_at(ROCK, u.ux, u.uy, FALSE)) != 0) { (void)xname(otmp); /* set dknown, maybe bknown */ stackobj(otmp); } if (Invisible) newsym(u.ux, u.uy); } else { (void) dighole(FALSE); } } --- 1113,1126 ---- pline("It falls on your %s!", body_part(HEAD)); losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), "falling rock", KILLED_BY_AN); ! otmp = mksobj_at(ROCK, u.ux, u.uy, FALSE, FALSE); ! if (otmp) { (void)xname(otmp); /* set dknown, maybe bknown */ stackobj(otmp); } if (Invisible) newsym(u.ux, u.uy); } else { + watch_dig((struct monst *)0, u.ux, u.uy, TRUE); (void) dighole(FALSE); } } *************** *** 1034,1039 **** --- 1148,1154 ---- room->typ = DOOR; else if (cansee(zx, zy)) pline_The("door is razed!"); + watch_dig((struct monst *)0, zx, zy, TRUE); room->doormask = D_NODOOR; unblock_point(zx,zy); /* vision */ digdepth -= 2; *************** *** 1065,1070 **** --- 1180,1186 ---- add_damage(zx, zy, 200L); shopwall = TRUE; } + watch_dig((struct monst *)0, zx, zy, TRUE); if (level.flags.is_cavernous_lev) { room->typ = CORR; } else { *************** *** 1232,1241 **** x = obj->ox; y = obj->oy; } else if (in_invent) { ! if (flags.verbose) ! Your("%s%s rot%s away%c", ! obj == uwep ? "wielded " : "", corpse_xname(obj, FALSE), ! obj->quan == 1L ? "s" : "", obj == uwep ? '!' : '.'); if (obj == uwep) { uwepgone(); /* now bare handed */ stop_occupation(); --- 1348,1359 ---- x = obj->ox; y = obj->oy; } else if (in_invent) { ! if (flags.verbose) { ! char *cname = corpse_xname(obj, FALSE); ! Your("%s%s %s away%c", ! obj == uwep ? "wielded " : nul, cname, ! vtense(cname, "rot"), obj == uwep ? '!' : '.'); ! } if (obj == uwep) { uwepgone(); /* now bare handed */ stop_occupation(); *************** *** 1248,1254 **** } } else if (obj->where == OBJ_MINVENT && obj->owornmask) { if (obj == MON_WEP(obj->ocarry)) { ! obj->owornmask &= ~W_WEP; MON_NOWEP(obj->ocarry); } } --- 1366,1372 ---- } } else if (obj->where == OBJ_MINVENT && obj->owornmask) { if (obj == MON_WEP(obj->ocarry)) { ! setmnotwielded(obj->ocarry,obj); MON_NOWEP(obj->ocarry); } } *** nethack-3.3.1/src/display.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/display.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)display.c 3.3 2000/07/27 */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)display.c 3.4 2000/07/27 */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 337,342 **** --- 337,345 ---- _map_location(x,y,show); } + #define DETECTED 2 + #define PHYSICALLY_SEEN 1 + #define is_worm_tail(mon) ((mon) && ((x != (mon)->mx) || (y != (mon)->my))) /* * display_monster() *************** *** 350,359 **** * */ STATIC_OVL void ! display_monster(x, y, mon, in_sight, worm_tail) register xchar x, y; /* display position */ register struct monst *mon; /* monster to display */ ! int in_sight; /* TRUE if the monster is physically seen */ register xchar worm_tail; /* mon is actually a worm tail */ { register boolean mon_mimic = (mon->m_ap_type != M_AP_NOTHING); --- 353,363 ---- * */ STATIC_OVL void ! display_monster(x, y, mon, sightflags, worm_tail) register xchar x, y; /* display position */ register struct monst *mon; /* monster to display */ ! int sightflags; /* 1 if the monster is physically seen */ ! /* 2 if detected using Detect_monsters */ register xchar worm_tail; /* mon is actually a worm tail */ { register boolean mon_mimic = (mon->m_ap_type != M_AP_NOTHING); *************** *** 366,372 **** * the mimic was mimicing. */ ! if (mon_mimic && in_sight) { switch (mon->m_ap_type) { default: impossible("display_monster: bad m_ap_type value [ = %d ]", --- 370,376 ---- * the mimic was mimicing. */ ! if (mon_mimic && sightflags) { switch (mon->m_ap_type) { default: impossible("display_monster: bad m_ap_type value [ = %d ]", *************** *** 403,409 **** } case M_AP_MONSTER: ! show_glyph(x,y, monnum_to_glyph(what_mon(mon->mappearance))); break; } --- 407,413 ---- } case M_AP_MONSTER: ! show_glyph(x,y, monnum_to_glyph(what_mon((int)mon->mappearance))); break; } *************** *** 413,419 **** if (!mon_mimic || sensed) { int num; ! if (Detect_monsters) { if (worm_tail) num = detected_monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)); else --- 417,426 ---- if (!mon_mimic || sensed) { int num; ! /* [ALI] Only use detected glyphs when monster wouldn't be ! * visible by any other means. ! */ ! if (sightflags == DETECTED) { if (worm_tail) num = detected_monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)); else *************** *** 589,595 **** } /* draw monster on top if we can sense it */ if ((x != u.ux || y != u.uy) && (mon = m_at(x,y)) && sensemon(mon)) ! display_monster(x,y,mon,1,((x != mon->mx) || (y != mon->my))); } /* --- 596,604 ---- } /* draw monster on top if we can sense it */ if ((x != u.ux || y != u.uy) && (mon = m_at(x,y)) && sensemon(mon)) ! display_monster(x, y, mon, ! (tp_sensemon(mon) || MATCH_WARN_OF_MON(mon)) ? PHYSICALLY_SEEN : DETECTED, ! is_worm_tail(mon)); } /* *************** *** 653,667 **** } else { mon = m_at(x,y); ! worm_tail = mon && ((x != mon->mx) || (y != mon->my)); ! if (mon && ! ((see_it = (worm_tail ! ? (!mon->minvis || See_invisible) ! : (mon_visible(mon)) || sensemon(mon))))) { _map_location(x,y,0); /* map under the monster */ /* also gets rid of any invisibility glyph */ ! display_monster(x,y,mon,see_it,worm_tail); } else if (glyph_is_invisible(levl[x][y].glyph)) map_invisible(x, y); else --- 662,688 ---- } else { mon = m_at(x,y); ! worm_tail = is_worm_tail(mon); ! see_it = mon && (worm_tail ! ? (!mon->minvis || See_invisible) ! : (mon_visible(mon)) || tp_sensemon(mon) || MATCH_WARN_OF_MON(mon)); ! if (mon && (see_it || (!worm_tail && Detect_monsters))) { ! if (mon->mtrapped) { ! struct trap *trap = t_at(x, y); ! int tt = trap ? trap->ttyp : NO_TRAP; ! ! /* if monster is in a physical trap, you see the trap too */ ! if (tt == BEAR_TRAP || tt == PIT || ! tt == SPIKED_PIT ||tt == WEB) { ! trap->tseen = TRUE; ! } ! } _map_location(x,y,0); /* map under the monster */ /* also gets rid of any invisibility glyph */ ! display_monster(x, y, mon, see_it ? PHYSICALLY_SEEN : DETECTED, worm_tail); } + else if (mon && mon_warning(mon) && !is_worm_tail(mon)) + display_warning(mon); else if (glyph_is_invisible(levl[x][y].glyph)) map_invisible(x, y); else *************** *** 677,691 **** if (canseeself()) display_self(); } else if ((mon = m_at(x,y)) ! && (sensemon(mon) ! || (see_with_infrared(mon) && mon_visible(mon))) ! && !((x != mon->mx) || (y != mon->my))) { /* Monsters are printed every time. */ /* This also gets rid of any invisibility glyph */ ! display_monster(x,y,mon,0,0); } else if ((mon = m_at(x,y)) && mon_warning(mon) && ! !((x != mon->mx) || (y != mon->my))) { display_warning(mon); } --- 698,713 ---- if (canseeself()) display_self(); } else if ((mon = m_at(x,y)) ! && ((see_it = (tp_sensemon(mon) || MATCH_WARN_OF_MON(mon) ! || (see_with_infrared(mon) && mon_visible(mon)))) ! || Detect_monsters) ! && !is_worm_tail(mon)) { /* Monsters are printed every time. */ /* This also gets rid of any invisibility glyph */ ! display_monster(x, y, mon, see_it ? 0 : DETECTED, 0); } else if ((mon = m_at(x,y)) && mon_warning(mon) && ! !is_worm_tail(mon)) { display_warning(mon); } *************** *** 725,730 **** --- 747,753 ---- } } + #undef is_worm_tail /* * shieldeff() *************** *** 738,743 **** --- 761,767 ---- { register int i; + if (!flags.sparkle) return; if (cansee(x,y)) { /* Don't see anything if can't see the location */ for (i = 0; i < SHIELD_COUNT; i++) { show_glyph(x, y, cmap_to_glyph(shield_static[i])); *************** *** 1183,1188 **** --- 1207,1214 ---- text = "swallow border"; offset = glyph - GLYPH_SWALLOW_OFF; } else if (glyph >= GLYPH_ZAP_OFF) { /* zap beam */ text = "zap beam"; offset = glyph - GLYPH_ZAP_OFF; + } else if (glyph >= GLYPH_EXPLODE_OFF) { /* explosion */ + text = "explosion"; offset = glyph - GLYPH_EXPLODE_OFF; } else if (glyph >= GLYPH_CMAP_OFF) { /* cmap */ text = "cmap_index"; offset = glyph - GLYPH_CMAP_OFF; } else if (glyph >= GLYPH_OBJ_OFF) { /* object */ *** nethack-3.3.1/src/dlb.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dlb.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dlb.c 3.3 97/07/29 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dlb.c 3.4 1997/07/29 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 349,354 **** --- 349,361 ---- c = *bp; } *bp = '\0'; + + #if defined(MSDOS) || defined(WIN32) + if ((bp = index(buf, '\r')) != 0) { + *bp++ = '\n'; + *bp = '\0'; + } + #endif return buf; } *** nethack-3.3.1/src/do.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/do.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)do.c 3.3 1999/11/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)do.c 3.4 2001/11/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 48,58 **** int dodrop() { int result, i = (invent || u.ugold) ? 0 : (SIZE(drop_types) - 1); ! if (*u.ushops) sellobj_state(TRUE); result = drop(getobj(&drop_types[i], "drop")); ! if (*u.ushops) sellobj_state(FALSE); reset_occupations(); return result; --- 48,62 ---- int dodrop() { + #ifndef GOLDOBJ int result, i = (invent || u.ugold) ? 0 : (SIZE(drop_types) - 1); + #else + int result, i = (invent) ? 0 : (SIZE(drop_types) - 1); + #endif ! if (*u.ushops) sellobj_state(SELL_DELIBERATE); result = drop(getobj(&drop_types[i], "drop")); ! if (*u.ushops) sellobj_state(SELL_NORMAL); reset_occupations(); return result; *************** *** 162,175 **** if (((mtmp = m_at(x, y)) && mtmp->mtrapped) || (u.utrap && u.ux == x && u.uy == y)) { if (*verb) ! pline_The("boulder %ss into the pit%s.", verb, (mtmp) ? "" : " with you"); if (mtmp) { if (!passes_walls(mtmp->data) && !throws_rocks(mtmp->data)) { ! if (hmon(mtmp, obj, TRUE)) return FALSE; /* still alive */ ! } else mtmp->mtrapped = 0; } else { if (!Passes_walls && !throws_rocks(youmonst.data)) { losehp(rnd(15), "squished under a boulder", --- 166,181 ---- if (((mtmp = m_at(x, y)) && mtmp->mtrapped) || (u.utrap && u.ux == x && u.uy == y)) { if (*verb) ! pline_The("boulder %s into the pit%s.", ! vtense((const char *)0, verb), (mtmp) ? "" : " with you"); if (mtmp) { if (!passes_walls(mtmp->data) && !throws_rocks(mtmp->data)) { ! if (hmon(mtmp, obj, TRUE) && !is_whirly(mtmp->data)) return FALSE; /* still alive */ ! } ! mtmp->mtrapped = 0; } else { if (!Passes_walls && !throws_rocks(youmonst.data)) { losehp(rnd(15), "squished under a boulder", *************** *** 197,202 **** --- 203,210 ---- bury_objs(x, y); newsym(x,y); return TRUE; + } else if (is_lava(x, y)) { + return fire_damage(obj, FALSE, FALSE, x, y); } else if (is_pool(x, y)) { water_damage(obj, FALSE, FALSE); } *************** *** 210,229 **** doaltarobj(obj) /* obj is an object dropped on an altar */ register struct obj *obj; { ! if (Blind) return; /* KMH, conduct */ u.uconduct.gnostic++; if (obj->blessed || obj->cursed) { ! There("is %s flash as %s hit%s the altar.", an(hcolor(obj->blessed ? amber : Black)), ! doname(obj), ! (obj->quan == 1L) ? "s" : ""); if (!Hallucination) obj->bknown = 1; } else { ! pline("%s land%s on the altar.", Doname2(obj), ! (obj->quan == 1L) ? "s" : ""); obj->bknown = 1; } } --- 218,237 ---- doaltarobj(obj) /* obj is an object dropped on an altar */ register struct obj *obj; { ! if (Blind || obj->oclass == GOLD_CLASS) ! return; /* KMH, conduct */ u.uconduct.gnostic++; if (obj->blessed || obj->cursed) { ! There("is %s flash as %s %s the altar.", an(hcolor(obj->blessed ? amber : Black)), ! doname(obj), otense(obj, "hit")); if (!Hallucination) obj->bknown = 1; } else { ! pline("%s %s on the altar.", Doname2(obj), ! otense(obj, "land")); obj->bknown = 1; } } *************** *** 302,309 **** if (otmp != uball && otmp != uchain && !obj_resists(otmp, 1, 99)) { if (!Blind) { ! pline("Suddenly, %s vanishes from the sink!", ! doname(otmp)); ideed = TRUE; } delobj(otmp); --- 310,317 ---- if (otmp != uball && otmp != uchain && !obj_resists(otmp, 1, 99)) { if (!Blind) { ! pline("Suddenly, %s %s from the sink!", ! doname(otmp), otense(otmp, "vanish")); ideed = TRUE; } delobj(otmp); *************** *** 446,452 **** return(0); } setuwep((struct obj *)0); - if(uwep) return 0; /* lifesaved and rewielded */ } if(obj == uquiver) { setuqwep((struct obj *)0); --- 454,459 ---- *************** *** 458,467 **** if (u.uswallow) { /* barrier between you and the floor */ if(flags.verbose) ! You("drop %s into %s %s.", doname(obj), ! s_suffix(mon_nam(u.ustuck)), ! is_animal(u.ustuck->data) ? ! "stomach" : "interior"); } else { #ifdef SINKS if((obj->oclass == RING_CLASS || obj->otyp == MEAT_RING) && --- 465,478 ---- if (u.uswallow) { /* barrier between you and the floor */ if(flags.verbose) ! { ! char buf[BUFSZ]; ! ! /* doname can call s_suffix, reusing its buffer */ ! Strcpy(buf, s_suffix(mon_nam(u.ustuck))); ! You("drop %s into %s %s.", doname(obj), buf, ! mbodypart(u.ustuck, STOMACH)); ! } } else { #ifdef SINKS if((obj->oclass == RING_CLASS || obj->otyp == MEAT_RING) && *************** *** 491,498 **** dropx(obj) register struct obj *obj; { ! /* Money is usually not in our inventory */ if (obj->oclass != GOLD_CLASS || obj == invent) freeinv(obj); if (!u.uswallow && ship_object(obj, u.ux, u.uy, FALSE)) return; dropy(obj); } --- 502,518 ---- dropx(obj) register struct obj *obj; { ! #ifndef GOLDOBJ if (obj->oclass != GOLD_CLASS || obj == invent) freeinv(obj); + #else + /* Ensure update when we drop gold objects */ + if (obj->oclass == GOLD_CLASS) flags.botl = 1; + /* Money is usually not in our inventory */ + /*if (obj->oclass != GOLD_CLASS || obj == invent)*/ + /* !!!! make sure we don't drop "created" gold not in inventory any more,*/ + /* or this will crash !!!! */ + freeinv(obj); + #endif if (!u.uswallow && ship_object(obj, u.ux, u.uy, FALSE)) return; dropy(obj); } *************** *** 501,527 **** dropy(obj) register struct obj *obj; { if (!u.uswallow && flooreffects(obj,u.ux,u.uy,"drop")) return; - /* KMH -- Fixed crysknives have only 10% chance of reverting */ - if (obj->otyp == CRYSKNIFE && (!obj->oerodeproof || !rn2(10))) { - obj->otyp = WORM_TOOTH; - obj->oerodeproof = 0; - } /* uswallow check done by GAN 01/29/87 */ if(u.uswallow) { ! if (obj != uball) { /* mon doesn't pick up ball */ ! (void) mpickobj(u.ustuck,obj); } } else { ! place_object(obj, u.ux, u.uy); ! if (obj == uball) ! drop_ball(u.ux,u.uy); ! else ! sellobj(obj, u.ux, u.uy); ! stackobj(obj); ! if(Blind && Levitation) ! map_object(obj, 0); ! newsym(u.ux,u.uy); /* remap location under self */ } } --- 521,579 ---- dropy(obj) register struct obj *obj; { + if (obj == uwep) setuwep((struct obj *)0); + if (obj == uquiver) setuqwep((struct obj *)0); + if (obj == uswapwep) setuswapwep((struct obj *)0); + if (!u.uswallow && flooreffects(obj,u.ux,u.uy,"drop")) return; /* uswallow check done by GAN 01/29/87 */ if(u.uswallow) { ! boolean could_petrify; ! if (obj != uball) { /* mon doesn't pick up ball */ ! could_petrify = obj->otyp == CORPSE && ! touch_petrifies(&mons[obj->corpsenm]); ! (void) mpickobj(u.ustuck,obj); ! if (could_petrify && is_animal(u.ustuck->data)) { ! minstapetrify(u.ustuck, TRUE); ! /* Don't leave a cockatrice corpse available in a statue */ ! if (!u.uswallow) delobj(obj); } + } } else { ! place_object(obj, u.ux, u.uy); ! if (obj == uball) ! drop_ball(u.ux,u.uy); ! else ! sellobj(obj, u.ux, u.uy); ! stackobj(obj); ! if(Blind && Levitation) ! map_object(obj, 0); ! newsym(u.ux,u.uy); /* remap location under self */ ! } ! } ! ! /* things that must change when not held; recurse into containers. ! Called for both player and monsters */ ! void ! obj_no_longer_held(obj) ! struct obj *obj; ! { ! if (!obj) { ! return; ! } else if ((Is_container(obj) || obj->otyp == STATUE) && obj->cobj) { ! struct obj *contents; ! for(contents=obj->cobj; contents; contents=contents->nobj) ! obj_no_longer_held(contents); ! } ! switch(obj->otyp) { ! case CRYSKNIFE: ! /* KMH -- Fixed crysknives have only 10% chance of reverting */ ! /* only changes when not held by player or monster */ ! if (!obj->oerodeproof || !rn2(10)) { ! obj->otyp = WORM_TOOTH; ! obj->oerodeproof = 0; ! } ! break; } } *************** *** 532,542 **** int result = 0; add_valid_menu_class(0); /* clear any classes already there */ ! if (*u.ushops) sellobj_state(TRUE); if (flags.menu_style != MENU_TRADITIONAL || ! (result = ggetobj("drop", drop, 0, FALSE)) < -1) result = menu_drop(result); ! if (*u.ushops) sellobj_state(FALSE); reset_occupations(); return result; --- 584,594 ---- int result = 0; add_valid_menu_class(0); /* clear any classes already there */ ! if (*u.ushops) sellobj_state(SELL_DELIBERATE); if (flags.menu_style != MENU_TRADITIONAL || ! (result = ggetobj("drop", drop, 0, FALSE, (unsigned *)0)) < -1) result = menu_drop(result); ! if (*u.ushops) sellobj_state(SELL_NORMAL); reset_occupations(); return result; *************** *** 549,559 **** { int n, i, n_dropped = 0; long cnt; ! struct obj *otmp, *otmp2, *u_gold = 0; menu_item *pick_list; boolean all_categories = TRUE; boolean drop_everything = FALSE; if (u.ugold) { /* Hack: gold is not in the inventory, so make a gold object and put it at the head of the inventory list. */ --- 601,615 ---- { int n, i, n_dropped = 0; long cnt; ! struct obj *otmp, *otmp2; ! #ifndef GOLDOBJ ! struct obj *u_gold = 0; ! #endif menu_item *pick_list; boolean all_categories = TRUE; boolean drop_everything = FALSE; + #ifndef GOLDOBJ if (u.ugold) { /* Hack: gold is not in the inventory, so make a gold object and put it at the head of the inventory list. */ *************** *** 563,576 **** u_gold->nobj = invent; invent = u_gold; } ! if (retry) { all_categories = (retry == -2); } else if (flags.menu_style == MENU_FULL) { all_categories = FALSE; n = query_category("Drop what type of items?", invent, ! UNPAID_TYPES | ALL_TYPES | CHOOSE_ALL, &pick_list, PICK_ANY); if (!n) goto drop_done; for (i = 0; i < n; i++) { --- 619,633 ---- u_gold->nobj = invent; invent = u_gold; } ! #endif if (retry) { all_categories = (retry == -2); } else if (flags.menu_style == MENU_FULL) { all_categories = FALSE; n = query_category("Drop what type of items?", invent, ! UNPAID_TYPES | ALL_TYPES | CHOOSE_ALL | ! BUC_BLESSED | BUC_CURSED | BUC_UNCURSED | BUC_UNKNOWN, &pick_list, PICK_ANY); if (!n) goto drop_done; for (i = 0; i < n; i++) { *************** *** 583,592 **** } free((genericptr_t) pick_list); } else if (flags.menu_style == MENU_COMBINATION) { all_categories = FALSE; /* Gather valid classes via traditional NetHack method */ ! i = ggetobj("drop", drop, 0, TRUE); if (i == -2) all_categories = TRUE; } if (drop_everything) { --- 640,654 ---- } free((genericptr_t) pick_list); } else if (flags.menu_style == MENU_COMBINATION) { + unsigned ggoresults = 0; all_categories = FALSE; /* Gather valid classes via traditional NetHack method */ ! i = ggetobj("drop", drop, 0, TRUE, &ggoresults); if (i == -2) all_categories = TRUE; + if (ggoresults & ALL_FINISHED) { + n_dropped = i; + goto drop_done; + } } if (drop_everything) { *************** *** 605,615 **** cnt = pick_list[i].count; if (cnt < otmp->quan && !welded(otmp) && (!otmp->cursed || otmp->otyp != LOADSTONE)) { ! otmp2 = splitobj(otmp, cnt); ! /* assume other worn items aren't mergable */ ! if (otmp == uwep) setuwep(otmp2); ! if (otmp == uquiver) setuqwep(otmp2); ! if (otmp == uswapwep) setuswapwep(otmp2); } n_dropped += drop(otmp); } --- 667,678 ---- cnt = pick_list[i].count; if (cnt < otmp->quan && !welded(otmp) && (!otmp->cursed || otmp->otyp != LOADSTONE)) { ! #ifndef GOLDOBJ ! if (otmp->oclass == GOLD_CLASS) ! (void) splitobj(otmp, otmp->quan - cnt); ! else ! #endif ! otmp = splitobj(otmp, cnt); } n_dropped += drop(otmp); } *************** *** 618,629 **** --- 681,695 ---- } drop_done: + #ifndef GOLDOBJ if (u_gold && invent && invent->oclass == GOLD_CLASS) { /* didn't drop [all of] it */ u_gold = invent; invent = u_gold->nobj; dealloc_obj(u_gold); + update_inventory(); } + #endif return n_dropped; } *************** *** 641,651 **** (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up)), ladder_down = (u.ux == xdnladder && u.uy == ydnladder); if (Levitation) { if ((HLevitation & I_SPECIAL) || (ELevitation & W_ARTI)) { /* end controlled levitation */ ! if (float_down(I_SPECIAL|TIMEOUT, W_ARTI)) ! return (1); /* came down, so moved */ } floating_above(stairs_down ? "stairs" : ladder_down ? "ladder" : surface(u.ux, u.uy)); --- 707,739 ---- (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up)), ladder_down = (u.ux == xdnladder && u.uy == ydnladder); + #ifdef STEED + if (u.usteed && !u.usteed->mcanmove) { + pline("%s won't move!", Monnam(u.usteed)); + return(0); + } else if (u.usteed && u.usteed->meating) { + pline("%s is still eating.", Monnam(u.usteed)); + return(0); + } else + #endif if (Levitation) { if ((HLevitation & I_SPECIAL) || (ELevitation & W_ARTI)) { /* end controlled levitation */ ! if (ELevitation & W_ARTI) { ! struct obj *obj; ! ! for(obj = invent; obj; obj = obj->nobj) { ! if (obj->oartifact && ! artifact_has_invprop(obj,LEVITATION)) { ! if (obj->age < monstermoves) ! obj->age = monstermoves + rnz(100); ! else ! obj->age += rnz(100); ! } ! } ! } ! if (float_down(I_SPECIAL|TIMEOUT, W_ARTI)) ! return (1); /* came down, so moved */ } floating_above(stairs_down ? "stairs" : ladder_down ? "ladder" : surface(u.ux, u.uy)); *************** *** 660,666 **** } } if(u.ustuck) { ! You("are being held, and cannot go down."); return(1); } if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) { --- 748,756 ---- } } if(u.ustuck) { ! You("are %s, and cannot go down.", ! !u.uswallow ? "being held" : is_animal(u.ustuck->data) ? ! "swallowed" : "engulfed"); return(1); } if (on_level(&valley_level, &u.uz) && !u.uevent.gehennom_entered) { *************** *** 702,709 **** You_cant("go up here."); return(0); } if(u.ustuck) { ! You("are being held, and cannot go up."); return(1); } if(near_capacity() > SLT_ENCUMBER) { --- 792,810 ---- You_cant("go up here."); return(0); } + #ifdef STEED + if (u.usteed && !u.usteed->mcanmove) { + pline("%s won't move!", Monnam(u.usteed)); + return(0); + } else if (u.usteed && u.usteed->meating) { + pline("%s is still eating.", Monnam(u.usteed)); + return(0); + } else + #endif if(u.ustuck) { ! You("are %s, and cannot go up.", ! !u.uswallow ? "being held" : is_animal(u.ustuck->data) ? ! "swallowed" : "engulfed"); return(1); } if(near_capacity() > SLT_ENCUMBER) { *************** *** 1019,1025 **** } losehp(rnd(3), "falling downstairs", KILLED_BY); #ifdef STEED ! if (u.usteed) dismount_steed(DISMOUNT_FELL); #endif selftouch("Falling, you"); } else if (u.dz && at_ladder) --- 1120,1129 ---- } losehp(rnd(3), "falling downstairs", KILLED_BY); #ifdef STEED ! if (u.usteed) { ! dismount_steed(DISMOUNT_FELL); ! if (Punished) unplacebc(); ! } #endif selftouch("Falling, you"); } else if (u.dz && at_ladder) *************** *** 1127,1148 **** static const char *fam_msgs[4] = { "You have a sense of deja vu.", "You feel like you've been here before.", ! "This place looks familiar...", 0 /* no message */ }; static const char *halu_fam_msgs[4] = { ! "Whoa! Everything looks different.", "You are surrounded by twisty little passages, all alike.", ! "Gee, this looks like uncle Conan's place...", 0 /* no message */ }; const char *mesg; int which = rn2(4); if (Hallucination) mesg = halu_fam_msgs[which]; else mesg = fam_msgs[which]; if (mesg) pline(mesg); } --- 1231,1257 ---- static const char *fam_msgs[4] = { "You have a sense of deja vu.", "You feel like you've been here before.", ! "This place %s familiar...", 0 /* no message */ }; static const char *halu_fam_msgs[4] = { ! "Whoa! Everything %s different.", "You are surrounded by twisty little passages, all alike.", ! "Gee, this %s like uncle Conan's place...", 0 /* no message */ }; const char *mesg; + char buf[BUFSZ]; int which = rn2(4); if (Hallucination) mesg = halu_fam_msgs[which]; else mesg = fam_msgs[which]; + if (mesg && index(mesg, '%')) { + Sprintf(buf, mesg, !Blind ? "looks" : "seems"); + mesg = buf; + } if (mesg) pline(mesg); } *************** *** 1158,1164 **** /* the message from your quest leader */ if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest") && ! !(u.uevent.qexpelled || u.uevent.qcompleted || leaderless())) { if (u.uevent.qcalled) { com_pager(Role_if(PM_ROGUE) ? 4 : 3); --- 1267,1273 ---- /* the message from your quest leader */ if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest") && ! !(u.uevent.qexpelled || u.uevent.qcompleted || quest_status.leader_is_dead)) { if (u.uevent.qcalled) { com_pager(Role_if(PM_ROGUE) ? 4 : 3); *************** *** 1324,1335 **** boolean is_uwep, chewed; xchar where; char *cname, cname_buf[BUFSZ]; ! where = corpse->where; is_uwep = corpse == uwep; cname = eos(strcpy(cname_buf, "bite-covered ")); Strcpy(cname, corpse_xname(corpse, TRUE)); mcarry = (where == OBJ_MINVENT) ? corpse->ocarry : 0; mtmp = revive(corpse); /* corpse is gone if successful */ if (mtmp) { --- 1433,1454 ---- boolean is_uwep, chewed; xchar where; char *cname, cname_buf[BUFSZ]; ! struct obj *container = (struct obj *)0; ! int container_where = 0; ! where = corpse->where; is_uwep = corpse == uwep; cname = eos(strcpy(cname_buf, "bite-covered ")); Strcpy(cname, corpse_xname(corpse, TRUE)); mcarry = (where == OBJ_MINVENT) ? corpse->ocarry : 0; + + if (where == OBJ_CONTAINED) { + struct monst *mtmp2 = (struct monst *)0; + container = corpse->ocontainer; + mtmp2 = get_container_location(container, &container_where, (int *)0); + /* container_where is the outermost container's location even if nested */ + if (container_where == OBJ_MINVENT && mtmp2) mcarry = mtmp2; + } mtmp = revive(corpse); /* corpse is gone if successful */ if (mtmp) { *************** *** 1359,1365 **** Adjmonnam(mtmp, "bite-covered") : Monnam(mtmp)); } break; ! default: /* we should be able to handle the other cases... */ impossible("revive_corpse: lost corpse @ %d", where); --- 1478,1504 ---- Adjmonnam(mtmp, "bite-covered") : Monnam(mtmp)); } break; ! case OBJ_CONTAINED: ! if (container_where == OBJ_MINVENT && cansee(mtmp->mx, mtmp->my) && ! mcarry && canseemon(mcarry) && container) { ! char sackname[BUFSZ]; ! Sprintf(sackname, "%s %s", s_suffix(mon_nam(mcarry)), ! xname(container)); ! pline("%s writhes out of %s!", Amonnam(mtmp), sackname); ! } else if (container_where == OBJ_INVENT && container) { ! char sackname[BUFSZ]; ! Strcpy(sackname, an(xname(container))); ! pline("%s %s out of %s in your pack!", ! Blind ? Something : Amonnam(mtmp), ! locomotion(mtmp->data,"writhes"), ! sackname); ! } else if (container_where == OBJ_FLOOR && container && ! cansee(mtmp->mx, mtmp->my)) { ! char sackname[BUFSZ]; ! Strcpy(sackname, an(xname(container))); ! pline("%s escapes from %s!", Amonnam(mtmp), sackname); ! } ! break; default: /* we should be able to handle the other cases... */ impossible("revive_corpse: lost corpse @ %d", where); *** nethack-3.3.1/src/dog.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dog.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dog.c 3.3 1999/10/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dog.c 3.4 2002/03/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 15,20 **** --- 15,21 ---- { mtmp->mtame = is_domestic(mtmp->data) ? 10 : 5; mtmp->mpeaceful = 1; + mtmp->mavenge = 0; set_malign(mtmp); /* recalc alignment now that it's tamed */ mtmp->mleashed = 0; mtmp->meating = 0; *************** *** 90,95 **** --- 91,97 ---- if (!quietly) You("get a bad feeling about this."); mtmp->mpeaceful = 0; + set_malign(mtmp); } } /* if figurine has been named, give same name to the monster */ *************** *** 118,123 **** --- 120,127 ---- int pettype; static int petname_used = 0; + if (preferred_pet == 'n') return((struct monst *) 0); + pettype = pet_type(); if (pettype == PM_LITTLE_DOG) petname = dogname; *************** *** 410,415 **** --- 414,426 ---- mtmp->mtame = mtmp->mpeaceful = 0; } + if (!mtmp->mtame && mtmp->mleashed) { + /* leashed monsters should always be with hero, consequently + never losing any time to be accounted for later */ + impossible("catching up for leashed monster?"); + m_unleash(mtmp, FALSE); + } + /* recover lost hit points */ if (!regenerates(mtmp->data)) imv /= 20; if (mtmp->mhp + imv >= mtmp->mhpmax) *************** *** 442,448 **** the amulet; if you don't have it, will chase you only if in range. -3. */ (u.uhave.amulet && mtmp->iswiz)) ! && !mtmp->msleeping && mtmp->mcanmove) { stay_behind = FALSE; if (mtmp->mtame && mtmp->meating) { if (canseemon(mtmp)) --- 453,461 ---- the amulet; if you don't have it, will chase you only if in range. -3. */ (u.uhave.amulet && mtmp->iswiz)) ! && !mtmp->msleeping && mtmp->mcanmove ! /* monster won't follow if it hasn't noticed you yet */ ! && !(mtmp->mstrategy & STRAT_WAITFORU)) { stay_behind = FALSE; if (mtmp->mtame && mtmp->meating) { if (canseemon(mtmp)) *************** *** 453,470 **** pline("%s seems very disoriented for a moment.", Monnam(mtmp)); stay_behind = TRUE; } - if (stay_behind #ifdef STEED ! && mtmp != u.usteed #endif ! ) { if (mtmp->mleashed) { pline("%s leash suddenly comes loose.", humanoid(mtmp->data) ? (mtmp->female ? "Her" : "His") : "Its"); ! m_unleash(mtmp); } continue; } --- 466,486 ---- pline("%s seems very disoriented for a moment.", Monnam(mtmp)); stay_behind = TRUE; + } else if (mtmp->mtame && mtmp->mtrapped) { + if (canseemon(mtmp)) + pline("%s is still trapped.", Monnam(mtmp)); + stay_behind = TRUE; } #ifdef STEED ! if (mtmp == u.usteed) stay_behind = FALSE; #endif ! if (stay_behind) { if (mtmp->mleashed) { pline("%s leash suddenly comes loose.", humanoid(mtmp->data) ? (mtmp->female ? "Her" : "His") : "Its"); ! m_unleash(mtmp, FALSE); } continue; } *************** *** 503,509 **** /* this can happen if your quest leader ejects you from the "home" level while a leashed pet isn't next to you */ pline("%s leash goes slack.", s_suffix(Monnam(mtmp))); ! m_unleash(mtmp); } } } --- 519,525 ---- /* this can happen if your quest leader ejects you from the "home" level while a leashed pet isn't next to you */ pline("%s leash goes slack.", s_suffix(Monnam(mtmp))); ! m_unleash(mtmp, FALSE); } } } *************** *** 541,554 **** obj->no_charge = 0; } relmon(mtmp); mtmp->nmon = migrating_mons; migrating_mons = mtmp; - if (mtmp->mleashed) { - m_unleash(mtmp); - mtmp->mtame--; - pline_The("leash comes off!"); - } newsym(mtmp->mx,mtmp->my); new_lev.dnum = ledger_to_dnum((xchar)tolev); --- 557,569 ---- obj->no_charge = 0; } + if (mtmp->mleashed) { + mtmp->mtame--; + m_unleash(mtmp, TRUE); + } relmon(mtmp); mtmp->nmon = migrating_mons; migrating_mons = mtmp; newsym(mtmp->mx,mtmp->my); new_lev.dnum = ledger_to_dnum((xchar)tolev); *************** *** 648,657 **** return(TABU); if (mon->data == &mons[PM_GELATINOUS_CUBE] && is_organic(obj)) return(ACCFOOD); ! if (metallivorous(mon->data) && is_metallic(obj)) /* Non-rustproofed ferrous based metals are preferred. */ ! return(objects[obj->otyp].oc_material == IRON && ! !obj->oerodeproof ? DOGFOOD : ACCFOOD); if(!obj->cursed && obj->oclass != BALL_CLASS && obj->oclass != CHAIN_CLASS) return(APPORT); --- 663,673 ---- return(TABU); if (mon->data == &mons[PM_GELATINOUS_CUBE] && is_organic(obj)) return(ACCFOOD); ! if (metallivorous(mon->data) && is_metallic(obj) && (is_rustprone(obj) || mon->data != &mons[PM_RUST_MONSTER])) { /* Non-rustproofed ferrous based metals are preferred. */ ! return((is_rustprone(obj) && !obj->oerodeproof) ? DOGFOOD : ! ACCFOOD); ! } if(!obj->cursed && obj->oclass != BALL_CLASS && obj->oclass != CHAIN_CLASS) return(APPORT); *************** *** 711,717 **** Monnam(mtmp), the(xname(obj)), !big_corpse ? "." : ", or vice versa!"); } else if (cansee(mtmp->mx,mtmp->my)) ! pline("%s stops.", The(xname(obj))); /* dog_eat expects a floor object */ place_object(obj, mtmp->mx, mtmp->my); (void) dog_eat(mtmp, obj, mtmp->mx, mtmp->my, FALSE); --- 727,733 ---- Monnam(mtmp), the(xname(obj)), !big_corpse ? "." : ", or vice versa!"); } else if (cansee(mtmp->mx,mtmp->my)) ! pline("%s.", Tobjnam(obj, "stop")); /* dog_eat expects a floor object */ place_object(obj, mtmp->mx, mtmp->my); (void) dog_eat(mtmp, obj, mtmp->mx, mtmp->my, FALSE); *************** *** 730,735 **** --- 746,754 ---- (is_demon(mtmp->data) && !is_demon(youmonst.data)) || (obj && dogfood(mtmp, obj) >= MANFOOD)) return (struct monst *)0; + if (mtmp->m_id == quest_status.leader_m_id) + return((struct monst *)0); + /* make a new monster which has the pet extension */ mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth); *mtmp2 = *mtmp; *************** *** 796,801 **** --- 815,827 ---- mtmp->mpeaceful = mtmp->mtame = 0; } } + if (!mtmp->mtame) { + newsym(mtmp->mx, mtmp->my); + /* a life-saved monster might be leashed; + don't leave it that way if it's no longer tame */ + if (mtmp->mleashed) m_unleash(mtmp, TRUE); + } + /* if its still a pet, start a clean pet-slate now */ if (has_edog && mtmp->mtame) { EDOG(mtmp)->revivals++; *************** *** 814,825 **** else mtmp->mtame--; if (mtmp->mtame && !mtmp->isminion) ! EDOG(mtmp)->abuse++; ! if (mtmp->mtame && rn2(mtmp->mtame)) yelp(mtmp); ! else growl(mtmp); /* give them a moment's worry */ ! if (!mtmp->mtame) newsym(mtmp->mx, mtmp->my); } #endif /* OVLB */ --- 840,858 ---- else mtmp->mtame--; if (mtmp->mtame && !mtmp->isminion) ! EDOG(mtmp)->abuse++; ! if (!mtmp->mtame && mtmp->mleashed) ! m_unleash(mtmp, TRUE); ! ! /* don't make a sound if pet is in the middle of leaving the level */ ! /* newsym isn't necessary in this case either */ ! if (mtmp->mx != 0) { ! if (mtmp->mtame && rn2(mtmp->mtame)) yelp(mtmp); ! else growl(mtmp); /* give them a moment's worry */ ! if (!mtmp->mtame) newsym(mtmp->mx, mtmp->my); ! } } #endif /* OVLB */ *** nethack-3.3.1/src/dogmove.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dogmove.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dogmove.c 3.3 97/05/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dogmove.c 3.4 2002/03/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 16,21 **** --- 16,23 ---- STATIC_DCL int FDECL(dog_goal,(struct monst *,struct edog *,int,int,int)); STATIC_DCL struct obj *FDECL(DROPPABLES, (struct monst *)); + STATIC_DCL boolean FDECL(can_reach_food,(struct monst *,XCHAR_P,XCHAR_P,XCHAR_P, + XCHAR_P)); STATIC_OVL struct obj * DROPPABLES(mon) *************** *** 156,162 **** } else /* hack: observe the action if either new or old location is in view */ if (cansee(x, y) || cansee(mtmp->mx, mtmp->my)) ! pline("%s %s %s.", Monnam(mtmp), devour ? "devours" : "eats", (obj->oclass == FOOD_CLASS) ? singular(obj, doname) : doname(obj)); --- 158,164 ---- } else /* hack: observe the action if either new or old location is in view */ if (cansee(x, y) || cansee(mtmp->mx, mtmp->my)) ! pline("%s %s %s.", noit_Monnam(mtmp), devour ? "devours" : "eats", (obj->oclass == FOOD_CLASS) ? singular(obj, doname) : doname(obj)); *************** *** 182,190 **** delobj(obj); } else if (obj == uchain) unpunish(); ! else if (obj->quan > 1L && obj->oclass == FOOD_CLASS) obj->quan--; ! else delobj(obj); if (poly) { --- 184,193 ---- delobj(obj); } else if (obj == uchain) unpunish(); ! else if (obj->quan > 1L && obj->oclass == FOOD_CLASS) { obj->quan--; ! obj->owt = weight(obj); ! } else delobj(obj); if (poly) { *************** *** 198,204 **** #ifdef STEED mtmp->misc_worn_check = mw; #endif ! if (newcham(mtmp, (struct permonst *)0) && cansee(mtmp->mx, mtmp->my)) { uchar save_mnamelth = mtmp->mnamelth; mtmp->mnamelth = 0; --- 201,207 ---- #ifdef STEED mtmp->misc_worn_check = mw; #endif ! if (newcham(mtmp, (struct permonst *)0, FALSE) && cansee(mtmp->mx, mtmp->my)) { uchar save_mnamelth = mtmp->mnamelth; mtmp->mnamelth = 0; *************** *** 242,247 **** --- 245,251 ---- beg(mtmp); else You_feel("worried about %s.", y_monnam(mtmp)); + stop_occupation(); } else if (monstermoves > edog->hungrytime + 750 || mtmp->mhp < 1) { dog_died: if (mtmp->mleashed) *************** *** 279,285 **** --- 283,293 ---- /* if we are carrying sth then we drop it (perhaps near @) */ /* Note: if apport == 1 then our behaviour is independent of udist */ /* Use udist+1 so steed won't cause divide by zero */ + #ifndef GOLDOBJ if(DROPPABLES(mtmp) || mtmp->mgold) { + #else + if(DROPPABLES(mtmp)) { + #endif if (!rn2(udist+1) || !rn2(edog->apport)) if(rn2(10) < edog->apport){ relobj(mtmp, (int)mtmp->minvis, TRUE); *************** *** 375,381 **** continue; if (cursed_object_at(nx, ny)) continue; ! if (otyp < MANFOOD) { if (otyp < gtyp || DDIST(nx,ny) < DDIST(gx,gy)) { gx = nx; gy = ny; --- 383,390 ---- continue; if (cursed_object_at(nx, ny)) continue; ! if (otyp < MANFOOD && ! can_reach_food(mtmp, mtmp->mx, mtmp->my, nx, ny)) { if (otyp < gtyp || DDIST(nx,ny) < DDIST(gx,gy)) { gx = nx; gy = ny; *************** *** 556,561 **** --- 565,575 ---- } } + if (!Conflict && !mtmp->mconf && + mtmp == u.ustuck && !sticks(youmonst.data)) { + unstuck(mtmp); /* swallowed case handled above */ + You("get released!"); + } if (!nohands(mtmp->data) && !verysmall(mtmp->data)) { allowflags |= OPENDOOR; if (m_carrying(mtmp, SKELETON_KEY)) allowflags |= BUSTDOOR; *************** *** 702,709 **** if (info[chi] & ALLOW_U) { if (mtmp->mleashed) { /* play it safe */ pline("%s breaks loose of %s leash!", ! Monnam(mtmp), his[pronoun_gender(mtmp)]); ! m_unleash(mtmp); } (void) mattacku(mtmp); return(0); --- 716,723 ---- if (info[chi] & ALLOW_U) { if (mtmp->mleashed) { /* play it safe */ pline("%s breaks loose of %s leash!", ! Monnam(mtmp), mhis(mtmp)); ! m_unleash(mtmp, FALSE); } (void) mattacku(mtmp); return(0); *************** *** 765,770 **** --- 779,828 ---- set_apparxy(mtmp); } return(1); + } + + /* Hack to prevent a dog from being endlessly stuck near a piece of food that + * it can't reach, such as caught in a teleport scroll niche. It recursively + * checks to see if the squares inbetween are good. The checking could be a + * little smarter; a full check would probably be useful in m_move() too. + * Since the maximum food distance is 5, this should never be more than 5 calls + * deep. + */ + STATIC_OVL boolean + can_reach_food(mon, mx, my, fx, fy) + struct monst *mon; + xchar mx, my, fx, fy; + { + int i, j; + int dist; + + if (mx == fx && my == fy) return TRUE; + if (!isok(mx, my)) return FALSE; /* should not happen */ + + dist = dist2(mx, my, fx, fy); + for(i=mx-1; i<=mx+1; i++) { + for(j=my-1; j<=my+1; j++) { + if (!isok(i, j)) + continue; + if (dist2(i, j, fx, fy) >= dist) + continue; + if (IS_ROCK(levl[i][j].typ) && !passes_walls(mon->data) && + (!may_dig(i,j) || !tunnels(mon->data))) + continue; + if (IS_DOOR(levl[i][j].typ) && + (levl[i][j].doormask & (D_CLOSED | D_LOCKED))) + continue; + if (is_pool(i, j) && !is_swimmer(mon->data)) + continue; + if (is_lava(i, j) && !likes_lava(mon->data)) + continue; + if (sobj_at(BOULDER,i,j) && !throws_rocks(mon->data)) + continue; + if (can_reach_food(mon, i, j, fx, fy)) + return TRUE; + } + } + return FALSE; } #endif /* OVL0 */ *** nethack-3.3.1/src/dokick.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dokick.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dokick.c 3.3 2000/04/21 */ /* Copyright (c) Izchak Miller, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dokick.c 3.4 2000/04/21 */ /* Copyright (c) Izchak Miller, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 23,30 **** static NEARDATA struct obj *kickobj; - #define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE) - static const char kick_passes_thru[] = "kick passes harmlessly through"; STATIC_OVL void --- 23,28 ---- *************** *** 66,72 **** /* it is unchivalrous to attack the defenseless or from behind */ if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL && u.ualign.record > -10 && ! (!mon->mcanmove || mon->msleeping || mon->mflee)) { You_feel("like a caitiff!"); adjalign(-1); } --- 64,71 ---- /* it is unchivalrous to attack the defenseless or from behind */ if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL && u.ualign.record > -10 && ! (!mon->mcanmove || mon->msleeping || ! (mon->mflee && !mon->mavenge))) { You_feel("like a caitiff!"); adjalign(-1); } *************** *** 74,85 **** /* squeeze some guilt feelings... */ if(mon->mtame) { abuse_dog(mon); ! mon->mflee = mon->mtame ? 1 : 0; ! #ifdef HISX ! mon->mfleetim = mon->mfleetim + (dmg ? rnd(dmg) : 1); ! #else ! mon->mfleetim += (dmg ? rnd(dmg) : 1); ! #endif } if (dmg > 0) { --- 73,82 ---- /* squeeze some guilt feelings... */ if(mon->mtame) { abuse_dog(mon); ! if (mon->mtame) ! monflee(mon, (dmg ? rnd(dmg) : 1), FALSE, FALSE); ! else ! mon->mflee = 0; } if (dmg > 0) { *************** *** 97,115 **** dmg += u.udaminc; /* add ring(s) of increase damage */ if (dmg > 0) mon->mhp -= dmg; ! if(mon->mhp > 0 && martial() && !bigmonst(mon->data) && !rn2(3) ! && mon->mcanmove && mon != u.ustuck) { /* see if the monster has a place to move into */ mdx = mon->mx + u.dx; mdy = mon->my + u.dy; if(goodpos(mdx, mdy, mon)) { pline("%s reels from the blow.", Monnam(mon)); ! if (!m_in_out_region(mon, mdx, mdy)) { remove_monster(mon->mx, mon->my); newsym(mon->mx, mon->my); place_monster(mon, mdx, mdy); newsym(mon->mx, mon->my); set_apparxy(mon); } } } --- 94,113 ---- dmg += u.udaminc; /* add ring(s) of increase damage */ if (dmg > 0) mon->mhp -= dmg; ! if (mon->mhp > 0 && martial() && !bigmonst(mon->data) && !rn2(3) && ! mon->mcanmove && mon != u.ustuck && !mon->mtrapped) { /* see if the monster has a place to move into */ mdx = mon->mx + u.dx; mdy = mon->my + u.dy; if(goodpos(mdx, mdy, mon)) { pline("%s reels from the blow.", Monnam(mon)); ! if (m_in_out_region(mon, mdx, mdy)) { remove_monster(mon->mx, mon->my); newsym(mon->mx, mon->my); place_monster(mon, mdx, mdy); newsym(mon->mx, mon->my); set_apparxy(mon); + (void) mintrap(mon); } } } *************** *** 165,170 **** --- 163,170 ---- You("kick %s.", mon_nam(mon)); sum = damageum(mon, uattk); (void)passive(mon, (boolean)(sum > 0), (sum != 2), AT_KICK); + if (sum == 2) + break; /* Defender died */ } else { missum(mon, uattk); (void)passive(mon, 0, 1, AT_KICK); *************** *** 217,223 **** pline("%s %s, %s evading your %skick.", Monnam(mon), (can_teleport(mon->data) ? "teleports" : is_floater(mon->data) ? "floats" : ! is_flyer(mon->data) ? "flutters" : (nolimbs(mon->data) || slithy(mon->data)) ? "slides" : "jumps"), clumsy ? "easily" : "nimbly", --- 217,223 ---- pline("%s %s, %s evading your %skick.", Monnam(mon), (can_teleport(mon->data) ? "teleports" : is_floater(mon->data) ? "floats" : ! is_flyer(mon->data) ? "swoops" : (nolimbs(mon->data) || slithy(mon->data)) ? "slides" : "jumps"), clumsy ? "easily" : "nimbly", *************** *** 247,252 **** --- 247,255 ---- if (canseemon(mtmp)) pline_The("gold hits %s.", mon_nam(mtmp)); } else { + #ifdef GOLDOBJ + long value = gold->quan * objects[gold->otyp].oc_cost; + #endif mtmp->msleeping = 0; mtmp->meating = 0; if(!rn2(4)) setmangry(mtmp); /* not always pleasing */ *************** *** 254,278 **** /* greedy monsters catch gold */ if (cansee(mtmp->mx, mtmp->my)) pline("%s catches the gold.", Monnam(mtmp)); mtmp->mgold += gold->quan; if (mtmp->isshk) { long robbed = ESHK(mtmp)->robbed; if (robbed) { robbed -= gold->quan; if (robbed < 0) robbed = 0; pline_The("amount %scovers %s recent losses.", !robbed ? "" : "partially ", ! his[mtmp->female]); ESHK(mtmp)->robbed = robbed; if(!robbed) make_happy_shk(mtmp, FALSE); } else { if(mtmp->mpeaceful) { ESHK(mtmp)->credit += gold->quan; ! You("have %ld zorkmid%s in credit.", ESHK(mtmp)->credit, ! plur(ESHK(mtmp)->credit)); } else verbalize("Thanks, scum!"); } } else if (mtmp->ispriest) { --- 257,291 ---- /* greedy monsters catch gold */ if (cansee(mtmp->mx, mtmp->my)) pline("%s catches the gold.", Monnam(mtmp)); + #ifndef GOLDOBJ mtmp->mgold += gold->quan; + #endif if (mtmp->isshk) { long robbed = ESHK(mtmp)->robbed; if (robbed) { + #ifndef GOLDOBJ robbed -= gold->quan; + #else + robbed -= value; + #endif if (robbed < 0) robbed = 0; pline_The("amount %scovers %s recent losses.", !robbed ? "" : "partially ", ! mhis(mtmp)); ESHK(mtmp)->robbed = robbed; if(!robbed) make_happy_shk(mtmp, FALSE); } else { if(mtmp->mpeaceful) { + #ifndef GOLDOBJ ESHK(mtmp)->credit += gold->quan; ! #else ! ESHK(mtmp)->credit += value; ! #endif ! You("have %ld %s in credit.", ESHK(mtmp)->credit, ! currency(ESHK(mtmp)->credit)); } else verbalize("Thanks, scum!"); } } else if (mtmp->ispriest) { *************** *** 293,300 **** --- 306,318 ---- goldreqd = 750L; if (goldreqd) { + #ifndef GOLDOBJ if (gold->quan > goldreqd + (u.ugold + u.ulevel*rn2(5))/ACURR(A_CHA)) + #else + if (value > goldreqd + + (money_cnt(invent) + u.ulevel*rn2(5))/ACURR(A_CHA)) + #endif mtmp->mpeaceful = TRUE; } } *************** *** 303,309 **** --- 321,331 ---- else verbalize("That's not enough, coward!"); } + #ifndef GOLDOBJ dealloc_obj(gold); + #else + add_to_minv(mtmp, gold); + #endif return(1); } return(0); *************** *** 346,361 **** if(kickobj->otyp == CORPSE && touch_petrifies(&mons[kickobj->corpsenm]) && !Stone_resistance && !uarmf) { ! char kbuf[BUFSZ]; ! You("kick the %s corpse with your bare %s.", ! mons[kickobj->corpsenm].mname, makeplural(body_part(FOOT))); if (!(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { You("turn to stone..."); killer_format = KILLED_BY; /* KMH -- otmp should be kickobj */ ! Sprintf(kbuf, "kicking a %s corpse without boots", ! mons[kickobj->corpsenm].mname); killer = kbuf; done(STONING); } --- 368,383 ---- if(kickobj->otyp == CORPSE && touch_petrifies(&mons[kickobj->corpsenm]) && !Stone_resistance && !uarmf) { ! char kbuf[BUFSZ]; ! You("kick the %s with your bare %s.", ! corpse_xname(kickobj, TRUE), makeplural(body_part(FOOT))); if (!(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { You("turn to stone..."); killer_format = KILLED_BY; /* KMH -- otmp should be kickobj */ ! Sprintf(kbuf, "kicking %s without boots", ! an(corpse_xname(kickobj, TRUE))); killer = kbuf; done(STONING); } *************** *** 407,412 **** --- 429,441 ---- result = "cracking"; } if (result) { + if (otmp->otyp == MIRROR) + change_luck(-2); + /* eggs laid by you */ + /* penalty is -1 per egg, max 5, but it's always + exactly 1 that breaks */ + if (otmp->otyp == EGG && otmp->spe && otmp->corpsenm >= LOW_PM) + change_luck(-1); You_hear("a muffled %s.",result); if(costly) loss += stolen_value(otmp, x, y, (boolean)shkp->mpeaceful, TRUE); *************** *** 420,430 **** } if(costly && loss) { if(!insider) { ! You("caused %ld zorkmids worth of damage!", loss); make_angry_shk(shkp, x, y); } else { ! You("owe %s %ld zorkmids for objects destroyed.", ! mon_nam(shkp), loss); } } --- 449,460 ---- } if(costly && loss) { if(!insider) { ! You("caused %ld %s worth of damage!", ! loss, currency(loss)); make_angry_shk(shkp, x, y); } else { ! You("owe %s %ld %s for objects destroyed.", ! mon_nam(shkp), loss, currency(loss)); } } *************** *** 455,469 **** || IS_ROCK(levl[u.ux][u.uy].typ) || closed_door(u.ux, u.uy)) { if (Blind) pline("It doesn't come loose."); ! else pline("%s do%sn't come loose.", The(distant_name(kickobj, xname)), ! (kickobj->quan == 1L) ? "es" : ""); return(!rn2(3) || martial()); } if (Blind) pline("It comes loose."); ! else pline("%s come%s loose.", The(distant_name(kickobj, xname)), ! (kickobj->quan == 1L) ? "s" : ""); obj_extract_self(kickobj); newsym(x, y); if (costly && (!costly_spot(u.ux, u.uy) --- 485,499 ---- || IS_ROCK(levl[u.ux][u.uy].typ) || closed_door(u.ux, u.uy)) { if (Blind) pline("It doesn't come loose."); ! else pline("%s %sn't come loose.", The(distant_name(kickobj, xname)), ! otense(kickobj, "do")); return(!rn2(3) || martial()); } if (Blind) pline("It comes loose."); ! else pline("%s %s loose.", The(distant_name(kickobj, xname)), ! otense(kickobj, "come")); obj_extract_self(kickobj); newsym(x, y); if (costly && (!costly_spot(u.ux, u.uy) *************** *** 488,499 **** return(!rn2(3) || martial()); } ! if (kickobj->quan > 1L && !isgold) (void) splitobj(kickobj, 1L); if (slide && !Blind) ! pline("Whee! %s slide%s across the %s.", Doname2(kickobj), ! kickobj->quan > 1L ? "" : "s", ! surface(x,y)); obj_extract_self(kickobj); (void) snuff_candle(kickobj); --- 518,528 ---- return(!rn2(3) || martial()); } ! if (kickobj->quan > 1L && !isgold) kickobj = splitobj(kickobj, 1L); if (slide && !Blind) ! pline("Whee! %s %s across the %s.", Doname2(kickobj), ! otense(kickobj, "slide"), surface(x,y)); obj_extract_self(kickobj); (void) snuff_candle(kickobj); *************** *** 541,552 **** if (kickobj) what = distant_name(kickobj,doname); else if (IS_DOOR(maploc->typ)) what = "a door"; else if (IS_STWALL(maploc->typ)) what = "a wall"; else if (IS_ROCK(maploc->typ)) what = "a rock"; else if (IS_THRONE(maploc->typ)) what = "a throne"; else if (IS_FOUNTAIN(maploc->typ)) what = "a fountain"; else if (IS_GRAVE(maploc->typ)) what = "a headstone"; - else if (IS_TREE(maploc->typ)) what = "a tree"; #ifdef SINKS else if (IS_SINK(maploc->typ)) what = "a sink"; #endif --- 570,581 ---- if (kickobj) what = distant_name(kickobj,doname); else if (IS_DOOR(maploc->typ)) what = "a door"; + else if (IS_TREE(maploc->typ)) what = "a tree"; else if (IS_STWALL(maploc->typ)) what = "a wall"; else if (IS_ROCK(maploc->typ)) what = "a rock"; else if (IS_THRONE(maploc->typ)) what = "a throne"; else if (IS_FOUNTAIN(maploc->typ)) what = "a fountain"; else if (IS_GRAVE(maploc->typ)) what = "a headstone"; #ifdef SINKS else if (IS_SINK(maploc->typ)) what = "a sink"; #endif *************** *** 830,839 **** if (!rn2(2) && !(maploc->looted & TREE_LOOTED) && (treefruit = rnd_treefruit_at(x, y))) { treefruit->quan = (long)(8 - rnl(8)); ! if (treefruit->quan > 1L) ! pline("Some %s fall from the tree!", xname(treefruit)); else ! pline("%s falls from the tree!", An(xname(treefruit))); scatter(x,y,2,MAY_HIT,treefruit); exercise(A_DEX, TRUE); exercise(A_WIS, TRUE); /* discovered a new food source! */ --- 859,868 ---- if (!rn2(2) && !(maploc->looted & TREE_LOOTED) && (treefruit = rnd_treefruit_at(x, y))) { treefruit->quan = (long)(8 - rnl(8)); ! if (is_plural(treefruit)) ! pline("Some %s fall from the tree!", xname(treefruit)); else ! pline("%s falls from the tree!", An(xname(treefruit))); scatter(x,y,2,MAY_HIT,treefruit); exercise(A_DEX, TRUE); exercise(A_WIS, TRUE); /* discovered a new food source! */ *************** *** 844,850 **** int cnt = rnl(5); coord mm; mm.x = x; mm.y = y; ! pline("You've disturbed the occupants!"); while (cnt--) if (enexto(&mm, mm.x, mm.y, &mons[PM_KILLER_BEE])) (void) makemon(&mons[PM_KILLER_BEE], --- 873,879 ---- int cnt = rnl(5); coord mm; mm.x = x; mm.y = y; ! pline("You've attracted the tree's former occupants!"); while (cnt--) if (enexto(&mm, mm.x, mm.y, &mons[PM_KILLER_BEE])) (void) makemon(&mons[PM_KILLER_BEE], *************** *** 991,997 **** mtmp->data == &mons[PM_WATCH_CAPTAIN]) && couldsee(mtmp->mx, mtmp->my) && mtmp->mpeaceful) { ! pline("%s yells:", Amonnam(mtmp)); verbalize("Halt, thief! You're under arrest!"); (void) angry_guards(FALSE); break; --- 1020,1029 ---- mtmp->data == &mons[PM_WATCH_CAPTAIN]) && couldsee(mtmp->mx, mtmp->my) && mtmp->mpeaceful) { ! if (canspotmon(mtmp)) ! pline("%s yells:", Amonnam(mtmp)); ! else ! You_hear("someone yell:"); verbalize("Halt, thief! You're under arrest!"); (void) angry_guards(FALSE); break; *************** *** 1007,1013 **** if ((mtmp->data == &mons[PM_WATCHMAN] || mtmp->data == &mons[PM_WATCH_CAPTAIN]) && mtmp->mpeaceful && couldsee(mtmp->mx, mtmp->my)) { ! pline("%s yells:", Amonnam(mtmp)); if(levl[x][y].looted & D_WARNED) { verbalize("Halt, vandal! You're under arrest!"); (void) angry_guards(FALSE); --- 1039,1048 ---- if ((mtmp->data == &mons[PM_WATCHMAN] || mtmp->data == &mons[PM_WATCH_CAPTAIN]) && mtmp->mpeaceful && couldsee(mtmp->mx, mtmp->my)) { ! if (canspotmon(mtmp)) ! pline("%s yells:", Amonnam(mtmp)); ! else ! You_hear("someone yell:"); if(levl[x][y].looted & D_WARNED) { verbalize("Halt, vandal! You're under arrest!"); (void) angry_guards(FALSE); *************** *** 1150,1156 **** if(costly && shkp && price) { if(ESHK(shkp)->robbed > robbed) { ! You("removed %ld zorkmids worth of goods!", price); if(cansee(shkp->mx, shkp->my)) { if(ESHK(shkp)->customer[0] == 0) (void) strncpy(ESHK(shkp)->customer, --- 1185,1191 ---- if(costly && shkp && price) { if(ESHK(shkp)->robbed > robbed) { ! You("removed %ld %s worth of goods!", price, currency(price)); if(cansee(shkp->mx, shkp->my)) { if(ESHK(shkp)->customer[0] == 0) (void) strncpy(ESHK(shkp)->customer, *************** *** 1163,1172 **** (void) angry_guards(FALSE); return; } ! if(ESHK(shkp)->debit > debit) ! You("owe %s %ld zorkmids for goods lost.", Monnam(shkp), ! (ESHK(shkp)->debit - debit)); } } --- 1198,1209 ---- (void) angry_guards(FALSE); return; } ! if(ESHK(shkp)->debit > debit) { ! long amt = (ESHK(shkp)->debit - debit); ! You("owe %s %ld %s for goods lost.", Monnam(shkp), ! amt, currency(amt)); ! } } } *************** *** 1243,1248 **** --- 1280,1312 ---- otmp->no_charge = 0; } + if (otmp == uwep) setuwep((struct obj *)0); + if (otmp == uquiver) setuqwep((struct obj *)0); + if (otmp == uswapwep) setuswapwep((struct obj *)0); + + /* some things break rather than ship */ + if (breaktest(otmp)) { + char *result; + if (objects[otmp->otyp].oc_material == GLASS + #ifdef TOURIST + || otmp->otyp == EXPENSIVE_CAMERA + #endif + ) { + if (otmp->otyp == MIRROR) + change_luck(-2); + result = "crash"; + } else { + /* penalty for breaking eggs laid by you */ + if (otmp->otyp == EGG && otmp->spe && otmp->corpsenm >= LOW_PM) + change_luck((schar) -min(otmp->quan, 5L)); + result = "splat"; + } + You_hear("a muffled %s.",result); + obj_extract_self(otmp); + obfree(otmp, (struct obj *) 0); + return TRUE; + } + add_to_migration(otmp); otmp->ox = cc.x; otmp->oy = cc.y; *************** *** 1319,1337 **** xname(otmp)); if(num) { /* means: other objects are impacted */ ! Sprintf(eos(obuf), " hit%s %s object%s", ! otmp->quan == 1L ? "s" : "", ! num == 1L ? "another" : "other", ! num > 1L ? "s" : ""); if(nodrop) Sprintf(eos(obuf), "."); else ! Sprintf(eos(obuf), " and fall%s %s.", ! otmp->quan == 1L ? "s" : "", gate_str); pline("%s", obuf); } else if(!nodrop) ! pline("%s fall%s %s.", obuf, ! otmp->quan == 1L ? "s" : "", gate_str); } /* migration destination for objects which fall down to next level */ --- 1383,1400 ---- xname(otmp)); if(num) { /* means: other objects are impacted */ ! Sprintf(eos(obuf), " %s %s object%s", ! otense(otmp, "hit"), ! num == 1L ? "another" : "other", ! num > 1L ? "s" : ""); if(nodrop) Sprintf(eos(obuf), "."); else ! Sprintf(eos(obuf), " and %s %s.", ! otense(otmp, "fall"), gate_str); pline("%s", obuf); } else if(!nodrop) ! pline("%s %s %s.", obuf, otense(otmp, "fall"), gate_str); } /* migration destination for objects which fall down to next level */ *** nethack-3.3.1/src/dothrow.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dothrow.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dothrow.c 3.3 2000/04/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dothrow.c 3.4 2002/02/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 9,14 **** --- 9,15 ---- STATIC_DCL int FDECL(throw_obj, (struct obj *,int)); STATIC_DCL void NDECL(autoquiver); STATIC_DCL int FDECL(gem_accept, (struct monst *, struct obj *)); + STATIC_DCL void FDECL(tmiss, (struct obj *, struct monst *)); STATIC_DCL int FDECL(throw_gold, (struct obj *)); STATIC_DCL void FDECL(check_shop_obj, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P)); STATIC_DCL void FDECL(breakobj, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P,BOOLEAN_P)); *************** *** 16,21 **** --- 17,23 ---- STATIC_DCL boolean FDECL(toss_up,(struct obj *, BOOLEAN_P)); STATIC_DCL boolean FDECL(throwing_weapon, (struct obj *)); STATIC_DCL void FDECL(sho_obj_return_to_u, (struct obj *obj)); + STATIC_DCL boolean FDECL(mhurtle_step, (genericptr_t,int,int)); static NEARDATA const char toss_objs[] = *************** *** 37,44 **** --- 39,48 ---- int multishot = 1; schar skill; long wep_mask; + boolean twoweap; /* ask "in what direction?" */ + #ifndef GOLDOBJ if (!getdir((char *)0)) { if (obj->oclass == GOLD_CLASS) { u.ugold += obj->quan; *************** *** 49,54 **** --- 53,76 ---- } if(obj->oclass == GOLD_CLASS) return(throw_gold(obj)); + #else + if (!getdir((char *)0)) { + /* obj might need to be merged back into the singular gold object */ + freeinv(obj); + addinv(obj); + return(0); + } + + /* + Throwing money is usually for getting rid of it when + a leprechaun approaches, or for bribing an oncoming + angry monster. So throw the whole object. + + If the money is in quiver, throw one coin at a time, + possibly using a sling. + */ + if(obj->oclass == GOLD_CLASS && obj != uquiver) return(throw_gold(obj)); + #endif if(!canletgo(obj,"throw")) return(0); *************** *** 66,71 **** --- 88,94 ---- You("cannot throw an object at yourself."); return(0); } + u_wipe_engr(2); if (!uarmg && !Stone_resistance && (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm]))) { You("throw the %s corpse with your bare %s.", *************** *** 73,79 **** Sprintf(killer_buf, "%s corpse", an(mons[obj->corpsenm].mname)); instapetrify(killer_buf); } ! u_wipe_engr(2); /* Multishot calculations */ --- 96,105 ---- Sprintf(killer_buf, "%s corpse", an(mons[obj->corpsenm].mname)); instapetrify(killer_buf); } ! if (welded(obj)) { ! weldmsg(obj); ! return 1; ! } /* Multishot calculations */ *************** *** 116,158 **** } } ! if (obj->quan < multishot) multishot = (int)obj->quan; multishot = rnd(multishot); if (shotlimit > 0 && multishot > shotlimit) multishot = shotlimit; ! while (obj && multishot-- > 0) { ! wep_mask = obj->owornmask; ! /* Split this object off from its slot */ ! otmp = (struct obj *)0; ! if (obj == uquiver) { ! if(obj->quan > 1L) ! setuqwep(otmp = splitobj(obj, 1L)); ! else ! setuqwep((struct obj *)0); ! } else if (obj == uswapwep) { ! if(obj->quan > 1L) ! setuswapwep(otmp = splitobj(obj, 1L)); ! else ! setuswapwep((struct obj *)0); ! } else if (obj == uwep) { ! if (welded(obj)) { ! weldmsg(obj); ! return(1); ! } ! if (obj->quan > 1L) ! setworn(otmp = splitobj(obj, 1L), W_WEP); ! /* not setuwep; do not change unweapon */ ! else { ! setuwep((struct obj *)0); ! if (uwep) return(1); /* unwielded, died, rewielded */ ! } ! } else if(obj->quan > 1L) ! otmp = splitobj(obj, 1L); ! freeinv(obj); ! throwit(obj, wep_mask); ! obj = otmp; ! } /* while (multishot) */ ! return(1); } --- 142,183 ---- } } ! if ((long)multishot > obj->quan) multishot = (int)obj->quan; multishot = rnd(multishot); if (shotlimit > 0 && multishot > shotlimit) multishot = shotlimit; ! m_shot.s = ammo_and_launcher(obj,uwep) ? TRUE : FALSE; ! /* give a message if shooting more than one, or if player ! attempted to specify a count */ ! if (multishot > 1 || shotlimit > 0) { ! /* "You shoot N arrows." or "You throw N daggers." */ ! You("%s %d %s.", ! m_shot.s ? "shoot" : "throw", ! multishot, /* (might be 1 if player gave shotlimit) */ ! (multishot == 1) ? singular(obj, xname) : xname(obj)); ! } ! ! wep_mask = obj->owornmask; ! m_shot.o = obj->otyp; ! m_shot.n = multishot; ! for (m_shot.i = 1; m_shot.i <= m_shot.n; m_shot.i++) { ! twoweap = u.twoweap; ! /* split this object off from its slot if necessary */ ! if (obj->quan > 1L) { ! otmp = splitobj(obj, 1L); ! } else { ! otmp = obj; ! if (otmp->owornmask && otmp != uball) ! remove_worn_item(otmp); ! } ! freeinv(otmp); ! throwit(otmp, wep_mask, twoweap); ! } ! m_shot.n = m_shot.i = 0; ! m_shot.o = STRANGE_OBJECT; ! m_shot.s = FALSE; ! ! return 1; } *************** *** 193,241 **** register struct obj *otmp, *oammo = 0, *omissile = 0, *omisc = 0; if (uquiver) ! return; /* Scan through the inventory */ for (otmp = invent; otmp; otmp = otmp->nobj) { ! if (otmp->owornmask || otmp->oartifact || !otmp->dknown) { ! ; /* Skip it */ ! } else if (otmp->otyp == ROCK || /* seen rocks or known flint or known glass */ (objects[otmp->otyp].oc_name_known && otmp->otyp == FLINT) || (objects[otmp->otyp].oc_name_known && otmp->oclass == GEM_CLASS && objects[otmp->otyp].oc_material == GLASS)) { ! if (uslinging()) ! oammo = otmp; ! else if (!omisc) ! omisc = otmp; ! } else if (otmp->oclass == GEM_CLASS) { ! ; /* skip non-rock gems--they're ammo but ! player has to select them explicitly */ ! } else if (is_ammo(otmp)) { ! if (ammo_and_launcher(otmp, uwep)) ! /* Ammo matched with launcher (bow and arrow, crossbow and bolt) */ ! oammo = otmp; ! else ! /* Mismatched ammo (no better than an ordinary weapon) */ ! omisc = otmp; ! } else if (is_missile(otmp)) { ! /* Missile (dart, shuriken, etc.) */ ! omissile = otmp; ! } else if (otmp->oclass == WEAPON_CLASS && !is_launcher(otmp)) { ! /* Ordinary weapon */ ! omisc = otmp; ! } } /* Pick the best choice */ if (oammo) ! setuqwep(oammo); else if (omissile) ! setuqwep(omissile); else if (omisc) ! setuqwep(omisc); return; } --- 218,270 ---- register struct obj *otmp, *oammo = 0, *omissile = 0, *omisc = 0; if (uquiver) ! return; /* Scan through the inventory */ for (otmp = invent; otmp; otmp = otmp->nobj) { ! if (otmp->owornmask || otmp->oartifact || !otmp->dknown) { ! ; /* Skip it */ ! } else if (otmp->otyp == ROCK || /* seen rocks or known flint or known glass */ (objects[otmp->otyp].oc_name_known && otmp->otyp == FLINT) || (objects[otmp->otyp].oc_name_known && otmp->oclass == GEM_CLASS && objects[otmp->otyp].oc_material == GLASS)) { ! if (uslinging()) ! oammo = otmp; ! else if (!omisc) ! omisc = otmp; ! } else if (otmp->oclass == GEM_CLASS) { ! ; /* skip non-rock gems--they're ammo but ! player has to select them explicitly */ ! } else if (is_ammo(otmp)) { ! if (ammo_and_launcher(otmp, uwep)) ! /* Ammo matched with launcher (bow and arrow, crossbow and bolt) */ ! oammo = otmp; ! else ! /* Mismatched ammo (no better than an ordinary weapon) */ ! omisc = otmp; ! } else if (is_missile(otmp)) { ! /* Missile (dart, shuriken, etc.) */ ! omissile = otmp; ! } else if (otmp->oclass == WEAPON_CLASS && throwing_weapon(otmp)) { ! /* Ordinary weapon */ ! if (objects[otmp->otyp].oc_skill == P_DAGGER ! && !omissile) ! omissile = otmp; ! else ! omisc = otmp; ! } } /* Pick the best choice */ if (oammo) ! setuqwep(oammo); else if (omissile) ! setuqwep(omissile); else if (omisc) ! setuqwep(omisc); return; } *************** *** 380,386 **** * Single step for the hero flying through the air from jumping, flying, * etc. Called from hurtle() and jump() via walk_path(). We expect the * argument to be a pointer to an integer -- the range -- which is ! * used in the calculation of points off it we hit something. * * Bumping into monsters won't cause damage but will wake them and make * them angry. Auto-pickup isn't done, since you don't have control over --- 409,415 ---- * Single step for the hero flying through the air from jumping, flying, * etc. Called from hurtle() and jump() via walk_path(). We expect the * argument to be a pointer to an integer -- the range -- which is ! * used in the calculation of points off if we hit something. * * Bumping into monsters won't cause damage but will wake them and make * them angry. Auto-pickup isn't done, since you don't have control over *************** *** 403,409 **** struct obj *obj; struct monst *mon; boolean may_pass = TRUE; ! if (!isok(x,y)) { You_feel("the spirits holding you back."); return FALSE; --- 432,439 ---- struct obj *obj; struct monst *mon; boolean may_pass = TRUE; ! struct trap *ttmp; ! if (!isok(x,y)) { You_feel("the spirits holding you back."); return FALSE; *************** *** 411,419 **** if (!Passes_walls || !(may_pass = may_passwall(x, y))) { if (IS_ROCK(levl[x][y].typ) || closed_door(x,y)) { pline("Ouch!"); ! losehp(rnd(2+*range), IS_ROCK(levl[x][y].typ) ? ! "bumping into a wall" : "bumping into a door", KILLED_BY); return FALSE; } if (levl[x][y].typ == IRONBARS) { --- 441,456 ---- if (!Passes_walls || !(may_pass = may_passwall(x, y))) { if (IS_ROCK(levl[x][y].typ) || closed_door(x,y)) { + char *s; + pline("Ouch!"); ! if (IS_TREE(levl[x][y].typ)) ! s = "bumping into a tree"; ! else if (IS_ROCK(levl[x][y].typ)) ! s = "bumping into a wall"; ! else ! s = "bumping into a door"; ! losehp(rnd(2+*range), s, KILLED_BY); return FALSE; } if (levl[x][y].typ == IRONBARS) { *************** *** 439,444 **** --- 476,489 ---- wakeup(mon); return FALSE; } + if ((u.ux - x) && (u.uy - y) && + bad_rock(youmonst.data,u.ux,y) && bad_rock(youmonst.data,x,u.uy)) { + /* Move at a diagonal. */ + if (In_sokoban(&u.uz)) { + You("come to an abrupt halt!"); + return FALSE; + } + } ox = u.ux; oy = u.uy; *************** *** 447,452 **** --- 492,524 ---- newsym(ox, oy); /* update old position */ vision_recalc(1); /* update for new position */ flush_screen(1); + /* FIXME: + * Each trap should really trigger on the recoil if + * it would trigger during normal movement. However, + * not all the possible side-effects of this are + * tested [as of 3.4.0] so we trigger those that + * we have tested, and offer a message for the + * ones that we have not yet tested. + */ + if ((ttmp = t_at(x, y)) != 0) { + if (ttmp->ttyp == MAGIC_PORTAL) { + dotrap(ttmp,0); + return FALSE; + } else if (ttmp->ttyp == FIRE_TRAP) { + dotrap(ttmp,0); + } else if ((ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT || + ttmp->ttyp == HOLE || ttmp->ttyp == TRAPDOOR) && + In_sokoban(&u.uz)) { + /* Air currents overcome the recoil */ + dotrap(ttmp,0); + return FALSE; + } else { + if (ttmp->tseen) + You("pass right over %s %s.", + (ttmp->ttyp == ARROW_TRAP) ? "an" : "a", + defsyms[trap_to_defsym(ttmp->ttyp)].explanation); + } + } if (--*range < 0) /* make sure our range never goes negative */ *range = 0; if (*range != 0) *************** *** 454,459 **** --- 526,553 ---- return TRUE; } + STATIC_OVL boolean + mhurtle_step(arg, x, y) + genericptr_t arg; + int x, y; + { + struct monst *mon = (struct monst *)arg; + + /* TODO: Treat walls, doors, iron bars, pools, lava, etc. specially + * rather than just stopping before. + */ + if (goodpos(x, y, mon) && m_in_out_region(mon, x, y)) { + remove_monster(mon->mx, mon->my); + newsym(mon->mx, mon->my); + place_monster(mon, x, y); + newsym(mon->mx, mon->my); + set_apparxy(mon); + (void) mintrap(mon); + return TRUE; + } + return FALSE; + } + /* * The player moves through the air for a few squares as a result of * throwing or kicking something. *************** *** 497,502 **** --- 591,603 ---- nomul(-range); if (verbose) You("%s in the opposite direction.", range > 1 ? "hurtle" : "float"); + /* if we're in the midst of shooting multiple projectiles, stop */ + if (m_shot.i < m_shot.n) { + /* last message before hurtling was "you shoot N arrows" */ + You("stop %sing after the first %s.", + m_shot.s ? "shoot" : "throw", m_shot.s ? "shot" : "toss"); + m_shot.n = m_shot.i; /* make current shot be the last */ + } if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ uc.x = u.ux; *************** *** 507,512 **** --- 608,646 ---- (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t)&range); } + /* Move a monster through the air for a few squares. + */ + void + mhurtle(mon, dx, dy, range) + struct monst *mon; + int dx, dy, range; + { + coord mc, cc; + + /* At the very least, debilitate the monster */ + mon->movement = 0; + mon->mstun = 1; + + /* Is the monster stuck or too heavy to push? + * (very large monsters have too much inertia, even floaters and flyers) + */ + if (mon->data->msize >= MZ_HUGE || mon == u.ustuck || mon->mtrapped) + return; + + /* Make sure dx and dy are [-1,0,1] */ + dx = sgn(dx); + dy = sgn(dy); + if(!range || (!dx && !dy)) return; /* paranoia */ + + /* Send the monster along the path */ + mc.x = mon->mx; + mc.y = mon->my; + cc.x = mon->mx + (dx * range); + cc.y = mon->my + (dy * range); + (void) walk_path(&mc, &cc, mhurtle_step, (genericptr_t)mon); + return; + } + STATIC_OVL void check_shop_obj(obj, x, y, broken) register struct obj *obj; *************** *** 578,583 **** --- 712,722 ---- int otyp = obj->otyp, ocorpsenm = obj->corpsenm; int blindinc; + /* need to check for blindness result prior to destroying obj */ + blindinc = (otyp == CREAM_PIE || otyp == BLINDING_VENOM) && + /* AT_WEAP is ok here even if attack type was AT_SPIT */ + can_blnd(&youmonst, &youmonst, AT_WEAP, obj) ? rnd(25) : 0; + breakmsg(obj, !Blind); breakobj(obj, u.ux, u.uy, TRUE, TRUE); obj = 0; /* it's now gone */ *************** *** 590,602 **** case CREAM_PIE: case BLINDING_VENOM: pline("You've got it all over your %s!", body_part(FACE)); ! blindinc = rnd(25); ! if (blindinc && !Blindfolded) { ! if (otyp != BLINDING_VENOM) ! u.ucreamed += blindinc; ! else if (!Blind) pline("It blinds you!"); ! make_blinded(Blinded + blindinc, FALSE); } break; default: --- 729,740 ---- case CREAM_PIE: case BLINDING_VENOM: pline("You've got it all over your %s!", body_part(FACE)); ! if (blindinc) { ! if (otyp == BLINDING_VENOM && !Blind) pline("It blinds you!"); ! u.ucreamed += blindinc; ! make_blinded(Blinded + (long)blindinc, FALSE); ! if (!Blind) Your(vision_clears); } break; default: *************** *** 604,612 **** } return FALSE; } else { /* neither potion nor other breaking object */ ! boolean less_damage = uarmh && is_metallic(uarmh); int dmg = dmgval(obj, &youmonst); if (!dmg) { /* probably wasn't a weapon; base damage on weight */ dmg = (int) obj->owt / 100; if (dmg < 1) dmg = 1; --- 742,755 ---- } return FALSE; } else { /* neither potion nor other breaking object */ ! boolean less_damage = uarmh && is_metallic(uarmh), artimsg = FALSE; int dmg = dmgval(obj, &youmonst); + if (obj->oartifact) + /* need a fake die roll here; rn1(18,2) avoids 1 and 20 */ + artimsg = artifact_hit((struct monst *)0, &youmonst, + obj, &dmg, rn1(18,2)); + if (!dmg) { /* probably wasn't a weapon; base damage on weight */ dmg = (int) obj->owt / 100; if (dmg < 1) dmg = 1; *************** *** 618,628 **** if (dmg > 1 && less_damage) dmg = 1; if (dmg > 0) dmg += u.udaminc; if (dmg < 0) dmg = 0; /* beware negative rings of increase damage */ if (uarmh) { ! if (less_damage && dmg < (Upolyd ? u.mh : u.uhp)) ! pline("Fortunately, you are wearing a hard helmet."); ! else if (flags.verbose && !(obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm]))) Your("%s does not protect you.", xname(uarmh)); } else if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) { --- 761,773 ---- if (dmg > 1 && less_damage) dmg = 1; if (dmg > 0) dmg += u.udaminc; if (dmg < 0) dmg = 0; /* beware negative rings of increase damage */ + if (Half_physical_damage) dmg = (dmg + 1) / 2; if (uarmh) { ! if (less_damage && dmg < (Upolyd ? u.mh : u.uhp)) { ! if (!artimsg) ! pline("Fortunately, you are wearing a hard helmet."); ! } else if (flags.verbose && !(obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm]))) Your("%s does not protect you.", xname(uarmh)); } else if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) { *************** *** 675,683 **** } void ! throwit(obj, wep_mask) register struct obj *obj; long wep_mask; /* used to re-equip returning boomerang */ { register struct monst *mon; register int range, urange; --- 820,829 ---- } void ! throwit(obj, wep_mask, twoweap) register struct obj *obj; long wep_mask; /* used to re-equip returning boomerang */ + boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */ { register struct monst *mon; register int range, urange; *************** *** 687,699 **** if ((obj->cursed || obj->greased) && (u.dx || u.dy) && !rn2(7)) { boolean slipok = TRUE; if (ammo_and_launcher(obj, uwep)) ! pline("%s misfires!", The(xname(obj))); else { /* only slip if it's greased or meant to be thrown */ if (obj->greased || throwing_weapon(obj)) /* BUG: this message is grammatically incorrect if obj has a plural name; greased gloves or boots for instance. */ ! pline("%s slips as you throw it!", The(xname(obj))); else slipok = FALSE; } if (slipok) { --- 833,845 ---- if ((obj->cursed || obj->greased) && (u.dx || u.dy) && !rn2(7)) { boolean slipok = TRUE; if (ammo_and_launcher(obj, uwep)) ! pline("%s!", Tobjnam(obj, "misfire")); else { /* only slip if it's greased or meant to be thrown */ if (obj->greased || throwing_weapon(obj)) /* BUG: this message is grammatically incorrect if obj has a plural name; greased gloves or boots for instance. */ ! pline("%s as you throw it!", Tobjnam(obj, "slip")); else slipok = FALSE; } if (slipok) { *************** *** 704,709 **** --- 850,868 ---- } } + if ((u.dx || u.dy || (u.dz < 1)) && + calc_capacity((int)obj->owt) > SLT_ENCUMBER && + (Upolyd ? (u.mh < 5 && u.mh != u.mhmax) + : (u.uhp < 10 && u.uhp != u.uhpmax)) && + obj->owt > (unsigned)((Upolyd ? u.mh : u.uhp) * 2) && + !Is_airlevel(&u.uz)) { + You("have so little stamina, %s drops from your grasp.", + the(xname(obj))); + exercise(A_CON, FALSE); + u.dx = u.dy = 0; + u.dz = 1; + } + if(u.uswallow) { mon = u.ustuck; bhitpos.x = mon->mx; *************** *** 711,721 **** } else if(u.dz) { if (u.dz < 0 && Role_if(PM_VALKYRIE) && obj->oartifact == ART_MJOLLNIR && !impaired) { ! pline("%s hits the %s and returns to your hand!", ! The(xname(obj)), ceiling(u.ux,u.uy)); obj = addinv(obj); (void) encumber_msg(); setuwep(obj); } else if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) { (void) toss_up(obj, rn2(5)); --- 870,881 ---- } else if(u.dz) { if (u.dz < 0 && Role_if(PM_VALKYRIE) && obj->oartifact == ART_MJOLLNIR && !impaired) { ! pline("%s the %s and returns to your hand!", ! Tobjnam(obj, "hit"), ceiling(u.ux,u.uy)); obj = addinv(obj); (void) encumber_msg(); setuwep(obj); + u.twoweap = twoweap; } else if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) { (void) toss_up(obj, rn2(5)); *************** *** 732,739 **** exercise(A_DEX, TRUE); obj = addinv(obj); (void) encumber_msg(); ! if (wep_mask && !(obj->owornmask & wep_mask)) setworn(obj, wep_mask); return; } } else { --- 892,901 ---- exercise(A_DEX, TRUE); obj = addinv(obj); (void) encumber_msg(); ! if (wep_mask && !(obj->owornmask & wep_mask)) { setworn(obj, wep_mask); + u.twoweap = twoweap; + } return; } } else { *************** *** 756,762 **** if (is_ammo(obj)) { if (ammo_and_launcher(obj, uwep)) range++; ! else range /= 2; } --- 918,924 ---- if (is_ammo(obj)) { if (ammo_and_launcher(obj, uwep)) range++; ! else if (obj->oclass != GEM_CLASS) range /= 2; } *************** *** 819,843 **** sho_obj_return_to_u(obj); /* display its flight */ if (!impaired && rn2(100)) { ! pline("%s returns to your hand!", The(xname(obj))); obj = addinv(obj); (void) encumber_msg(); setuwep(obj); if(cansee(bhitpos.x, bhitpos.y)) newsym(bhitpos.x,bhitpos.y); } else { ! int dmg = rnd(4); ! if (Blind) ! pline("%s hits your %s!", ! The(xname(obj)), body_part(ARM)); ! else ! pline("%s flies back toward you, hitting your %s!", ! The(xname(obj)), body_part(ARM)); ! (void) artifact_hit((struct monst *) 0, &youmonst, ! obj, &dmg, 0); ! losehp(dmg, xname(obj), KILLED_BY); ! if(ship_object(obj, u.ux, u.uy, FALSE)) ! return; dropy(obj); } return; --- 981,1013 ---- sho_obj_return_to_u(obj); /* display its flight */ if (!impaired && rn2(100)) { ! pline("%s to your hand!", Tobjnam(obj, "return")); obj = addinv(obj); (void) encumber_msg(); setuwep(obj); + u.twoweap = twoweap; if(cansee(bhitpos.x, bhitpos.y)) newsym(bhitpos.x,bhitpos.y); } else { ! int dmg = rn2(2); ! if (!dmg) { ! pline(Blind ? "%s lands %s your %s." : ! "%s back to you, landing %s your %s.", ! Blind ? Something : Tobjnam(obj, "return"), ! Levitation ? "beneath" : "at", ! makeplural(body_part(FOOT))); ! } else { ! dmg += rnd(3); ! pline(Blind ? "%s your %s!" : ! "%s back toward you, hitting your %s!", ! Tobjnam(obj, Blind ? "hit" : "fly"), ! body_part(ARM)); ! (void) artifact_hit((struct monst *)0, ! &youmonst, obj, &dmg, 0); ! losehp(dmg, xname(obj), KILLED_BY); ! } ! if (ship_object(obj, u.ux, u.uy, FALSE)) ! return; dropy(obj); } return; *************** *** 854,863 **** return; } if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return; ! if (obj->otyp == CRYSKNIFE && (!obj->oerodeproof || !rn2(10))) { ! obj->otyp = WORM_TOOTH; ! obj->oerodeproof = 0; ! } if (mon && mon->isshk && is_pick(obj)) { if (cansee(bhitpos.x, bhitpos.y)) pline("%s snatches up %s.", --- 1024,1030 ---- return; } if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return; ! obj_no_longer_held(obj); if (mon && mon->isshk && is_pick(obj)) { if (cansee(bhitpos.x, bhitpos.y)) pline("%s snatches up %s.", *************** *** 931,937 **** struct obj *obj; struct monst *mon; { ! miss(xname(obj), mon); if (!rn2(3)) wakeup(mon); return; } --- 1098,1114 ---- struct obj *obj; struct monst *mon; { ! const char *missile = mshot_xname(obj); ! ! /* If the target can't be seen or doesn't look like a valid target, ! avoid "the arrow misses it," or worse, "the arrows misses the mimic." ! An attentive player will still notice that this is different from ! an arrow just landing short of any target (no message in that case), ! so will realize that there is a valid target here anyway. */ ! if (!canseemon(mon) || (mon->m_ap_type && mon->m_ap_type != M_AP_MONSTER)) ! pline("%s misses.", The(missile)); ! else ! miss(missile, mon); if (!rn2(3)) wakeup(mon); return; } *************** *** 1051,1066 **** } else { tmp += uwep->spe - greatest_erosion(uwep); tmp += weapon_hit_bonus(uwep); /* * Elves and Samurais are highly trained w/bows, * especially their own special types of bow. * Polymorphing won't make you a bow expert. */ if ((Race_if(PM_ELF) || Role_if(PM_SAMURAI)) && objects[uwep->otyp].oc_skill == P_BOW) { tmp++; ! if (is_elf(youmonst.data) && uwep->otyp == ELVEN_BOW) tmp++; ! else if (Role_if(PM_SAMURAI) && uwep->otyp == YUMI) tmp++; } } } else { --- 1228,1247 ---- } else { tmp += uwep->spe - greatest_erosion(uwep); tmp += weapon_hit_bonus(uwep); + if (uwep->oartifact) tmp += spec_abon(uwep, mon); /* * Elves and Samurais are highly trained w/bows, * especially their own special types of bow. * Polymorphing won't make you a bow expert. */ if ((Race_if(PM_ELF) || Role_if(PM_SAMURAI)) && + (!Upolyd || your_race(youmonst.data)) && objects[uwep->otyp].oc_skill == P_BOW) { tmp++; ! if (Race_if(PM_ELF) && uwep->otyp == ELVEN_BOW) ! tmp++; ! else if (Role_if(PM_SAMURAI) && uwep->otyp == YUMI) ! tmp++; } } } else { *************** *** 1090,1095 **** --- 1271,1277 ---- obfree(obj, (struct obj *)0); return 1; } + passive_obj(mon, obj, (struct attack *)0); } else { tmiss(obj, mon); } *************** *** 1128,1142 **** potionhit(mon, obj, TRUE); return 1; ! } else if (obj->oclass == FOOD_CLASS && ! is_domestic(mon->data) && tamedog(mon,obj)) { ! return 1; /* food is gone */ } else if (guaranteed_hit) { /* this assumes that guaranteed_hit is due to swallowing */ - pline("%s vanishes into %s %s.", - The(xname(obj)), s_suffix(mon_nam(mon)), - is_animal(u.ustuck->data) ? "entrails" : "currents"); wakeup(mon); } else { tmiss(obj, mon); } --- 1310,1340 ---- potionhit(mon, obj, TRUE); return 1; ! } else if (befriend_with_obj(mon->data, obj)) { ! if (tamedog(mon, obj)) ! return 1; /* obj is gone */ ! else { ! /* not tmiss(), which angers non-tame monsters */ ! miss(xname(obj), mon); ! mon->msleeping = 0; ! mon->mstrategy &= ~STRAT_WAITMASK; ! } } else if (guaranteed_hit) { /* this assumes that guaranteed_hit is due to swallowing */ wakeup(mon); + if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) { + if (is_animal(u.ustuck->data)) { + minstapetrify(u.ustuck, TRUE); + /* Don't leave a cockatrice corpse available in a statue */ + if (!u.uswallow) { + delobj(obj); + return 1; + } + } + } + pline("%s into %s %s.", + Tobjnam(obj, "vanish"), s_suffix(mon_nam(mon)), + is_animal(u.ustuck->data) ? "entrails" : "currents"); } else { tmiss(obj, mon); } *************** *** 1161,1166 **** --- 1359,1365 ---- Strcpy(buf,Monnam(mon)); mon->mpeaceful = 1; + mon->mavenge = 0; /* object properly identified */ if(obj->dknown && objects[obj->otyp].oc_name_known) { *************** *** 1300,1309 **** if (obj->otyp == POT_OIL && obj->lamplit) { splatter_burning_oil(x,y); } else if (distu(x,y) <= 2) { ! /* [what about "familiar odor" when known?] */ ! if (obj->otyp != POT_WATER) ! You("smell a peculiar odor..."); ! potionbreathe(obj); } /* monster breathing isn't handled... [yet?] */ break; --- 1499,1519 ---- if (obj->otyp == POT_OIL && obj->lamplit) { splatter_burning_oil(x,y); } else if (distu(x,y) <= 2) { ! if (!breathless(youmonst.data) || haseyes(youmonst.data)) { ! if (obj->otyp != POT_WATER) { ! if (!breathless(youmonst.data)) ! /* [what about "familiar odor" when known?] */ ! You("smell a peculiar odor..."); ! else { ! int numeyes = eyecount(youmonst.data); ! Your("%s water%s.", ! (numeyes == 1) ? body_part(EYE) : ! makeplural(body_part(EYE)), ! (numeyes == 1) ? "s" : ""); ! } ! } ! potionbreathe(obj); ! } } /* monster breathing isn't handled... [yet?] */ break; *************** *** 1350,1358 **** struct obj *obj; { if (obj_resists(obj, 1, 99)) return 0; switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) { - case MIRROR: - case CRYSTAL_BALL: #ifdef TOURIST case EXPENSIVE_CAMERA: #endif --- 1560,1569 ---- struct obj *obj; { if (obj_resists(obj, 1, 99)) return 0; + if (objects[obj->otyp].oc_material == GLASS && !obj->oartifact && + obj->oclass != GEM_CLASS) + return 1; switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) { #ifdef TOURIST case EXPENSIVE_CAMERA: #endif *************** *** 1376,1381 **** --- 1587,1597 ---- to_pieces = ""; switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) { + default: /* glass or crystal wand */ + if (obj->oclass != WAND_CLASS) + impossible("breaking odd object?"); + case CRYSTAL_PLATE_MAIL: + case LENSES: case MIRROR: case CRYSTAL_BALL: #ifdef TOURIST *************** *** 1411,1425 **** --- 1627,1655 ---- struct obj *obj; { int range, odx, ody; + #ifndef GOLDOBJ long zorks = obj->quan; + #endif register struct monst *mon; + if(!u.dx && !u.dy && !u.dz) { + You("cannot throw gold at yourself."); + return(0); + } + #ifdef GOLDOBJ + freeinv(obj); + #endif if(u.uswallow) { pline(is_animal(u.ustuck->data) ? "%s in the %s's entrails." : "%s into %s.", + #ifndef GOLDOBJ "The gold disappears", mon_nam(u.ustuck)); u.ustuck->mgold += zorks; dealloc_obj(obj); + #else + "The money disappears", mon_nam(u.ustuck)); + add_to_minv(u.ustuck, obj); + #endif return(1); } *** nethack-3.3.1/src/do_name.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/do_name.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)do_name.c 3.3 2000/06/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)do_name.c 3.4 2002/01/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 155,161 **** } /* column */ } /* row */ } /* pass */ ! pline("Can't find dungeon feature '%c'", c); msg_given = TRUE; goto nxtc; } else { --- 155,161 ---- } /* column */ } /* row */ } /* pass */ ! pline("Can't find dungeon feature '%c'.", c); msg_given = TRUE; goto nxtc; } else { *************** *** 268,277 **** return(0); } /* special case similar to the one in lookat() */ ! if (mtmp->data != &mons[PM_HIGH_PRIEST]) ! Strcpy(buf, x_monnam(mtmp, ARTICLE_THE, (char *)0, 0, TRUE)); ! else ! Sprintf(buf, "the high priest%s", mtmp->female ? "ess" : ""); Sprintf(qbuf, "What do you want to call %s?", buf); getlin(qbuf,buf); if(!*buf || *buf == '\033') return(0); --- 268,274 ---- return(0); } /* special case similar to the one in lookat() */ ! (void) distant_monnam(mtmp, ARTICLE_THE, buf); Sprintf(qbuf, "What do you want to call %s?", buf); getlin(qbuf,buf); if(!*buf || *buf == '\033') return(0); *************** *** 299,305 **** short objtyp; Sprintf(qbuf, "What do you want to name %s %s?", ! (obj->quan > 1L) ? "these" : "this", xname(obj)); getlin(qbuf, buf); if(!*buf || *buf == '\033') return; /* strip leading and trailing spaces; unnames item if all spaces */ --- 296,302 ---- short objtyp; Sprintf(qbuf, "What do you want to name %s %s?", ! is_plural(obj) ? "these" : "this", xname(obj)); getlin(qbuf, buf); if(!*buf || *buf == '\033') return; /* strip leading and trailing spaces; unnames item if all spaces */ *************** *** 580,585 **** --- 577,583 ---- struct permonst *mdat = mtmp->data; boolean do_hallu, do_invis, do_it, do_saddle; boolean name_at_start, has_adjectives; + char *bp; if (program_state.gameover) suppress |= SUPPRESS_HALLUCINATION; *************** *** 600,605 **** --- 598,609 ---- buf[0] = 0; + /* unseen monsters, etc. Use "it" */ + if (do_it) { + Strcpy(buf, "it"); + return buf; + } + /* priests and minions: don't even use this function */ if (mtmp->ispriest || mtmp->isminion) { char priestnambuf[BUFSZ]; *************** *** 618,629 **** return strcpy(buf, name); } - /* unseen monsters, etc. Use "it" */ - if (do_it) { - Strcpy(buf, "it"); - return buf; - } - /* Shopkeepers: use shopkeeper name. For normal shopkeepers, just * "Asidonhopo"; for unusual ones, "Asidonhopo the invisible * shopkeeper" or "Asidonhopo the blue dragon". If hallucinating, --- 622,627 ---- *************** *** 654,660 **** if (do_invis) Strcat(buf, "invisible "); #ifdef STEED ! if (do_saddle && (mtmp->misc_worn_check & W_SADDLE) && !Blind) Strcat(buf, "saddled "); #endif if (buf[0] != 0) --- 652,659 ---- if (do_invis) Strcat(buf, "invisible "); #ifdef STEED ! if (do_saddle && (mtmp->misc_worn_check & W_SADDLE) && ! !Blind && !Hallucination) Strcat(buf, "saddled "); #endif if (buf[0] != 0) *************** *** 669,681 **** name_at_start = FALSE; } else if (mtmp->mnamelth) { char *name = NAME(mtmp); ! if (mdat == &mons[PM_GHOST]) { Sprintf(eos(buf), "%s ghost", s_suffix(name)); name_at_start = TRUE; } else if (called) { Sprintf(eos(buf), "%s called %s", mdat->mname, name); name_at_start = (boolean)type_is_pname(mdat); } else { Strcat(buf, name); name_at_start = TRUE; --- 668,692 ---- name_at_start = FALSE; } else if (mtmp->mnamelth) { char *name = NAME(mtmp); ! if (mdat == &mons[PM_GHOST]) { Sprintf(eos(buf), "%s ghost", s_suffix(name)); name_at_start = TRUE; } else if (called) { Sprintf(eos(buf), "%s called %s", mdat->mname, name); name_at_start = (boolean)type_is_pname(mdat); + } else if (is_mplayer(mdat) && (bp = strstri(name, " the ")) != 0) { + /* the */ + char pbuf[BUFSZ]; + + Strcpy(pbuf, name); + pbuf[bp - name + 5] = '\0'; /* adjectives right after " the " */ + if (has_adjectives) + Strcat(pbuf, buf); + Strcat(pbuf, bp + 5); /* append the rest of the name */ + Strcpy(buf, pbuf); + article = ARTICLE_NONE; + name_at_start = TRUE; } else { Strcat(buf, name); name_at_start = TRUE; *************** *** 697,702 **** --- 708,716 ---- article = ARTICLE_THE; else article = ARTICLE_NONE; + } else if (mons[monsndx(mdat)].geno & G_UNIQ && + article == ARTICLE_A) { + article = ARTICLE_THE; } { *************** *** 827,832 **** --- 841,867 ---- return(bp); } + /* used for monster ID by the '/', ';', and 'C' commands to block remote + identification of the endgame altars via their attending priests */ + char * + distant_monnam(mon, article, outbuf) + struct monst *mon; + int article; /* only ARTICLE_NONE and ARTICLE_THE are handled here */ + char *outbuf; + { + /* high priest(ess)'s identity is concealed on the Astral Plane, + unless you're adjacent (overridden for hallucination which does + its own obfuscation) */ + if (mon->data == &mons[PM_HIGH_PRIEST] && !Hallucination && + Is_astralevel(&u.uz) && distu(mon->mx, mon->my) > 2) { + Strcpy(outbuf, article == ARTICLE_THE ? "the " : ""); + Strcat(outbuf, mon->female ? "high priestess" : "high priest"); + } else { + Strcpy(outbuf, x_monnam(mon, article, (char *)0, 0, TRUE)); + } + return outbuf; + } + static const char *bogusmons[] = { "jumbo shrimp", "giant pigmy", "gnu", "killer penguin", "giant cockroach", "giant slug", "maggot", "pterodactyl", *************** *** 901,931 **** return mons[name].mname; } - const char *pronoun_pairs[][2] = { - {"him", "her"}, {"Him", "Her"}, {"his", "her"}, {"His", "Her"}, - {"he", "she"}, {"He", "She"}, - {0, 0} - }; - - char * - self_pronoun(str, pronoun) - const char *str; - const char *pronoun; - { - static NEARDATA char buf[BUFSZ]; - register int i; - - for(i=0; pronoun_pairs[i][0]; i++) { - if(!strncmp(pronoun, pronoun_pairs[i][0], 3)) { - Sprintf(buf, str, pronoun_pairs[i][flags.female]); - return buf; - } - } - impossible("never heard of pronoun %s?", pronoun); - Sprintf(buf, str, pronoun_pairs[i][0]); - return buf; - } - #ifdef REINCARNATION const char * roguename() /* Name of a Rogue player */ --- 936,941 ---- *************** *** 986,999 **** "Nemesis Riduclii","Canis latrans" }; ! char *coyotename(buf) char *buf; { ! if (buf) ! Sprintf(buf, ! "coyote - %s", ! coynames[rn2(SIZE(coynames)-1)]); ! return buf; } #endif /* OVL2 */ --- 996,1011 ---- "Nemesis Riduclii","Canis latrans" }; ! char *coyotename(mtmp, buf) ! struct monst *mtmp; char *buf; { ! if (mtmp && buf) { ! Sprintf(buf, "%s - %s", ! x_monnam(mtmp, ARTICLE_NONE, (char *)0, 0, TRUE), ! mtmp->mcan ? coynames[SIZE(coynames)-1] : coynames[rn2(SIZE(coynames)-1)]); ! } ! return buf; } #endif /* OVL2 */ *** nethack-3.3.1/src/do_wear.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/do_wear.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)do_wear.c 3.3 2000/05/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)do_wear.c 3.4 2002/02/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 13,18 **** --- 13,19 ---- STATIC_OVL NEARDATA long takeoff_mask = 0L, taking_off = 0L; static NEARDATA int todelay; + static boolean cancelled_don = FALSE; static NEARDATA const char see_yourself[] = "see yourself"; static NEARDATA const char unknown_type[] = "Unknown type of %s (%d)"; *************** *** 67,75 **** on_msg(otmp) register struct obj *otmp; { ! if(flags.verbose) ! You("are now wearing %s.", ! obj_is_pname(otmp) ? the(xname(otmp)) : an(xname(otmp))); } /* --- 68,83 ---- on_msg(otmp) register struct obj *otmp; { ! if (flags.verbose) { ! char how[BUFSZ]; ! ! how[0] = '\0'; ! if (otmp->otyp == TOWEL) ! Sprintf(how, " around your %s", body_part(HEAD)); ! You("are now wearing %s%s.", ! obj_is_pname(otmp) ? the(xname(otmp)) : an(xname(otmp)), ! how); ! } } /* *************** *** 81,88 **** int Boots_on() { ! long oldprop = u.uprops[objects[uarmf->otyp].oc_oprop].extrinsic & ~WORN_BOOTS; ! switch(uarmf->otyp) { case LOW_BOOTS: --- 89,96 ---- int Boots_on() { ! long oldprop = ! u.uprops[objects[uarmf->otyp].oc_oprop].extrinsic & ~WORN_BOOTS; switch(uarmf->otyp) { case LOW_BOOTS: *************** *** 117,122 **** --- 125,131 ---- if (!oldprop && !HLevitation) { makeknown(uarmf->otyp); float_up(); + spoteffects(FALSE); } break; default: impossible(unknown_type, c_boots, uarmf->otyp); *************** *** 128,134 **** Boots_off() { int otyp = uarmf->otyp; ! long oldprop = u.uprops[objects[otyp].oc_oprop].extrinsic & ~WORN_BOOTS; /* For levitation, float_down() returns if Levitation, so we --- 137,143 ---- Boots_off() { int otyp = uarmf->otyp; ! long oldprop = u.uprops[objects[otyp].oc_oprop].extrinsic & ~WORN_BOOTS; /* For levitation, float_down() returns if Levitation, so we *************** *** 137,158 **** setworn((struct obj *)0, W_ARMF); switch (otyp) { case SPEED_BOOTS: ! if (!Very_fast) { makeknown(otyp); You_feel("yourself slow down%s.", Fast ? " a bit" : ""); } break; case WATER_WALKING_BOOTS: ! if (is_pool(u.ux,u.uy) && !Levitation ! && !Flying && !is_clinger(youmonst.data)) { makeknown(otyp); /* make boots known in case you survive the drowning */ spoteffects(TRUE); } break; case ELVEN_BOOTS: ! if (!oldprop && !HStealth && !BStealth) { makeknown(otyp); You("sure are noisy."); } --- 146,167 ---- setworn((struct obj *)0, W_ARMF); switch (otyp) { case SPEED_BOOTS: ! if (!Very_fast && !cancelled_don) { makeknown(otyp); You_feel("yourself slow down%s.", Fast ? " a bit" : ""); } break; case WATER_WALKING_BOOTS: ! if (is_pool(u.ux,u.uy) && !Levitation && !Flying && ! !is_clinger(youmonst.data) && !cancelled_don) { makeknown(otyp); /* make boots known in case you survive the drowning */ spoteffects(TRUE); } break; case ELVEN_BOOTS: ! if (!oldprop && !HStealth && !BStealth && !cancelled_don) { makeknown(otyp); You("sure are noisy."); } *************** *** 162,168 **** HFumbling = EFumbling = 0; break; case LEVITATION_BOOTS: ! if (!oldprop && !HLevitation) { (void) float_down(0L, 0L); makeknown(otyp); } --- 171,177 ---- HFumbling = EFumbling = 0; break; case LEVITATION_BOOTS: ! if (!oldprop && !HLevitation && !cancelled_don) { (void) float_down(0L, 0L); makeknown(otyp); } *************** *** 175,188 **** break; default: impossible(unknown_type, c_boots, otyp); } return 0; } STATIC_OVL int Cloak_on() { ! long oldprop = u.uprops[objects[uarmc->otyp].oc_oprop].extrinsic & ~WORN_CLOAK; ! switch(uarmc->otyp) { case ELVEN_CLOAK: --- 184,198 ---- break; default: impossible(unknown_type, c_boots, otyp); } + cancelled_don = FALSE; return 0; } STATIC_OVL int Cloak_on() { ! long oldprop = ! u.uprops[objects[uarmc->otyp].oc_oprop].extrinsic & ~WORN_CLOAK; switch(uarmc->otyp) { case ELVEN_CLOAK: *************** *** 194,199 **** --- 204,210 ---- case DWARVISH_CLOAK: case CLOAK_OF_MAGIC_RESISTANCE: case ROBE: + case LEATHER_CLOAK: break; case MUMMY_WRAPPING: /* Note: it's already being worn, so we have to cheat here. */ *************** *** 215,221 **** } break; case OILSKIN_CLOAK: ! pline("%s fits very tightly.",The(xname(uarmc))); break; /* Alchemy smock gives poison _and_ acid resistance */ case ALCHEMY_SMOCK: --- 226,232 ---- } break; case OILSKIN_CLOAK: ! pline("%s very tightly.", Tobjnam(uarmc, "fit")); break; /* Alchemy smock gives poison _and_ acid resistance */ case ALCHEMY_SMOCK: *************** *** 244,249 **** --- 255,261 ---- case CLOAK_OF_DISPLACEMENT: case OILSKIN_CLOAK: case ROBE: + case LEATHER_CLOAK: break; case MUMMY_WRAPPING: if (Invis && !Blind) { *************** *** 305,313 **** /*FALLTHRU*/ case DUNCE_CAP: if (!uarmh->cursed) { ! pline("%s %s%s for a moment.", The(xname(uarmh)), ! Blind ? "vibrates" : "glows ", ! Blind ? (const char *)"" : hcolor(Black)); curse(uarmh); } flags.botl = 1; /* reveal new alignment or INT & WIS */ --- 317,327 ---- /*FALLTHRU*/ case DUNCE_CAP: if (!uarmh->cursed) { ! if (Blind) ! pline("%s for a moment.", Tobjnam(uarmh, "vibrate")); ! else ! pline("%s %s for a moment.", ! Tobjnam(uarmh, "glow"), hcolor(Black)); curse(uarmh); } flags.botl = 1; /* reveal new alignment or INT & WIS */ *************** *** 337,366 **** case ELVEN_LEATHER_HELM: case DWARVISH_IRON_HELM: case ORCISH_HELM: ! break; case DUNCE_CAP: ! flags.botl = 1; ! break; case CORNUTHAUM: ABON(A_CHA) += (Role_if(PM_WIZARD) ? -1 : 1); flags.botl = 1; ! break; case HELM_OF_TELEPATHY: ! /* need to update ability before calling see_monsters() */ ! setworn((struct obj *)0, W_ARMH); ! see_monsters(); ! return 0; case HELM_OF_BRILLIANCE: ! adj_abon(uarmh, -uarmh->spe); ! break; case HELM_OF_OPPOSITE_ALIGNMENT: ! u.ualign.type = u.ualignbase[A_CURRENT]; ! u.ublessed = 0; /* lose the other god's protection */ ! flags.botl = 1; ! break; default: impossible(unknown_type, c_helmet, uarmh->otyp); } setworn((struct obj *)0, W_ARMH); return 0; } --- 351,383 ---- case ELVEN_LEATHER_HELM: case DWARVISH_IRON_HELM: case ORCISH_HELM: ! break; case DUNCE_CAP: ! flags.botl = 1; ! break; case CORNUTHAUM: + if (!cancelled_don) { ABON(A_CHA) += (Role_if(PM_WIZARD) ? -1 : 1); flags.botl = 1; ! } ! break; case HELM_OF_TELEPATHY: ! /* need to update ability before calling see_monsters() */ ! setworn((struct obj *)0, W_ARMH); ! see_monsters(); ! return 0; case HELM_OF_BRILLIANCE: ! if (!cancelled_don) adj_abon(uarmh, -uarmh->spe); ! break; case HELM_OF_OPPOSITE_ALIGNMENT: ! u.ualign.type = u.ualignbase[A_CURRENT]; ! u.ublessed = 0; /* lose the other god's protection */ ! flags.botl = 1; ! break; default: impossible(unknown_type, c_helmet, uarmh->otyp); } setworn((struct obj *)0, W_ARMH); + cancelled_don = FALSE; return 0; } *************** *** 369,376 **** Gloves_on() { long oldprop = ! u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES; ! switch(uarmg->otyp) { case LEATHER_GLOVES: --- 386,392 ---- Gloves_on() { long oldprop = ! u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES; switch(uarmg->otyp) { case LEATHER_GLOVES: *************** *** 395,444 **** Gloves_off() { long oldprop = ! u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES; ! switch(uarmg->otyp) { case LEATHER_GLOVES: ! break; case GAUNTLETS_OF_FUMBLING: ! if (!oldprop && !(HFumbling & ~TIMEOUT)) ! HFumbling = EFumbling = 0; ! break; case GAUNTLETS_OF_POWER: ! makeknown(uarmg->otyp); ! flags.botl = 1; /* taken care of in attrib.c */ ! break; case GAUNTLETS_OF_DEXTERITY: ! adj_abon(uarmg, -uarmg->spe); ! break; default: impossible(unknown_type, c_gloves, uarmg->otyp); } setworn((struct obj *)0, W_ARMG); /* Prevent wielding cockatrice when not wearing gloves */ if (uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm])) { char kbuf[BUFSZ]; ! You("wield the %s corpse in your bare %s.", ! mons[uwep->corpsenm].mname, makeplural(body_part(HAND))); ! Sprintf(kbuf, "%s corpse", an(mons[uwep->corpsenm].mname)); instapetrify(kbuf); uwepgone(); /* life-saved still doesn't allow touching cockatrice */ } ! /* KMH -- ...or your secondary weapon when you're wielding it */ ! if (u.twoweap && uswapwep && uswapwep->otyp == CORPSE && ! touch_petrifies(&mons[uswapwep->corpsenm])) { char kbuf[BUFSZ]; ! You("wield the %s corpse in your bare %s.", ! mons[uswapwep->corpsenm].mname, body_part(HAND)); ! Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); ! uswapwepgone(); /* life-saved still doesn't allow touching cockatrice */ ! } return 0; } --- 411,461 ---- Gloves_off() { long oldprop = ! u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES; switch(uarmg->otyp) { case LEATHER_GLOVES: ! break; case GAUNTLETS_OF_FUMBLING: ! if (!oldprop && !(HFumbling & ~TIMEOUT)) ! HFumbling = EFumbling = 0; ! break; case GAUNTLETS_OF_POWER: ! makeknown(uarmg->otyp); ! flags.botl = 1; /* taken care of in attrib.c */ ! break; case GAUNTLETS_OF_DEXTERITY: ! if (!cancelled_don) adj_abon(uarmg, -uarmg->spe); ! break; default: impossible(unknown_type, c_gloves, uarmg->otyp); } setworn((struct obj *)0, W_ARMG); + cancelled_don = FALSE; /* Prevent wielding cockatrice when not wearing gloves */ if (uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm])) { char kbuf[BUFSZ]; ! You("wield the %s in your bare %s.", ! corpse_xname(uwep, TRUE), makeplural(body_part(HAND))); ! Strcpy(kbuf, an(corpse_xname(uwep, TRUE))); instapetrify(kbuf); uwepgone(); /* life-saved still doesn't allow touching cockatrice */ } ! ! /* KMH -- ...or your secondary weapon when you're wielding it */ ! if (u.twoweap && uswapwep && uswapwep->otyp == CORPSE && ! touch_petrifies(&mons[uswapwep->corpsenm])) { char kbuf[BUFSZ]; ! You("wield the %s in your bare %s.", ! corpse_xname(uswapwep, TRUE), body_part(HAND)); ! Strcpy(kbuf, an(corpse_xname(uswapwep, TRUE))); instapetrify(kbuf); ! uswapwepgone(); /* lifesaved still doesn't allow touching cockatrice */ ! } return 0; } *************** *** 497,502 **** --- 514,520 ---- Armor_off() { setworn((struct obj *)0, W_ARM); + cancelled_don = FALSE; return 0; } *************** *** 507,512 **** --- 525,531 ---- Armor_gone() { setnotworn(uarm); + cancelled_don = FALSE; return 0; } *************** *** 544,549 **** --- 563,572 ---- changed the character's base sex */ You("don't feel like yourself."); pline_The("amulet disintegrates!"); + if (orig_sex == poly_gender() && uamul->dknown && + !objects[AMULET_OF_CHANGE].oc_name_known && + !objects[AMULET_OF_CHANGE].oc_uname) + docall(uamul); useup(uamul); break; } *************** *** 578,590 **** break; case AMULET_OF_MAGICAL_BREATHING: if (Underwater) { - if (!breathless(youmonst.data) && !amphibious(youmonst.data) - && !Swimming) - You("suddenly inhale an unhealthy amount of water!"); /* HMagical_breathing must be set off ! before calling drown() */ setworn((struct obj *)0, W_AMUL); ! (void) drown(); return; } break; --- 601,614 ---- break; case AMULET_OF_MAGICAL_BREATHING: if (Underwater) { /* HMagical_breathing must be set off ! before calling drown() */ setworn((struct obj *)0, W_AMUL); ! if (!breathless(youmonst.data) && !amphibious(youmonst.data) ! && !Swimming) { ! You("suddenly inhale an unhealthy amount of water!"); ! (void) drown(); ! } return; } break; *************** *** 613,622 **** long oldprop = u.uprops[objects[obj->otyp].oc_oprop].extrinsic; int old_attrib; ! ! if (obj == uwep) setuwep((struct obj *) 0); ! if (obj == uswapwep) setuswapwep((struct obj *) 0); ! if (obj == uquiver) setuqwep((struct obj *) 0); /* only mask out W_RING when we don't have both left and right rings of the same type */ --- 637,645 ---- long oldprop = u.uprops[objects[obj->otyp].oc_oprop].extrinsic; int old_attrib; ! if (obj == uwep) setuwep((struct obj *) 0); ! if (obj == uswapwep) setuswapwep((struct obj *) 0); ! if (obj == uquiver) setuqwep((struct obj *) 0); /* only mask out W_RING when we don't have both left and right rings of the same type */ *************** *** 683,688 **** --- 706,712 ---- float_up(); makeknown(RIN_LEVITATION); obj->known = TRUE; + spoteffects(FALSE); /* for sinks */ } break; case RIN_GAIN_STRENGTH: *************** *** 720,725 **** --- 744,750 ---- if (obj->spe || objects[RIN_PROTECTION].oc_name_known) { makeknown(RIN_PROTECTION); obj->known = TRUE; + update_inventory(); } break; } *************** *** 839,860 **** Blindf_on(otmp) register struct obj *otmp; { ! long already_blinded = Blinded; if (otmp == uwep) setuwep((struct obj *) 0); if (otmp == uswapwep) ! setuswapwep((struct obj *) 0); if (otmp == uquiver) ! setuqwep((struct obj *) 0); setworn(otmp, W_TOOL); - if (otmp->otyp == TOWEL && flags.verbose) - You("wrap %s around your %s.", an(xname(otmp)), body_part(HEAD)); on_msg(otmp); ! if (!already_blinded) { ! if (Punished) set_bc(0); /* Set ball&chain variables before */ ! /* the hero goes blind. */ ! if (Blind_telepat || Infravision) see_monsters(); /* sense monsters */ vision_full_recalc = 1; /* recalc vision limits */ flags.botl = 1; } --- 864,893 ---- Blindf_on(otmp) register struct obj *otmp; { ! boolean already_blind = Blind, changed = FALSE; if (otmp == uwep) setuwep((struct obj *) 0); if (otmp == uswapwep) ! setuswapwep((struct obj *) 0); if (otmp == uquiver) ! setuqwep((struct obj *) 0); setworn(otmp, W_TOOL); on_msg(otmp); ! ! if (Blind && !already_blind) { ! changed = TRUE; ! if (flags.verbose) You_cant("see any more."); ! /* set ball&chain variables before the hero goes blind */ ! if (Punished) set_bc(0); ! } else if (already_blind && !Blind) { ! changed = TRUE; ! /* "You are now wearing the Eyes of the Overworld." */ ! You("can see!"); ! } ! if (changed) { ! /* blindness has just been toggled */ ! if (Blind_telepat || Infravision) see_monsters(); vision_full_recalc = 1; /* recalc vision limits */ flags.botl = 1; } *************** *** 864,886 **** Blindf_off(otmp) register struct obj *otmp; { ! long was_blind = Blind; /* may still be able to see */ setworn((struct obj *)0, otmp->owornmask); off_msg(otmp); if (Blind) { ! if (otmp->otyp == LENSES) ! ; /* "still cannot see" makes no sense for lenses; do nothing */ ! else if (was_blind) ! You("still cannot see."); ! else ! You("cannot see anything now!"); ! } else if (!Blinded) { if (Blind_telepat || Infravision) see_monsters(); } - vision_full_recalc = 1; /* recalc vision limits */ - flags.botl = 1; } /* called in main to set intrinsics of worn start-up items */ --- 897,930 ---- Blindf_off(otmp) register struct obj *otmp; { ! boolean was_blind = Blind, changed = FALSE; setworn((struct obj *)0, otmp->owornmask); off_msg(otmp); if (Blind) { ! if (was_blind) { ! /* "still cannot see" makes no sense when removing lenses ! since they can't have been the cause of your blindness */ ! if (otmp->otyp != LENSES) ! You("still cannot see."); ! } else { ! changed = TRUE; /* !was_blind */ ! /* "You were wearing the Eyes of the Overworld." */ ! You_cant("see anything now!"); ! /* set ball&chain variables before the hero goes blind */ ! if (Punished) set_bc(0); ! } ! } else if (was_blind) { ! changed = TRUE; /* !Blind */ ! You("can see again."); ! } ! if (changed) { ! /* blindness has just been toggled */ if (Blind_telepat || Infravision) see_monsters(); + vision_full_recalc = 1; /* recalc vision limits */ + flags.botl = 1; } } /* called in main to set intrinsics of worn start-up items */ *************** *** 912,917 **** --- 956,963 ---- * wasting time on it (and don't dereference it when donning would * otherwise finish) */ + cancelled_don = (afternmv == Boots_on || afternmv == Helmet_on || + afternmv == Gloves_on || afternmv == Armor_on); afternmv = 0; nomovemsg = (char *)0; multi = 0; *************** *** 975,980 **** --- 1021,1036 ---- is_sword(uwep) ? c_sword : c_weapon); uwep->bknown = TRUE; return 0; + } else if (welded(uwep) && bimanual(uwep) && + (otmp == uarm + #ifdef TOURIST + || otmp == uarmu + #endif + )) { + You("seem unable to take off %s while holding your %s.", + the(xname(otmp)), is_sword(uwep) ? c_sword : c_weapon); + uwep->bknown = TRUE; + return 0; } if (otmp == uarmg && Glib) { You_cant("remove the slippery gloves with your slippery fingers."); *************** *** 1011,1017 **** pline("Not wearing any accessories."); return(0); } ! if (Accessories != 1) otmp = getobj(accessories, "take off"); if(!otmp) return(0); if(!(otmp->owornmask & (W_RING | W_AMUL | W_TOOL))) { You("are not wearing that."); --- 1067,1073 ---- pline("Not wearing any accessories."); return(0); } ! if (Accessories != 1) otmp = getobj(accessories, "remove"); if(!otmp) return(0); if(!(otmp->owornmask & (W_RING | W_AMUL | W_TOOL))) { You("are not wearing that."); *************** *** 1171,1176 **** --- 1227,1244 ---- return 0; } + if (welded(uwep) && bimanual(uwep) && + (otmp == uarm + #ifdef TOURIST + || otmp == uarmu + #endif + )) { + if (noisy) + You("cannot do that while holding your %s.", + is_sword(uwep) ? c_sword : c_weapon); + return 0; + } + if (is_helmet(otmp)) { if (uarmh) { if (noisy) already_wearing(an(c_helmet)); *************** *** 1229,1235 **** if (noisy) already_wearing(an(c_shirt)); } else { if (noisy) You_cant("wear that over your %s.", ! (uarm && !uarmc) ? c_armor : c_cloak); } err++; } else --- 1297,1303 ---- if (noisy) already_wearing(an(c_shirt)); } else { if (noisy) You_cant("wear that over your %s.", ! (uarm && !uarmc) ? c_armor : cloak_simple_name(uarmc)); } err++; } else *************** *** 1237,1249 **** #endif } else if (is_cloak(otmp)) { if (uarmc) { ! if (noisy) already_wearing(an(c_cloak)); err++; } else *mask = W_ARMC; } else if (is_suit(otmp)) { if (uarmc) { ! if (noisy) You("cannot wear armor over a cloak."); err++; } else if (uarm) { if (noisy) already_wearing("some armor"); --- 1305,1317 ---- #endif } else if (is_cloak(otmp)) { if (uarmc) { ! if (noisy) already_wearing(an(cloak_simple_name(uarmc))); err++; } else *mask = W_ARMC; } else if (is_suit(otmp)) { if (uarmc) { ! if (noisy) You("cannot wear armor over a %s.", cloak_simple_name(uarmc)); err++; } else if (uarm) { if (noisy) already_wearing("some armor"); *************** *** 1338,1344 **** ublindf->otyp==LENSES ? "some lenses" : "a blindfold"); return(0); } ! otmp = getobj(accessories, "wear"); if(!otmp) return(0); if(otmp->owornmask & (W_RING | W_AMUL | W_TOOL)) { already_wearing(c_that_); --- 1406,1412 ---- ublindf->otyp==LENSES ? "some lenses" : "a blindfold"); return(0); } ! otmp = getobj(accessories, "put on"); if(!otmp) return(0); if(otmp->owornmask & (W_RING | W_AMUL | W_TOOL)) { already_wearing(c_that_); *************** *** 1350,1355 **** --- 1418,1427 ---- } if(otmp == uwep) setuwep((struct obj *)0); + if(otmp == uswapwep) + setuswapwep((struct obj *) 0); + if(otmp == uquiver) + setuqwep((struct obj *) 0); if(otmp->oclass == RING_CLASS || otmp->otyp == MEAT_RING) { if(nolimbs(youmonst.data)) { You("cannot make the ring stick to your body."); *************** *** 1438,1444 **** Blindf_on(otmp); return(1); } ! prinv((char *)0, otmp, 0L); return(1); } --- 1510,1517 ---- Blindf_on(otmp); return(1); } ! if (is_worn(otmp)) ! prinv((char *)0, otmp, 0L); return(1); } *************** *** 1464,1469 **** --- 1537,1543 ---- if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe; if (HProtection & INTRINSIC) uac -= u.ublessed; uac -= u.uspellprot; + if (uac < -128) uac = -128; /* u.uac is an schar */ if(uac != u.uac){ u.uac = uac; flags.botl = 1; *************** *** 1552,1611 **** return(otmph); } void ! erode_armor(victim,acid_dmg) struct monst *victim; boolean acid_dmg; { ! register struct obj *otmph = some_armor(victim); ! int erosion; ! boolean vismon = (victim != &youmonst) && canseemon(victim); ! ! if (!otmph) return; ! erosion = acid_dmg ? otmph->oeroded2 : otmph->oeroded; ! if (otmph != uarmf) { ! if (otmph->greased) { ! grease_protect(otmph,(char *)0,FALSE,victim); ! return; ! } ! if (otmph->oerodeproof || ! (acid_dmg ? !is_corrodeable(otmph) : !is_rustprone(otmph))) { ! if (flags.verbose || !(otmph->oerodeproof && otmph->rknown)) { ! if (victim == &youmonst) ! Your("%s not affected.", aobjnam(otmph, "are")); ! else if (vismon) ! pline("%s's %s not affected.", Monnam(victim), ! aobjnam(otmph, "are")); ! } ! if (otmph->oerodeproof) otmph->rknown = TRUE; ! return; ! } ! if (erosion < MAX_ERODE) { ! if (victim == &youmonst) ! Your("%s%s!", aobjnam(otmph, acid_dmg ? "corrode" : "rust"), ! erosion+1 == MAX_ERODE ? " completely" : ! erosion ? " further" : ""); ! else if (vismon) ! pline("%s's %s%s!", Monnam(victim), ! aobjnam(otmph, acid_dmg ? "corrode" : "rust"), ! erosion+1 == MAX_ERODE ? " completely" : ! erosion ? " further" : ""); ! if (acid_dmg) ! otmph->oeroded2++; ! else ! otmph->oeroded++; ! return; ! } ! if (flags.verbose) { ! if (victim == &youmonst) ! Your("%s completely %s.", ! aobjnam(otmph, Blind ? "feel" : "look"), ! acid_dmg ? "corroded" : "rusty"); ! else if (vismon) ! pline("%s's %s completely %s.", Monnam(victim), ! aobjnam(otmph, "look"), ! acid_dmg ? "corroded" : "rusty"); ! } } } --- 1626,1642 ---- return(otmph); } + /* erode some arbitrary armor worn by the victim */ void ! erode_armor(victim, acid_dmg) struct monst *victim; boolean acid_dmg; { ! struct obj *otmph = some_armor(victim); ! ! if (otmph && (otmph != uarmf)) { ! erode_obj(otmph, acid_dmg, FALSE); ! if (carried(otmph)) update_inventory(); } } *************** *** 1614,1629 **** select_off(otmp) register struct obj *otmp; { if(!otmp) return(0); if(cursed(otmp)) return(0); if((otmp->oclass==RING_CLASS || otmp->otyp == MEAT_RING) && nolimbs(youmonst.data)) return(0); if(welded(uwep) && (otmp==uarmg || otmp==uright || (otmp==uleft ! && bimanual(uwep)))) return(0); if(uarmg && uarmg->cursed && (otmp==uright || otmp==uleft)) { uarmg->bknown = TRUE; return(0); } if(otmp == uarmf && u.utrap && (u.utraptype == TT_BEARTRAP || --- 1645,1665 ---- select_off(otmp) register struct obj *otmp; { + char buf[BUFSZ]; + if(!otmp) return(0); if(cursed(otmp)) return(0); if((otmp->oclass==RING_CLASS || otmp->otyp == MEAT_RING) && nolimbs(youmonst.data)) return(0); if(welded(uwep) && (otmp==uarmg || otmp==uright || (otmp==uleft ! && bimanual(uwep)))) { ! You("cannot free a weapon hand to take off the ring."); return(0); + } if(uarmg && uarmg->cursed && (otmp==uright || otmp==uleft)) { uarmg->bknown = TRUE; + You("cannot remove your gloves to take off the ring."); return(0); } if(otmp == uarmf && u.utrap && (u.utraptype == TT_BEARTRAP || *************** *** 1635,1645 **** --- 1671,1685 ---- || otmp==uarmu #endif ) && uarmc && uarmc->cursed) { + Strcpy(buf, the(xname(uarmc))); + You("cannot remove %s to take off %s.", buf, the(xname(otmp))); uarmc->bknown = TRUE; return(0); } #ifdef TOURIST if(otmp==uarmu && uarm && uarm->cursed) { + Strcpy(buf, the(xname(uarm))); + You("cannot remove %s to take off %s.", buf, the(xname(otmp))); uarm->bknown = TRUE; return(0); } *************** *** 1719,1729 **** otmp = uright; if(!cursed(otmp)) Ring_off(uright); } else if (taking_off == WORN_BLINDF) { ! if(!cursed(ublindf)) { ! setworn((struct obj *)0, ublindf->owornmask); ! if(!Blinded) make_blinded(1L,FALSE); /* See on next move */ ! else You("still cannot see."); ! } } else impossible("do_takeoff: taking off %lx", taking_off); return(otmp); --- 1759,1765 ---- otmp = uright; if(!cursed(otmp)) Ring_off(uright); } else if (taking_off == WORN_BLINDF) { ! if (!cursed(ublindf)) Blindf_off(ublindf); } else impossible("do_takeoff: taking off %lx", taking_off); return(otmp); *************** *** 1844,1850 **** add_valid_menu_class(0); /* reset */ if (flags.menu_style != MENU_TRADITIONAL || ! (result = ggetobj("take off", select_off, 0, FALSE)) < -1) result = menu_remarm(result); if (takeoff_mask) --- 1880,1886 ---- add_valid_menu_class(0); /* reset */ if (flags.menu_style != MENU_TRADITIONAL || ! (result = ggetobj("take off", select_off, 0, FALSE, (unsigned *)0)) < -1) result = menu_remarm(result); if (takeoff_mask) *************** *** 1880,1886 **** free((genericptr_t) pick_list); } else if (flags.menu_style == MENU_COMBINATION) { all_worn_categories = FALSE; ! if (ggetobj("take off", select_off, 0, TRUE) == -2) all_worn_categories = TRUE; } --- 1916,1922 ---- free((genericptr_t) pick_list); } else if (flags.menu_style == MENU_COMBINATION) { all_worn_categories = FALSE; ! if (ggetobj("take off", select_off, 0, TRUE, (unsigned *)0) == -2) all_worn_categories = TRUE; } *************** *** 1892,1898 **** for (i = 0; i < n; i++) (void) select_off(pick_list[i].item.a_obj); free((genericptr_t) pick_list); ! } else if (n < 0) { There("is nothing else you can remove or unwield."); } return 0; --- 1928,1934 ---- for (i = 0; i < n; i++) (void) select_off(pick_list[i].item.a_obj); free((genericptr_t) pick_list); ! } else if (n < 0 && flags.menu_style != MENU_COMBINATION) { There("is nothing else you can remove or unwield."); } return 0; *************** *** 1908,1914 **** (!obj_resists(otmp, 0, 90))) if (DESTROY_ARM(uarmc)) { ! Your("cloak crumbles and turns to dust!"); (void) Cloak_off(); useup(otmp); } else if (DESTROY_ARM(uarm)) { --- 1944,1950 ---- (!obj_resists(otmp, 0, 90))) if (DESTROY_ARM(uarmc)) { ! Your("%s crumbles and turns to dust!", cloak_simple_name(uarmc)); (void) Cloak_off(); useup(otmp); } else if (DESTROY_ARM(uarm)) { *** nethack-3.3.1/src/drawing.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/drawing.c Thu Mar 21 07:37:36 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)drawing.c 3.3 1999/12/02 */ /* Copyright (c) NetHack Development Team 1992. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)drawing.c 3.4 1999/12/02 */ /* Copyright (c) NetHack Development Team 1992. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 269,275 **** {'"', "web", C(CLR_GRAY)}, /* web */ {'^', "statue trap", C(CLR_GRAY)}, /* trap */ /*60*/ {'^', "magic trap", C(HI_ZAP)}, /* trap */ ! {'^', "anti-magic trap field", C(HI_ZAP)}, /* trap */ {'^', "polymorph trap", C(CLR_BRIGHT_GREEN)}, /* trap */ {'|', "wall", C(CLR_GRAY)}, /* vbeam */ {'-', "wall", C(CLR_GRAY)}, /* hbeam */ --- 269,275 ---- {'"', "web", C(CLR_GRAY)}, /* web */ {'^', "statue trap", C(CLR_GRAY)}, /* trap */ /*60*/ {'^', "magic trap", C(HI_ZAP)}, /* trap */ ! {'^', "anti-magic field", C(HI_ZAP)}, /* trap */ {'^', "polymorph trap", C(CLR_BRIGHT_GREEN)}, /* trap */ {'|', "wall", C(CLR_GRAY)}, /* vbeam */ {'-', "wall", C(CLR_GRAY)}, /* hbeam */ *************** *** 741,747 **** static const uchar IBM_r_oc_syms[MAXOCLASSES] = { /* a la EPYX Rogue */ /* 0*/ '\0', ILLOBJ_SYM, ! # if defined(MSDOS) || defined(WIN32) || defined(OS2) 0x18, /* weapon: up arrow */ /* 0x0a, */ ARMOR_SYM, /* armor: Vert rect with o */ /* 0x09, */ RING_SYM, /* ring: circle with arrow */ --- 741,747 ---- static const uchar IBM_r_oc_syms[MAXOCLASSES] = { /* a la EPYX Rogue */ /* 0*/ '\0', ILLOBJ_SYM, ! # if defined(MSDOS) || defined(OS2) || ( defined(WIN32) && !defined(MSWIN_GRAPHICS) ) 0x18, /* weapon: up arrow */ /* 0x0a, */ ARMOR_SYM, /* armor: Vert rect with o */ /* 0x09, */ RING_SYM, /* ring: circle with arrow */ *************** *** 794,805 **** /* Use a loop: char != uchar on some machines. */ for (i = 0; i < MAXMCLASSES; i++) monsyms[i] = def_monsyms[i]; ! # ifdef ASCIIGRAPH if (iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) && !iflags.grmode # endif ! ) monsyms[S_HUMAN] = 0x01; /* smiley face */ # endif for (i = 0; i < MAXPCHARS; i++) --- 794,805 ---- /* Use a loop: char != uchar on some machines. */ for (i = 0; i < MAXMCLASSES; i++) monsyms[i] = def_monsyms[i]; ! # if defined(ASCIIGRAPH) && !defined(MSWIN_GRAPHICS) if (iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) && !iflags.grmode # endif ! ) monsyms[S_HUMAN] = 0x01; /* smiley face */ # endif for (i = 0; i < MAXPCHARS; i++) *************** *** 842,847 **** --- 842,848 ---- showsyms[S_litcorr] = 0xb2; showsyms[S_upstair] = 0xf0; /* Greek Xi */ showsyms[S_dnstair] = 0xf0; + #ifndef MSWIN_GRAPHICS showsyms[S_arrow_trap] = 0x04; /* diamond (cards) */ showsyms[S_dart_trap] = 0x04; showsyms[S_falling_rock_trap] = 0x04; *************** *** 864,869 **** --- 865,871 ---- showsyms[S_magic_trap] = 0x04; showsyms[S_anti_magic_trap] = 0x04; showsyms[S_polymorph_trap] = 0x04; + #endif } #endif /* ASCIIGRAPH */ *** nethack-3.3.1/src/dungeon.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/dungeon.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dungeon.c 3.3 1999/10/30 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dungeon.c 3.4 1999/10/30 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 380,386 **** new_branch->next = (branch *) 0; /* Convert the branch into a unique number so we can sort them. */ ! #define branch_val(bp) ((((long)(bp)->end1.dnum * (MAXLEVEL+1) + (long)(bp)->end1.dlevel) * (MAXDUNGEON+1) * (MAXLEVEL+1)) + ((long)(bp)->end2.dnum * (MAXLEVEL+1) + (long)(bp)->end2.dlevel)) /* * Insert the new branch into the correct place in the branch list. --- 380,389 ---- new_branch->next = (branch *) 0; /* Convert the branch into a unique number so we can sort them. */ ! #define branch_val(bp) \ ! ((((long)(bp)->end1.dnum * (MAXLEVEL+1) + \ ! (long)(bp)->end1.dlevel) * (MAXDUNGEON+1) * (MAXLEVEL+1)) + \ ! ((long)(bp)->end2.dnum * (MAXLEVEL+1) + (long)(bp)->end2.dlevel)) /* * Insert the new branch into the correct place in the branch list. *************** *** 661,666 **** --- 664,674 ---- /* validate the data's version against the program's version */ Fread((genericptr_t) &vers_info, sizeof vers_info, 1, dgn_file); + /* we'd better clear the screen now, since when error messages come from + * check_version() they will be printed using pline(), which doesn't + * mix with the raw messages that might be already on the screen + */ + if (iflags.window_inited) clear_nhwindow(WIN_MAP); if (!check_version(&vers_info, DUNGEON_FILE, TRUE)) panic("Dungeon description not valid."); *************** *** 734,740 **** } else if (pd.tmpdungeon[i].entry_lev > 0) { dungeons[i].entry_lev = pd.tmpdungeon[i].entry_lev; if (dungeons[i].entry_lev > dungeons[i].num_dunlevs) ! dungeons[i].entry_lev = pd.tmpdungeon[i].entry_lev; } else { /* default */ dungeons[i].entry_lev = 1; /* defaults to top level */ } --- 742,748 ---- } else if (pd.tmpdungeon[i].entry_lev > 0) { dungeons[i].entry_lev = pd.tmpdungeon[i].entry_lev; if (dungeons[i].entry_lev > dungeons[i].num_dunlevs) ! dungeons[i].entry_lev = dungeons[i].num_dunlevs; } else { /* default */ dungeons[i].entry_lev = 1; /* defaults to top level */ } *** nethack-3.3.1/src/eat.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/eat.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)eat.c 3.3 1999/12/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)eat.c 3.4 2002/01/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 35,45 **** STATIC_DCL void FDECL(fprefx, (struct obj *)); STATIC_DCL void FDECL(fpostfx, (struct obj *)); STATIC_DCL int NDECL(bite); STATIC_DCL int FDECL(rottenfood, (struct obj *)); STATIC_DCL void NDECL(eatspecial); STATIC_DCL void FDECL(eataccessory, (struct obj *)); ! STATIC_DCL const char * FDECL(foodword, (struct obj *)); char msgbuf[BUFSZ]; --- 35,46 ---- STATIC_DCL void FDECL(fprefx, (struct obj *)); STATIC_DCL void FDECL(fpostfx, (struct obj *)); STATIC_DCL int NDECL(bite); + STATIC_DCL int FDECL(edibility_prompts, (struct obj *)); STATIC_DCL int FDECL(rottenfood, (struct obj *)); STATIC_DCL void NDECL(eatspecial); STATIC_DCL void FDECL(eataccessory, (struct obj *)); ! STATIC_DCL const char *FDECL(foodword, (struct obj *)); char msgbuf[BUFSZ]; *************** *** 103,109 **** /* above also prevents the Amulet from being eaten, so we must never allow fake amulets to be eaten either [which is already the case] */ ! if (metallivorous(youmonst.data) && is_metallic(obj)) return TRUE; if (u.umonnum == PM_GELATINOUS_CUBE && is_organic(obj) && /* [g.cubes can eat containers and retain all contents --- 104,111 ---- /* above also prevents the Amulet from being eaten, so we must never allow fake amulets to be eaten either [which is already the case] */ ! if (metallivorous(youmonst.data) && is_metallic(obj) && ! (youmonst.data != &mons[PM_RUST_MONSTER] || is_rustprone(obj))) return TRUE; if (u.umonnum == PM_GELATINOUS_CUBE && is_organic(obj) && /* [g.cubes can eat containers and retain all contents *************** *** 139,144 **** --- 141,147 ---- {"boiled", 50}, {"dried", 55}, {"szechuan", 70}, + #define FRENCH_FRIED_TIN 11 {"french fried", 40}, {"sauteed", 95}, {"broiled", 80}, *************** *** 223,229 **** { /* only happens if you were satiated */ if (u.uhs != SATIATED) { ! if (food->otyp != AMULET_OF_STRANGULATION) return; } else if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL) { adjalign(-1); /* gluttony is unchivalrous */ --- 226,232 ---- { /* only happens if you were satiated */ if (u.uhs != SATIATED) { ! if (!food || food->otyp != AMULET_OF_STRANGULATION) return; } else if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL) { adjalign(-1); /* gluttony is unchivalrous */ *************** *** 234,245 **** if (Breathless || (!Strangled && !rn2(20))) { /* choking by eating AoS doesn't involve stuffing yourself */ ! if (food->otyp == AMULET_OF_STRANGULATION) { You("choke, but recover your composure."); return; } You("stuff yourself and then vomit voluminously."); morehungry(1000); /* you just got *very* sick! */ vomit(); } else { killer_format = KILLED_BY_AN; --- 237,249 ---- if (Breathless || (!Strangled && !rn2(20))) { /* choking by eating AoS doesn't involve stuffing yourself */ ! if (food && food->otyp == AMULET_OF_STRANGULATION) { You("choke, but recover your composure."); return; } You("stuff yourself and then vomit voluminously."); morehungry(1000); /* you just got *very* sick! */ + nomovemsg = 0; vomit(); } else { killer_format = KILLED_BY_AN; *************** *** 263,281 **** } } STATIC_OVL void ! recalc_wt() /* modify object wt. depending on time spent consuming it */ { ! register struct obj *piece = victual.piece; #ifdef DEBUG debugpline("Old weight = %d", piece->owt); debugpline("Used time = %d, Req'd time = %d", victual.usedtime, victual.reqtime); #endif ! /* weight(piece) = weight of full item */ ! if(victual.usedtime) ! piece->owt = eaten_stat(weight(piece), piece); #ifdef DEBUG debugpline("New weight = %d", piece->owt); #endif --- 267,284 ---- } } + /* modify object wt. depending on time spent consuming it */ STATIC_OVL void ! recalc_wt() { ! struct obj *piece = victual.piece; #ifdef DEBUG debugpline("Old weight = %d", piece->owt); debugpline("Used time = %d, Req'd time = %d", victual.usedtime, victual.reqtime); #endif ! piece->owt = weight(piece); #ifdef DEBUG debugpline("New weight = %d", piece->owt); #endif *************** *** 302,310 **** { if (otmp->quan > 1L) { if(!carried(otmp)) ! (void) splitobj(otmp, 1L); else ! otmp = splitobj(otmp, otmp->quan - 1L); #ifdef DEBUG debugpline("split object,"); #endif --- 305,313 ---- { if (otmp->quan > 1L) { if(!carried(otmp)) ! (void) splitobj(otmp, otmp->quan - 1L); else ! otmp = splitobj(otmp, 1L); #ifdef DEBUG debugpline("split object,"); #endif *************** *** 326,335 **** if (carried(otmp)) { freeinv(otmp); ! if (inv_cnt() >= 52 && !merge_choice(invent, otmp)) dropy(otmp); ! else ! otmp = addinv(otmp); /* unlikely but a merge is possible */ } return(otmp); } --- 329,343 ---- if (carried(otmp)) { freeinv(otmp); ! if (inv_cnt() >= 52) { ! sellobj_state(SELL_DONTSELL); dropy(otmp); ! sellobj_state(SELL_NORMAL); ! } else { ! otmp->oxlth++; /* hack to prevent merge */ ! otmp = addinv(otmp); ! otmp->oxlth--; ! } } return(otmp); } *************** *** 482,494 **** return; } case PM_GREEN_SLIME: ! if (!Unchanging && youmonst.data != &mons[PM_FIRE_VORTEX] && ! youmonst.data != &mons[PM_FIRE_ELEMENTAL] && ! youmonst.data != &mons[PM_GREEN_SLIME]) { ! You("don't feel very well."); ! Slimed = 10L; ! } ! /* Fall through */ default: if (acidic(&mons[pm]) && Stoned) fix_petrification(); --- 490,505 ---- return; } case PM_GREEN_SLIME: ! if (!Slimed && !Unchanging && ! youmonst.data != &mons[PM_FIRE_VORTEX] && ! youmonst.data != &mons[PM_FIRE_ELEMENTAL] && ! youmonst.data != &mons[PM_SALAMANDER] && ! youmonst.data != &mons[PM_GREEN_SLIME]) { ! You("don't feel very well."); ! Slimed = 10L; ! flags.botl = 1; ! } ! /* Fall through */ default: if (acidic(&mons[pm]) && Stoned) fix_petrification(); *************** *** 810,817 **** tmp += 20; if (youmonst.data->mlet != S_MIMIC) { char buf[BUFSZ]; - You_cant("resist the temptation to mimic a pile of gold."); nomul(-tmp); Sprintf(buf, "You now prefer mimicking %s again.", an(Upolyd ? youmonst.data->mname : urace.noun)); --- 821,831 ---- tmp += 20; if (youmonst.data->mlet != S_MIMIC) { char buf[BUFSZ]; You_cant("resist the temptation to mimic a pile of gold."); + #ifdef STEED + /* A pile of gold can't ride. */ + if (u.usteed) dismount_steed(DISMOUNT_FELL); + #endif nomul(-tmp); Sprintf(buf, "You now prefer mimicking %s again.", an(Upolyd ? youmonst.data->mname : urace.noun)); *************** *** 846,852 **** /* case PM_SANDESTIN: */ if (!Unchanging) { You_feel("a change coming over you."); ! polyself(); } break; case PM_MIND_FLAYER: --- 860,866 ---- /* case PM_SANDESTIN: */ if (!Unchanging) { You_feel("a change coming over you."); ! polyself(FALSE); } break; case PM_MIND_FLAYER: *************** *** 1003,1013 **** tin.tin->dknown = tin.tin->known = TRUE; cprefx(tin.tin->corpsenm); cpostfx(tin.tin->corpsenm); /* check for vomiting added by GAN 01/16/87 */ if(tintxts[r].nut < 0) make_vomiting((long)rn1(15,10), FALSE); else lesshungry(tintxts[r].nut); ! if(r == 0) { /* Deep Fried */ /* Assume !Glib, because you can't open tins when Glib. */ incr_itimeout(&Glib, rnd(15)); pline("Eating deep fried food made your %s very slippery.", --- 1017,1034 ---- tin.tin->dknown = tin.tin->known = TRUE; cprefx(tin.tin->corpsenm); cpostfx(tin.tin->corpsenm); + if(((!carried(tin.tin) && costly_spot(tin.tin->ox, tin.tin->oy) && + !tin.tin->no_charge) + || tin.tin->unpaid)) { + verbalize("You open it, you bought it!"); + bill_dummy_object(tin.tin); + } + /* check for vomiting added by GAN 01/16/87 */ if(tintxts[r].nut < 0) make_vomiting((long)rn1(15,10), FALSE); else lesshungry(tintxts[r].nut); ! if(r == 0 || r == FRENCH_FRIED_TIN) { /* Assume !Glib, because you can't open tins when Glib. */ incr_itimeout(&Glib, rnd(15)); pline("Eating deep fried food made your %s very slippery.", *************** *** 1015,1022 **** } } else { if (tin.tin->cursed) ! pline("It contains some decaying %s substance.", ! hcolor(green)); else pline("It contains spinach."); --- 1036,1043 ---- } } else { if (tin.tin->cursed) ! pline("It contains some decaying%s%s substance.", ! Blind ? "" : " ", Blind ? "" : hcolor(green)); else pline("It contains spinach."); *************** *** 1027,1032 **** --- 1048,1062 ---- You("discard the open tin."); goto use_me; } + + tin.tin->dknown = tin.tin->known = TRUE; + if(((!carried(tin.tin) && costly_spot(tin.tin->ox, tin.tin->oy) && + !tin.tin->no_charge) + || tin.tin->unpaid)) { + verbalize("You open it, you bought it!"); + bill_dummy_object(tin.tin); + } + if (!tin.tin->cursed) pline("This makes you feel like %s!", Hallucination ? "Swee'pea" : "Popeye"); *************** *** 1034,1040 **** gainstr(tin.tin, 0); u.uconduct.food++; } - tin.tin->dknown = tin.tin->known = TRUE; use_me: if (carried(tin.tin)) useup(tin.tin); else useupf(tin.tin, 1L); --- 1064,1069 ---- *************** *** 1086,1096 **** pline_The("tin slips from your %s.", makeplural(body_part(FINGER))); if(otmp->quan > 1L) { ! register struct obj *obj; ! obj = splitobj(otmp, 1L); ! if (otmp == uwep) setuwep(obj); ! if (otmp == uswapwep) setuswapwep(obj); ! if (otmp == uquiver) setuqwep(obj); } if (carried(otmp)) dropx(otmp); else stackobj(otmp); --- 1115,1121 ---- pline_The("tin slips from your %s.", makeplural(body_part(FINGER))); if(otmp->quan > 1L) { ! otmp = splitobj(otmp, 1L); } if (carried(otmp)) dropx(otmp); else stackobj(otmp); *************** *** 1125,1130 **** --- 1150,1156 ---- } else if(!rn2(4) && !Blind) { pline("Everything suddenly goes dark."); make_blinded((long)d(2,10),FALSE); + if (!Blind) Your(vision_clears); } else if(!rn2(3)) { const char *what, *where; if (!Blind) *************** *** 1133,1139 **** Is_waterlevel(&u.uz)) what = "you lose control of", where = "yourself"; else ! what = "you slap against the", where = surface(u.ux,u.uy); pline_The("world spins and %s %s.", what, where); flags.soundok = 0; nomul(-rnd(10)); --- 1159,1169 ---- Is_waterlevel(&u.uz)) what = "you lose control of", where = "yourself"; else ! what = "you slap against the", where = ! #ifdef STEED ! (u.usteed) ? "saddle" : ! #endif ! surface(u.ux,u.uy); pline_The("world spins and %s %s.", what, where); flags.soundok = 0; nomul(-rnd(10)); *************** *** 1155,1160 **** --- 1185,1194 ---- boolean stoneable = (touch_petrifies(&mons[mnum]) && !Stone_resistance && !poly_when_stoned(youmonst.data)); + /* KMH, conduct */ + if (!vegan(&mons[mnum])) u.uconduct.unvegan++; + if (!vegetarian(&mons[mnum])) violated_vegetarian(); + if (mnum != PM_LIZARD && mnum != PM_LICHEN) { long age = peek_at_iced_corpse_age(otmp); *************** *** 1185,1203 **** s_suffix(mons[mnum].mname)); make_sick(sick_time, buf, TRUE, SICK_VOMITABLE); } - - /* KMH, conduct */ - if (!vegan(&mons[mnum])) - u.uconduct.unvegan++; - if (!vegetarian(&mons[mnum])) - violated_vegetarian(); - if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return(2); } else if (acidic(&mons[mnum]) && !Acid_resistance) { tp++; ! You("have a very bad case of stomach acid."); losehp(rnd(15), "acidic corpse", KILLED_BY_AN); } else if (poisonous(&mons[mnum]) && rn2(5)) { tp++; --- 1219,1230 ---- s_suffix(mons[mnum].mname)); make_sick(sick_time, buf, TRUE, SICK_VOMITABLE); } if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return(2); } else if (acidic(&mons[mnum]) && !Acid_resistance) { tp++; ! You("have a very bad case of stomach acid."); /* not body_part() */ losehp(rnd(15), "acidic corpse", KILLED_BY_AN); } else if (poisonous(&mons[mnum]) && rn2(5)) { tp++; *************** *** 1223,1244 **** otmp->orotten = TRUE; (void)touchfood(otmp); retcode = 1; ! } else ! otmp->oeaten >>= 2; } else { pline("%s%s %s!", !uniq ? "This " : !type_is_pname(&mons[mnum]) ? "The " : "", food_xname(otmp, FALSE), ! (carnivorous(youmonst.data) && !herbivorous(youmonst.data)) ? ! "is delicious" : "tastes terrible"); } - /* KMH, conduct */ - if (!vegan(&mons[mnum])) - u.uconduct.unvegan++; - if (!vegetarian(&mons[mnum])) - violated_vegetarian(); - return(retcode); } --- 1250,1276 ---- otmp->orotten = TRUE; (void)touchfood(otmp); retcode = 1; ! } ! ! if (!mons[otmp->corpsenm].cnutrit) { ! /* no nutrution: rots away, no message if you passed out */ ! if (!retcode) pline_The("corpse rots away completely."); ! if (carried(otmp)) useup(otmp); ! else useupf(otmp, 1L); ! retcode = 2; ! } ! ! if (!retcode) consume_oeaten(otmp, 2); /* oeaten >>= 2 */ } else { pline("%s%s %s!", !uniq ? "This " : !type_is_pname(&mons[mnum]) ? "The " : "", food_xname(otmp, FALSE), ! (vegan(&mons[mnum]) ? ! (!carnivorous(youmonst.data) && herbivorous(youmonst.data)) : ! (carnivorous(youmonst.data) && !herbivorous(youmonst.data))) ! ? "is delicious" : "tastes terrible"); } return(retcode); } *************** *** 1284,1306 **** switch(otmp->otyp) { case FOOD_RATION: if(u.uhunger <= 200) ! if (Hallucination) pline("Oh wow, like, superior, man!"); ! else pline("That food really hit the spot!"); ! else if(u.uhunger <= 700) pline("That satiated your stomach!"); break; case TRIPE_RATION: if (carnivorous(youmonst.data) && !humanoid(youmonst.data)) pline("That tripe ration was surprisingly good!"); else { pline("Yak - dog food!"); more_experienced(1,0); ! flags.botl = 1; ! } ! if (rn2(2) && ! (Upolyd ? (!carnivorous(youmonst.data) || ! (humanoid(youmonst.data) && ! !is_orc(youmonst.data))) ! : !CANNIBAL_ALLOWED())) { make_vomiting((long)rn1(victual.reqtime, 14), FALSE); } break; --- 1316,1339 ---- switch(otmp->otyp) { case FOOD_RATION: if(u.uhunger <= 200) ! pline(Hallucination ? "Oh wow, like, superior, man!" : ! "That food really hit the spot!"); ! else if(u.uhunger <= 700) pline("That satiated your %s!", ! body_part(STOMACH)); break; case TRIPE_RATION: if (carnivorous(youmonst.data) && !humanoid(youmonst.data)) pline("That tripe ration was surprisingly good!"); + else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC))) + pline(Hallucination ? "Tastes great! Less filling!" : + "Mmm, tripe... not bad!"); else { pline("Yak - dog food!"); more_experienced(1,0); ! newexplevel(); ! /* not cannibalism, but we use similar criteria ! for deciding whether to be sickened by this meal */ ! if (rn2(2) && !CANNIBAL_ALLOWED()) make_vomiting((long)rn1(victual.reqtime, 14), FALSE); } break; *************** *** 1390,1400 **** struct obj *otmp; { int typ = otmp->otyp; ! int oldprop; /* Note: rings are not so common that this is unbalancing. */ /* (How often do you even _find_ 3 rings of polymorph in a game?) */ ! oldprop = !!(u.uprops[objects[typ].oc_oprop].intrinsic); if (otmp == uleft || otmp == uright) { Ring_gone(otmp); if (u.uhp <= 0) return; /* died from sink fall */ --- 1423,1433 ---- struct obj *otmp; { int typ = otmp->otyp; ! long oldprop; /* Note: rings are not so common that this is unbalancing. */ /* (How often do you even _find_ 3 rings of polymorph in a game?) */ ! oldprop = u.uprops[objects[typ].oc_oprop].intrinsic; if (otmp == uleft || otmp == uright) { Ring_gone(otmp); if (u.uhp <= 0) return; /* died from sink fall */ *************** *** 1416,1429 **** set_mimic_blocking(); see_monsters(); if (Invis && !oldprop && !ESee_invisible && ! !perceives(youmonst.data) && !Blind) { newsym(u.ux,u.uy); pline("Suddenly you can see yourself."); makeknown(typ); } break; case RIN_INVISIBILITY: ! if (!oldprop && !EInvis && !BInvis && !See_invisible && !Blind) { newsym(u.ux,u.uy); Your("body takes on a %s transparency...", --- 1449,1462 ---- set_mimic_blocking(); see_monsters(); if (Invis && !oldprop && !ESee_invisible && ! !perceives(youmonst.data) && !Blind) { newsym(u.ux,u.uy); pline("Suddenly you can see yourself."); makeknown(typ); } break; case RIN_INVISIBILITY: ! if (!oldprop && !EInvis && !BInvis && !See_invisible && !Blind) { newsym(u.ux,u.uy); Your("body takes on a %s transparency...", *************** *** 1435,1440 **** --- 1468,1475 ---- rescham(); break; case RIN_LEVITATION: + /* undo the `.intrinsic |= FROMOUTSIDE' done above */ + u.uprops[LEVITATION].intrinsic = oldprop; if (!Levitation) { float_up(); incr_itimeout(&HLevitation, d(10,20)); *************** *** 1504,1509 **** --- 1539,1549 ---- victual.piece = (struct obj *)0; victual.eating = 0; if (otmp->oclass == GOLD_CLASS) { + #ifdef GOLDOBJ + if (carried(otmp)) + useupall(otmp); + else + #endif dealloc_obj(otmp); return; } *************** *** 1570,1576 **** you_unwere(TRUE); break; case CARROT: ! make_blinded(0L,TRUE); break; case FORTUNE_COOKIE: outrumor(bcsign(otmp), BY_COOKIE); --- 1610,1616 ---- you_unwere(TRUE); break; case CARROT: ! make_blinded((long)u.ucreamed,TRUE); break; case FORTUNE_COOKIE: outrumor(bcsign(otmp), BY_COOKIE); *************** *** 1621,1633 **** return; } int doeat() /* generic "eat" command funtion (see cmd.c) */ { register struct obj *otmp; int basenutrit; /* nutrition of full item */ boolean dont_start = FALSE; ! if (Strangled) { pline("If you can't breathe air, how can you consume solids?"); return 0; --- 1661,1807 ---- return; } + /* + * return 0 if the food was not dangerous. + * return 1 if the food was dangerous and you chose to stop. + * return 2 if the food was dangerous and you chose to eat it anyway. + */ + STATIC_OVL int + edibility_prompts(otmp) + struct obj *otmp; + { + /* blessed food detection granted you a one-use + ability to detect food that is unfit for consumption + or dangerous and avoid it. */ + + char buf[BUFSZ], foodsmell[BUFSZ]; + char *eat_it_anyway = "Eat it anyway?"; + boolean cadaver = (otmp->otyp == CORPSE); + boolean stoneorslime = FALSE; + int material = objects[otmp->otyp].oc_material; + long rotted = 0L; + int mnum; + + #ifdef GCC_WARN + mnum = 0; + #endif + + Strcpy(foodsmell, Tobjnam(otmp, "smell")); + if (cadaver || otmp->otyp == EGG || otmp->otyp == TIN) { + mnum = otmp->corpsenm; + /* These checks must match those in eatcorpse() */ + stoneorslime = (touch_petrifies(&mons[mnum]) && + !Stone_resistance && !poly_when_stoned(youmonst.data)); + + if (mnum == PM_GREEN_SLIME) + stoneorslime = (!Unchanging && + youmonst.data != &mons[PM_FIRE_VORTEX] && + youmonst.data != &mons[PM_FIRE_ELEMENTAL] && + youmonst.data != &mons[PM_SALAMANDER] && + youmonst.data != &mons[PM_GREEN_SLIME]); + + if (cadaver && mnum != PM_LIZARD && mnum != PM_LICHEN) { + long age = peek_at_iced_corpse_age(otmp); + /* worst case rather than random + in this calculation to force prompt */ + rotted = (monstermoves - age)/(10L + 0 /* was rn2(20) */); + if (otmp->cursed) rotted += 2L; + else if (otmp->blessed) rotted -= 2L; + } + } + + /* + * These problems with food should be checked in + * order from most detrimental to least detrimental. + */ + + if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && !Sick_resistance) { + /* Tainted meat */ + Sprintf(buf, "%s like it could be tainted! %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (stoneorslime) { + Sprintf(buf, "%s like it could be something very dangerous! %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (otmp->orotten || (cadaver && rotted > 3L)) { + /* Rotten */ + Sprintf(buf, "%s like it could be rotten! %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (cadaver && poisonous(&mons[mnum]) && !Poison_resistance) { + /* poisonous */ + Sprintf(buf, "%s like it might be poisonous! %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (cadaver && !vegetarian(&mons[mnum]) && + !u.uconduct.unvegetarian && Role_if(PM_MONK)) { + Sprintf(buf, "%s unhealthy. %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (cadaver && acidic(&mons[mnum]) && !Acid_resistance) { + Sprintf(buf, "%s rather acidic. %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (Upolyd && + (u.umonnum == PM_RUST_MONSTER && is_metallic(otmp) && otmp->oerodeproof)) { + Sprintf(buf, "%s disgusting to you right now. %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + + /* + * Breaks conduct, but otherwise safe. + */ + + if (!u.uconduct.unvegan && + ((material == LEATHER || material == BONE || + material == DRAGON_HIDE || material == WAX) || + (cadaver && !vegan(&mons[mnum])))) { + Sprintf(buf, "%s foul and unfamiliar to you. %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + if (!u.uconduct.unvegetarian && + ((material == LEATHER || material == BONE || material == DRAGON_HIDE) || + (cadaver && !vegetarian(&mons[mnum])))) { + Sprintf(buf, "%s unfamiliar to you. %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + + if (cadaver && mnum != PM_ACID_BLOB && rotted > 5L && Sick_resistance) { + /* Tainted meat with Sick_resistance */ + Sprintf(buf, "%s like it could be tainted! %s", + foodsmell, eat_it_anyway); + if (yn_function(buf,ynchars,'n')=='n') return 1; + else return 2; + } + return 0; + } + int doeat() /* generic "eat" command funtion (see cmd.c) */ { register struct obj *otmp; int basenutrit; /* nutrition of full item */ boolean dont_start = FALSE; ! if (Strangled) { pline("If you can't breathe air, how can you consume solids?"); return 0; *************** *** 1635,1640 **** --- 1809,1824 ---- if (!(otmp = floorfood("eat", 0))) return 0; if (check_capacity((char *)0)) return 0; + if (u.uedibility) { + int res = edibility_prompts(otmp); + if (res) { + Your("%s stops tingling and your sense of smell returns to normal.", + body_part(NOSE)); + u.uedibility = 0; + if (res == 1) return 0; + } + } + /* We have to make non-foods take 1 move to eat, unless we want to * do ridiculous amounts of coding to deal with partly eaten plate * mails, players who polymorph back to human in the middle of their *************** *** 1656,1665 **** u.umonnum == PM_RUST_MONSTER && otmp->oerodeproof) { otmp->rknown = TRUE; if (otmp->quan > 1L) { ! if(!carried(otmp)) ! (void) splitobj(otmp, 1L); ! else ! otmp = splitobj(otmp, otmp->quan - 1L); } pline("Ulch - That %s was rustproofed!", xname(otmp)); /* The regurgitated object's rustproofing is gone now */ --- 1840,1849 ---- u.umonnum == PM_RUST_MONSTER && otmp->oerodeproof) { otmp->rknown = TRUE; if (otmp->quan > 1L) { ! if(!carried(otmp)) ! (void) splitobj(otmp, otmp->quan - 1L); ! else ! otmp = splitobj(otmp, 1L); } pline("Ulch - That %s was rustproofed!", xname(otmp)); /* The regurgitated object's rustproofing is gone now */ *************** *** 1684,1689 **** --- 1868,1874 ---- return (1); } if (otmp->oclass != FOOD_CLASS) { + int material; victual.reqtime = 1; victual.piece = otmp; /* Don't split it, we don't need to if it's 1 move */ *************** *** 1701,1706 **** --- 1886,1899 ---- victual.nmod = basenutrit; victual.eating = TRUE; /* needed for lesshungry() */ + material = objects[otmp->otyp].oc_material; + if (material == LEATHER || material == BONE || material == DRAGON_HIDE) { + u.uconduct.unvegan++; + violated_vegetarian(); + } else if (material == WAX) + u.uconduct.unvegan++; + u.uconduct.food++; + if (otmp->cursed) (void) rottenfood(otmp); *************** *** 1716,1722 **** otmp->oclass == GOLD_CLASS ? foodword(otmp) : singular(otmp, xname)); - u.uconduct.food++; eatspecial(); return 1; } --- 1909,1914 ---- *************** *** 1728,1737 **** * they shouldn't be able to choke now. */ if (u.uhs != SATIATED) victual.canchoke = FALSE; ! if(!carried(victual.piece)) { ! if(victual.piece->quan > 1L) ! (void) splitobj(victual.piece, 1L); ! } You("resume your meal."); start_eating(victual.piece); return(1); --- 1920,1926 ---- * they shouldn't be able to choke now. */ if (u.uhs != SATIATED) victual.canchoke = FALSE; ! victual.piece = touchfood(otmp); You("resume your meal."); start_eating(victual.piece); return(1); *************** *** 1777,1783 **** otmp->orotten = TRUE; dont_start = TRUE; } ! otmp->oeaten >>= 1; } else fprefx(otmp); } --- 1966,1972 ---- otmp->orotten = TRUE; dont_start = TRUE; } ! consume_oeaten(otmp, 1); /* oeaten >>= 1 */ } else fprefx(otmp); } *************** *** 1830,1839 **** force_save_hs = TRUE; if(victual.nmod < 0) { lesshungry(-victual.nmod); ! victual.piece->oeaten -= -victual.nmod; } else if(victual.nmod > 0 && (victual.usedtime % victual.nmod)) { lesshungry(1); ! victual.piece->oeaten--; } force_save_hs = FALSE; recalc_wt(); --- 2019,2028 ---- force_save_hs = TRUE; if(victual.nmod < 0) { lesshungry(-victual.nmod); ! consume_oeaten(victual.piece, victual.nmod); /* -= -nmod */ } else if(victual.nmod > 0 && (victual.usedtime % victual.nmod)) { lesshungry(1); ! consume_oeaten(victual.piece, -1); /* -= 1 */ } force_save_hs = FALSE; recalc_wt(); *************** *** 1900,1916 **** lesshungry(num) /* called after eating (and after drinking fruit juice) */ register int num; { #ifdef DEBUG debugpline("lesshungry(%d)", num); #endif u.uhunger += num; if(u.uhunger >= 2000) { ! if (!victual.eating || victual.canchoke) { ! if (victual.eating) { ! choke(victual.piece); ! reset_eat(); } else ! choke(tin.tin); /* may be null */ /* no reset_eat() */ } } else { --- 2089,2107 ---- lesshungry(num) /* called after eating (and after drinking fruit juice) */ register int num; { + /* See comments in newuhs() for discussion on force_save_hs */ + boolean iseating = (occupation == eatfood) || force_save_hs; #ifdef DEBUG debugpline("lesshungry(%d)", num); #endif u.uhunger += num; if(u.uhunger >= 2000) { ! if (!iseating || victual.canchoke) { ! if (iseating) { ! choke(victual.piece); ! reset_eat(); } else ! choke(occupation == opentin ? tin.tin : (struct obj *)0); /* no reset_eat() */ } } else { *************** *** 2083,2092 **** "You still have the munchies." : "The munchies are interfering with your motor capabilities."); else if (incr && ! (Role_if(PM_WIZARD) || Race_if(PM_ELF) || Role_if(PM_VALKYRIE))) pline("%s needs food, badly!", ! (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? ! urole.name.m : "Elf"); else You((!incr) ? "feel weak now." : (u.uhunger < 45) ? "feel weak." : --- 2274,2284 ---- "You still have the munchies." : "The munchies are interfering with your motor capabilities."); else if (incr && ! (Role_if(PM_WIZARD) || Race_if(PM_ELF) || ! Role_if(PM_VALKYRIE))) pline("%s needs food, badly!", ! (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? ! urole.name.m : "Elf"); else You((!incr) ? "feel weak now." : (u.uhunger < 45) ? "feel weak." : *************** *** 2125,2130 **** --- 2317,2332 ---- char c; boolean feeding = (!strcmp(verb, "eat")); + /* if we can't touch floor objects then use invent food only */ + if (!can_reach_floor() || + #ifdef STEED + (feeding && u.usteed) || /* can't eat off floor while riding */ + #endif + ((is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) && + (Wwalking || is_clinger(youmonst.data) || + (Flying && !Breathless)))) + goto skipfloor; + if (feeding && metallivorous(youmonst.data)) { struct obj *gold; struct trap *ttmp = t_at(u.ux, u.uy); *************** *** 2145,2154 **** } } ! if ( ! #ifdef STEED ! !u.usteed && ! #endif (gold = g_at(u.ux, u.uy)) != 0) { if (gold->quan == 1L) Sprintf(qbuf, "There is 1 gold piece here; eat it?"); --- 2347,2353 ---- } } ! if (youmonst.data != &mons[PM_RUST_MONSTER] && (gold = g_at(u.ux, u.uy)) != 0) { if (gold->quan == 1L) Sprintf(qbuf, "There is 1 gold piece here; eat it?"); *************** *** 2165,2183 **** } /* Is there some food (probably a heavy corpse) here on the ground? */ ! if ( ! #ifdef STEED ! !u.usteed && ! #endif ! !(Levitation && !Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz)) ! && !u.uswallow) { ! for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) { if(corpsecheck ? (otmp->otyp==CORPSE && (corpsecheck == 1 || tinnable(otmp))) : feeding ? (otmp->oclass != GOLD_CLASS && is_edible(otmp)) : otmp->oclass==FOOD_CLASS) { Sprintf(qbuf, "There %s %s here; %s %s?", ! (otmp->quan == 1L) ? "is" : "are", doname(otmp), verb, (otmp->quan == 1L) ? "it" : "one"); if((c = yn_function(qbuf,ynqchars,'n')) == 'y') --- 2364,2376 ---- } /* Is there some food (probably a heavy corpse) here on the ground? */ ! for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) { if(corpsecheck ? (otmp->otyp==CORPSE && (corpsecheck == 1 || tinnable(otmp))) : feeding ? (otmp->oclass != GOLD_CLASS && is_edible(otmp)) : otmp->oclass==FOOD_CLASS) { Sprintf(qbuf, "There %s %s here; %s %s?", ! otense(otmp, "are"), doname(otmp), verb, (otmp->quan == 1L) ? "it" : "one"); if((c = yn_function(qbuf,ynqchars,'n')) == 'y') *************** *** 2185,2192 **** else if(c == 'q') return((struct obj *) 0); } - } } /* We cannot use ALL_CLASSES since that causes getobj() to skip its * "ugly checks" and we need to check for inedible items. */ --- 2378,2386 ---- else if(c == 'q') return((struct obj *) 0); } } + + skipfloor: /* We cannot use ALL_CLASSES since that causes getobj() to skip its * "ugly checks" and we need to check for inedible items. */ *************** *** 2219,2229 **** --- 2413,2497 ---- uneaten_amt = (long)obj->oeaten; full_amount = (obj->otyp == CORPSE) ? (long)mons[obj->corpsenm].cnutrit : (long)objects[obj->otyp].oc_nutrition; + if (uneaten_amt > full_amount) { + impossible( + "partly eaten food (%ld) more nutritious than untouched food (%ld)", + uneaten_amt, full_amount); + uneaten_amt = full_amount; + } base = (int)(full_amount ? (long)base * uneaten_amt / full_amount : 0L); return (base < 1) ? 1 : base; } + /* reduce obj's oeaten field, making sure it never hits or passes 0 */ + void + consume_oeaten(obj, amt) + struct obj *obj; + int amt; + { + /* + * This is a hack to try to squelch several long standing mystery + * food bugs. A better solution would be to rewrite the entire + * victual handling mechanism from scratch using a less complex + * model. Alternatively, this routine could call done_eating() + * or food_disappears() but its callers would need revisions to + * cope with victual.piece unexpectedly going away. + * + * Multi-turn eating operates by setting the food's oeaten field + * to its full nutritional value and then running a counter which + * independently keeps track of whether there is any food left. + * The oeaten field can reach exactly zero on the last turn, and + * the object isn't removed from inventory until the next turn + * when the "you finish eating" message gets delivered, so the + * food would be restored to the status of untouched during that + * interval. This resulted in unexpected encumbrance messages + * at the end of a meal (if near enough to a threshold) and would + * yield full food if there was an interruption on the critical + * turn. Also, there have been reports over the years of food + * becoming massively heavy or producing unlimited satiation; + * this would occur if reducing oeaten via subtraction attempted + * to drop it below 0 since its unsigned type would produce a + * huge positive value instead. So far, no one has figured out + * _why_ that inappropriate subtraction might sometimes happen. + */ + + if (amt > 0) { + /* bit shift to divide the remaining amount of food */ + obj->oeaten >>= amt; + } else { + /* simple decrement; value is negative so we actually add it */ + if ((int) obj->oeaten > -amt) + obj->oeaten += amt; + else + obj->oeaten = 0; + } + + if (obj->oeaten == 0) { + if (obj == victual.piece) /* always true unless wishing... */ + victual.reqtime = victual.usedtime; /* no bites left */ + obj->oeaten = 1; /* smallest possible positive value */ + } + } + #endif /* OVLB */ + #ifdef OVL1 + + /* called when eatfood occupation has been interrupted, + or in the case of theft, is about to be interrupted */ + boolean + maybe_finished_meal(stopping) + boolean stopping; + { + /* in case consume_oeaten() has decided that the food is all gone */ + if (occupation == eatfood && victual.usedtime >= victual.reqtime) { + if (stopping) occupation = 0; /* for do_reset_eat */ + (void) eatfood(); /* calls done_eating() to use up victual.piece */ + return TRUE; + } + return FALSE; + } + + #endif /* OVL1 */ /*eat.c*/ *** nethack-3.3.1/src/end.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/end.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)end.c 3.3 2000/06/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)end.c 3.4 2001/09/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 40,47 **** STATIC_DCL void FDECL(add_artifact_score, (struct obj *)); STATIC_DCL void FDECL(display_artifact_score, (struct obj *,winid)); STATIC_DCL void FDECL(savelife, (int)); ! STATIC_DCL void NDECL(list_vanquished); ! STATIC_DCL void NDECL(list_genocided); #if defined(__BEOS__) || defined(MICRO) || defined(WIN32) || defined(OS2) extern void FDECL(nethack_exit,(int)); --- 40,48 ---- STATIC_DCL void FDECL(add_artifact_score, (struct obj *)); STATIC_DCL void FDECL(display_artifact_score, (struct obj *,winid)); STATIC_DCL void FDECL(savelife, (int)); ! STATIC_DCL void FDECL(list_vanquished, (int, BOOLEAN_P)); ! STATIC_DCL void FDECL(list_genocided, (int, BOOLEAN_P)); ! STATIC_DCL boolean FDECL(should_query_disclose_option, (int, int*)); #if defined(__BEOS__) || defined(MICRO) || defined(WIN32) || defined(OS2) extern void FDECL(nethack_exit,(int)); *************** *** 52,58 **** #define done_stopprint program_state.stopprint #ifdef AMIGA - void NDECL(clear_icon); # define NH_abort() Abort(0) #else # ifdef SYSV --- 53,58 ---- *************** *** 186,192 **** You("die..."); mark_synch(); /* flush buffered screen output */ buf[0] = '\0'; ! if ((mtmp->data->geno & G_UNIQ) != 0) { if (!type_is_pname(mtmp->data)) Strcat(buf, "the "); killer_format = KILLED_BY; --- 186,194 ---- You("die..."); mark_synch(); /* flush buffered screen output */ buf[0] = '\0'; ! /* "killed by the high priest of Crom" is okay, "killed by the high ! priest" alone isn't */ ! if ((mtmp->data->geno & G_UNIQ) != 0 && !(mtmp->data == &mons[PM_HIGH_PRIEST] && !mtmp->ispriest)) { if (!type_is_pname(mtmp->data)) Strcat(buf, "the "); killer_format = KILLED_BY; *************** *** 226,231 **** --- 228,235 ---- u.ugrave_arise = urace.mummynum; else if (mtmp->data->mlet == S_VAMPIRE && Race_if(PM_HUMAN)) u.ugrave_arise = PM_VAMPIRE; + else if (mtmp->data == &mons[PM_GHOUL]) + u.ugrave_arise = PM_GHOUL; if (u.ugrave_arise >= LOW_PM && (mvitals[u.ugrave_arise].mvflags & G_GENOD)) u.ugrave_arise = NON_PM; *************** *** 283,339 **** done(PANICKED); } STATIC_OVL void disclose(how,taken) int how; boolean taken; { ! char c; char qbuf[QBUFSZ]; ! if (invent && !done_stopprint && ! (!flags.end_disclose[0] || index(flags.end_disclose, 'i'))) { if(taken) Sprintf(qbuf,"Do you want to see what you had when you %s?", (how == QUIT) ? "quit" : "died"); else Strcpy(qbuf,"Do you want your possessions identified?"); ! if ((c = yn_function(qbuf, ynqchars, 'y')) == 'y') { ! /* New dump format by maartenj@cs.vu.nl */ ! struct obj *obj; ! ! for (obj = invent; obj; obj = obj->nobj) { ! makeknown(obj->otyp); ! obj->known = obj->bknown = obj->dknown = obj->rknown = 1; } ! (void) display_inventory((char *)0, TRUE); ! container_contents(invent, TRUE, TRUE); } - if (c == 'q') done_stopprint++; } ! if (!done_stopprint && ! (!flags.end_disclose[0] || index(flags.end_disclose, 'a'))) { ! c = yn_function("Do you want to see your attributes?",ynqchars,'y'); ! if (c == 'y') enlightenment(how >= PANICKED ? 1 : 2); /* final */ ! if (c == 'q') done_stopprint++; } ! if (!done_stopprint && ! (!flags.end_disclose[0] || index(flags.end_disclose, 'v'))) { ! list_vanquished(); ! } ! if (!done_stopprint && ! (!flags.end_disclose[0] || index(flags.end_disclose, 'g'))) { ! list_genocided(); ! } ! if (!done_stopprint && ! (!flags.end_disclose[0] || index(flags.end_disclose, 'c'))) { ! c = yn_function("Do you want to see your conduct?",ynqchars,'y'); ! if (c == 'y') show_conduct(how >= PANICKED ? 1 : 2); ! if (c == 'q') done_stopprint++; } } --- 287,387 ---- done(PANICKED); } + STATIC_OVL boolean + should_query_disclose_option(category, defquery) + int category; + int *defquery; + { + int idx; + char *dop = index(disclosure_options, category); + if (dop && defquery) { + idx = (dop - disclosure_options) / sizeof(char); + if (idx < 0 || idx > (NUM_DISCLOSURE_OPTIONS - 1)) { + impossible( + "should_query_disclose_option: bad disclosure index %d %c", + idx, category); + *defquery = DISCLOSE_PROMPT_DEFAULT_YES; + return TRUE; + } + if (flags.end_disclose[idx] == DISCLOSE_YES_WITHOUT_PROMPT) { + *defquery = 'y'; + return FALSE; + } else if (flags.end_disclose[idx] == DISCLOSE_NO_WITHOUT_PROMPT) { + *defquery = 'n'; + return FALSE; + } else if (flags.end_disclose[idx] == DISCLOSE_PROMPT_DEFAULT_YES) { + *defquery = 'y'; + return TRUE; + } else if (flags.end_disclose[idx] == DISCLOSE_PROMPT_DEFAULT_NO) { + *defquery = 'n'; + return TRUE; + } + } + if (defquery)impossible("should_query_disclose_option: bad category %c", category); + else impossible("should_query_disclose_option: null defquery"); + return TRUE; + } + STATIC_OVL void disclose(how,taken) int how; boolean taken; { ! char c = 0; char qbuf[QBUFSZ]; + int defquery; + boolean ask; ! if (invent) { if(taken) Sprintf(qbuf,"Do you want to see what you had when you %s?", (how == QUIT) ? "quit" : "died"); else Strcpy(qbuf,"Do you want your possessions identified?"); ! ! ask = should_query_disclose_option('i', &defquery); ! if (!done_stopprint) { ! if (ask) ! c = yn_function(qbuf, ynqchars, defquery); ! if ((!ask && defquery == 'y') || (ask && c == 'y')) { ! /* New dump format by maartenj@cs.vu.nl */ ! struct obj *obj; ! ! for (obj = invent; obj; obj = obj->nobj) { ! makeknown(obj->otyp); ! obj->known = obj->bknown = obj->dknown = obj->rknown = 1; ! } ! (void) display_inventory((char *)0, TRUE); ! container_contents(invent, TRUE, TRUE); } ! if (ask && c == 'q') done_stopprint++; } } ! ask = should_query_disclose_option('a', &defquery); ! if (!done_stopprint) { ! if (ask) ! c = yn_function("Do you want to see your attributes?",ynqchars, defquery); ! if ((!ask && defquery == 'y') || (ask && c == 'y')) ! enlightenment(how >= PANICKED ? 1 : 2); /* final */ ! if (ask && c == 'q') done_stopprint++; } ! ask = should_query_disclose_option('v', &defquery); ! if (!done_stopprint) ! list_vanquished(defquery, ask); ! ask = should_query_disclose_option('g', &defquery); ! if (!done_stopprint) ! list_genocided(defquery, ask); ! ask = should_query_disclose_option('c', &defquery); ! if (!done_stopprint) { ! if (ask) ! c = yn_function("Do you want to see your conduct?",ynqchars,defquery); ! if ((!ask && defquery == 'y') || (ask && c == 'y')) ! show_conduct(how >= PANICKED ? 1 : 2); ! if (ask && c == 'q') done_stopprint++; } } *************** *** 348,353 **** --- 396,406 ---- u.uhunger = 500; newuhs(FALSE); } + /* cure impending doom of sickness hero won't have time to fix */ + if ((Sick & TIMEOUT) == 1) { + u.usick_type = 0; + Sick = 0; + } if (how == CHOKING) init_uhunger(); nomovemsg = "You survived that attempt on your life."; flags.move = 0; *************** *** 370,387 **** register struct obj *obj; register int i; ! /* find amulets and gems, ignoring artifacts except for the AoY. */ for (obj = list; obj; obj = obj->nobj) if (Has_contents(obj)) { get_valuables(obj->cobj); } else if (obj->oclass == AMULET_CLASS) { i = obj->otyp - FIRST_AMULET; if (!amulets[i].count) { amulets[i].count = obj->quan; amulets[i].typ = obj->otyp; } else amulets[i].count += obj->quan; /* always adds one */ ! } else if (obj->oclass == GEM_CLASS && obj->otyp < LUCKSTONE && ! !obj->oartifact) { i = min(obj->otyp, LAST_GEM + 1) - FIRST_GEM; if (!gems[i].count) { gems[i].count = obj->quan; --- 423,441 ---- register struct obj *obj; register int i; ! /* find amulets and gems, ignoring all artifacts */ for (obj = list; obj; obj = obj->nobj) if (Has_contents(obj)) { get_valuables(obj->cobj); + } else if (obj->oartifact) { + continue; } else if (obj->oclass == AMULET_CLASS) { i = obj->otyp - FIRST_AMULET; if (!amulets[i].count) { amulets[i].count = obj->quan; amulets[i].typ = obj->otyp; } else amulets[i].count += obj->quan; /* always adds one */ ! } else if (obj->oclass == GEM_CLASS && obj->otyp < LUCKSTONE) { i = min(obj->otyp, LAST_GEM + 1) - FIRST_GEM; if (!gems[i].count) { gems[i].count = obj->quan; *************** *** 428,435 **** otmp->otyp == BELL_OF_OPENING || otmp->otyp == SPE_BOOK_OF_THE_DEAD || otmp->otyp == CANDELABRUM_OF_INVOCATION) { ! /* shopkeepers charge 100x; 250x is arbitrary */ ! u.urexp += 250L * (long)objects[otmp->otyp].oc_cost; if (Has_contents(otmp)) add_artifact_score(otmp->cobj); } --- 482,488 ---- otmp->otyp == BELL_OF_OPENING || otmp->otyp == SPE_BOOK_OF_THE_DEAD || otmp->otyp == CANDELABRUM_OF_INVOCATION) { ! u.urexp += (arti_cost(otmp) * 5 / 2); if (Has_contents(otmp)) add_artifact_score(otmp->cobj); } *************** *** 454,464 **** otmp->known = otmp->bknown = otmp->dknown = otmp->rknown = 1; /* assumes artifacts don't have quan>1 */ ! Sprintf(pbuf, "%s (worth %ld zorkmids and %ld points)", otmp->oartifact ? artifact_name(xname(otmp), &dummy) : OBJ_NAME(objects[otmp->otyp]), ! 100L * (long)objects[otmp->otyp].oc_cost, ! 250L * (long)objects[otmp->otyp].oc_cost); putstr(endwin, 0, pbuf); } if (Has_contents(otmp)) --- 507,518 ---- otmp->known = otmp->bknown = otmp->dknown = otmp->rknown = 1; /* assumes artifacts don't have quan>1 */ ! Sprintf(pbuf, "%s%s (worth %ld %s and %ld points)", ! the_unique_obj(otmp) ? "The " : "", otmp->oartifact ? artifact_name(xname(otmp), &dummy) : OBJ_NAME(objects[otmp->otyp]), ! arti_cost(otmp), currency(2L), ! arti_cost(otmp) * 5 / 2); putstr(endwin, 0, pbuf); } if (Has_contents(otmp)) *************** *** 476,488 **** winid endwin = WIN_ERR; boolean bones_ok, have_windows = iflags.window_inited; struct obj *corpse = (struct obj *)0; /* kilbuf: used to copy killer in case it comes from something like * xname(), which would otherwise get overwritten when we call * xname() when listing possessions * pbuf: holds Sprintf'd output for raw_print and putstr */ ! if (how == ASCENDED) killer_format = NO_KILLER_PREFIX; /* Avoid killed by "a" burning or "a" starvation */ if (!killer && (how == STARVING || how == BURNING)) --- 530,543 ---- winid endwin = WIN_ERR; boolean bones_ok, have_windows = iflags.window_inited; struct obj *corpse = (struct obj *)0; + long umoney; /* kilbuf: used to copy killer in case it comes from something like * xname(), which would otherwise get overwritten when we call * xname() when listing possessions * pbuf: holds Sprintf'd output for raw_print and putstr */ ! if (how == ASCENDED || (!killer && how == GENOCIDED)) killer_format = NO_KILLER_PREFIX; /* Avoid killed by "a" burning or "a" starvation */ if (!killer && (how == STARVING || how == BURNING)) *************** *** 540,547 **** program_state.gameover = 1; /* in case of a subsequent panic(), there's no point trying to save */ program_state.something_worth_saving = 0; ! /* turn off vision subsystem */ ! vision_recalc(2); /* might have been killed while using a disposable item, so make sure it's gone prior to inventory disclosure and creation of bones data */ inven_inuse(TRUE); --- 595,602 ---- program_state.gameover = 1; /* in case of a subsequent panic(), there's no point trying to save */ program_state.something_worth_saving = 0; ! /* render vision subsystem inoperative */ ! iflags.vision_inited = 0; /* might have been killed while using a disposable item, so make sure it's gone prior to inventory disclosure and creation of bones data */ inven_inuse(TRUE); *************** *** 551,557 **** * smiling... :-) -3. */ if (moves <= 1 && how < PANICKED) /* You die... --More-- */ ! pline("Do not pass go. Do not collect 200 zorkmids."); if (have_windows) wait_synch(); /* flush screen output */ #ifndef NO_SIGNAL --- 606,612 ---- * smiling... :-) -3. */ if (moves <= 1 && how < PANICKED) /* You die... --More-- */ ! pline("Do not pass go. Do not collect 200 %s.", currency(200L)); if (have_windows) wait_synch(); /* flush screen output */ #ifndef NO_SIGNAL *************** *** 573,579 **** u.ugrave_arise = (NON_PM - 2); /* leave no corpse */ else if (how == STONING) u.ugrave_arise = (NON_PM - 1); /* statue instead of corpse */ ! else if (u.ugrave_arise == NON_PM) { corpse = mk_named_object(CORPSE, &mons[u.umonnum], u.ux, u.uy, plname); Sprintf(pbuf, "%s, %s%s", plname, --- 628,635 ---- u.ugrave_arise = (NON_PM - 2); /* leave no corpse */ else if (how == STONING) u.ugrave_arise = (NON_PM - 1); /* statue instead of corpse */ ! else if (u.ugrave_arise == NON_PM && ! !(mvitals[u.umonnum].mvflags & G_NOCORPSE)) { corpse = mk_named_object(CORPSE, &mons[u.umonnum], u.ux, u.uy, plname); Sprintf(pbuf, "%s, %s%s", plname, *************** *** 604,612 **** } else taken = FALSE; /* lint; assert( !bones_ok ); */ clearlocks(); ! #ifdef AMIGA ! clear_icon(); ! #endif if (have_windows) display_nhwindow(WIN_MESSAGE, FALSE); if (strcmp(flags.end_disclose, "none") && how != PANICKED) --- 660,666 ---- } else taken = FALSE; /* lint; assert( !bones_ok ); */ clearlocks(); ! if (have_windows) display_nhwindow(WIN_MESSAGE, FALSE); if (strcmp(flags.end_disclose, "none") && how != PANICKED) *************** *** 619,626 **** long tmp; int deepest = deepest_lev_reached(FALSE); ! u.ugold += hidden_gold(); /* accumulate gold from containers */ ! tmp = u.ugold - u.ugold0; if (tmp < 0L) tmp = 0L; if (how < PANICKED) --- 673,688 ---- long tmp; int deepest = deepest_lev_reached(FALSE); ! #ifndef GOLDOBJ ! umoney = u.ugold; ! tmp = u.ugold0; ! #else ! umoney = money_cnt(invent); ! tmp = u.umoney0; ! #endif ! umoney += hidden_gold(); /* accumulate gold from containers */ ! tmp = umoney - tmp; /* net gain */ ! if (tmp < 0L) tmp = 0L; if (how < PANICKED) *************** *** 642,647 **** --- 704,717 ---- corpse = (struct obj *)0; } + /* update gold for the rip output, which can't use hidden_gold() + (containers will be gone by then if bones just got saved...) */ + #ifndef GOLDOBJ + u.ugold = umoney; + #else + done_money = umoney; + #endif + /* clean up unneeded windows */ if (have_windows) { wait_synch(); *************** *** 744,752 **** otmp->dknown = 1; /* seen it (blindness fix) */ otmp->onamelth = 0; otmp->quan = count; ! Sprintf(pbuf, "%8ld %s (worth %ld zorkmids),", count, xname(otmp), ! count * (long)objects[typ].oc_cost); obfree(otmp, (struct obj *)0); } else { Sprintf(pbuf, --- 814,822 ---- otmp->dknown = 1; /* seen it (blindness fix) */ otmp->onamelth = 0; otmp->quan = count; ! Sprintf(pbuf, "%8ld %s (worth %ld %s),", count, xname(otmp), ! count * (long)objects[typ].oc_cost, currency(2L)); obfree(otmp, (struct obj *)0); } else { Sprintf(pbuf, *************** *** 782,788 **** if (!done_stopprint) { Sprintf(pbuf, "and %ld piece%s of gold, after %ld move%s.", ! u.ugold, plur(u.ugold), moves, plur(moves)); putstr(endwin, 0, pbuf); } if (!done_stopprint) { --- 852,858 ---- if (!done_stopprint) { Sprintf(pbuf, "and %ld piece%s of gold, after %ld move%s.", ! umoney, plur(umoney), moves, plur(moves)); putstr(endwin, 0, pbuf); } if (!done_stopprint) { *************** *** 842,848 **** if (all_containers) container_contents(box->cobj, identified, TRUE); } else { ! pline("%s is empty.", The(xname(box))); display_nhwindow(WIN_MESSAGE, FALSE); } } --- 912,918 ---- if (all_containers) container_contents(box->cobj, identified, TRUE); } else { ! pline("%s empty.", Tobjnam(box, "are")); display_nhwindow(WIN_MESSAGE, FALSE); } } *************** *** 871,877 **** } STATIC_OVL void ! list_vanquished() { register int i, lev; int ntypes = 0, max_lev = 0, nkilled; --- 941,949 ---- } STATIC_OVL void ! list_vanquished(defquery, ask) ! int defquery; ! boolean ask; { register int i, lev; int ntypes = 0, max_lev = 0, nkilled; *************** *** 891,900 **** * includes all dead monsters, not just those killed by the player */ if (ntypes != 0) { ! c = yn_function("Do you want an account of creatures vanquished?", ! ynqchars, 'n'); ! if (c == 'q') done_stopprint++; ! if (c == 'y') { klwin = create_nhwindow(NHW_MENU); putstr(klwin, 0, "Vanquished creatures:"); putstr(klwin, 0, ""); --- 963,973 ---- * includes all dead monsters, not just those killed by the player */ if (ntypes != 0) { ! if (ask) ! c = yn_function("Do you want an account of creatures vanquished?", ! ynqchars, defquery); ! if (ask && c == 'q') done_stopprint++; ! if ((!ask && defquery == 'y') || (ask && c == 'y')) { klwin = create_nhwindow(NHW_MENU); putstr(klwin, 0, "Vanquished creatures:"); putstr(klwin, 0, ""); *************** *** 907,915 **** Sprintf(buf, "%s%s", !type_is_pname(&mons[i]) ? "The " : "", mons[i].mname); ! if (nkilled > 1) ! Sprintf(eos(buf)," (%d time%s)", ! nkilled, plur(nkilled)); } else { /* trolls or undead might have come back, but we don't keep track of that */ --- 980,994 ---- Sprintf(buf, "%s%s", !type_is_pname(&mons[i]) ? "The " : "", mons[i].mname); ! if (nkilled > 1) { ! switch (nkilled) { ! case 2: Sprintf(eos(buf)," (twice)"); break; ! case 3: Sprintf(eos(buf)," (thrice)"); break; ! default: Sprintf(eos(buf)," (%d time%s)", ! nkilled, plur(nkilled)); ! break; ! } ! } } else { /* trolls or undead might have come back, but we don't keep track of that */ *************** *** 949,955 **** } STATIC_OVL void ! list_genocided() { register int i; int ngenocided; --- 1028,1036 ---- } STATIC_OVL void ! list_genocided(defquery, ask) ! int defquery; ! boolean ask; { register int i; int ngenocided; *************** *** 961,970 **** /* genocided species list */ if (ngenocided != 0) { ! c = yn_function("Do you want a list of species genocided?", ! ynqchars, 'n'); ! if (c == 'q') done_stopprint++; ! if (c == 'y') { klwin = create_nhwindow(NHW_MENU); putstr(klwin, 0, "Genocided species:"); putstr(klwin, 0, ""); --- 1042,1052 ---- /* genocided species list */ if (ngenocided != 0) { ! if (ask) ! c = yn_function("Do you want a list of species genocided?", ! ynqchars, defquery); ! if (ask && c == 'q') done_stopprint++; ! if ((!ask && defquery == 'y') || (ask && c == 'y')) { klwin = create_nhwindow(NHW_MENU); putstr(klwin, 0, "Genocided species:"); putstr(klwin, 0, ""); *** nethack-3.3.1/src/engrave.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/engrave.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)engrave.c 3.3 1999/08/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)engrave.c 3.4 2001/11/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 153,159 **** if ((x == u.ux) && (y == u.uy) && u.uswallow && is_animal(u.ustuck->data)) return "maw"; ! else if (IS_AIR(lev->typ)) return "air"; else if (is_pool(x,y)) return "water"; --- 153,159 ---- if ((x == u.ux) && (y == u.uy) && u.uswallow && is_animal(u.ustuck->data)) return "maw"; ! else if (IS_AIR(lev->typ) && Is_airlevel(&u.uz)) return "air"; else if (is_pool(x,y)) return "water"; *************** *** 336,342 **** char *et; unsigned maxelen = BUFSZ - sizeof("You feel the words: \"\". "); if (strlen(ep->engr_txt) > maxelen) { ! strncpy(buf, ep->engr_txt, maxelen); buf[maxelen] = '\0'; et = buf; } else --- 336,342 ---- char *et; unsigned maxelen = BUFSZ - sizeof("You feel the words: \"\". "); if (strlen(ep->engr_txt) > maxelen) { ! (void) strncpy(buf, ep->engr_txt, (int)maxelen); buf[maxelen] = '\0'; et = buf; } else *************** *** 369,375 **** ep->engr_y = y; ep->engr_txt = (char *)(ep + 1); Strcpy(ep->engr_txt, s); ! if(strcmp(s, "Elbereth")) exercise(A_WIS, TRUE); ep->engr_time = e_time; ep->engr_type = e_type > 0 ? e_type : rnd(N_ENGRAVE-1); ep->engr_lth = strlen(s) + 1; --- 369,376 ---- ep->engr_y = y; ep->engr_txt = (char *)(ep + 1); Strcpy(ep->engr_txt, s); ! /* engraving Elbereth shows wisdom */ ! if(!strcmp(s, "Elbereth")) exercise(A_WIS, TRUE); ep->engr_time = e_time; ep->engr_type = e_type > 0 ? e_type : rnd(N_ENGRAVE-1); ep->engr_lth = strlen(s) + 1; *************** *** 450,465 **** char post_engr_text[BUFSZ]; /* Text displayed after engraving prompt */ const char *everb; /* Present tense of engraving type */ const char *eloc; /* Where the engraving is (ie dust/floor/...) */ ! register char *sp; /* Place holder for space count of engr text */ ! register int len; /* # of nonspace chars of new engraving text */ ! register int maxelen; /* Max allowable length of new engraving text */ ! register int spct; /* # of spaces in new engraving text */ ! register struct engr *oep = engr_at(u.ux,u.uy); /* The current engraving */ ! register struct obj *otmp; /* Object selected with which to engrave */ char *writer; - multi = 0; /* moves consumed */ nomovemsg = (char *)0; /* occupation end message */ --- 451,464 ---- char post_engr_text[BUFSZ]; /* Text displayed after engraving prompt */ const char *everb; /* Present tense of engraving type */ const char *eloc; /* Where the engraving is (ie dust/floor/...) */ ! char *sp; /* Place holder for space count of engr text */ ! int len; /* # of nonspace chars of new engraving text */ ! int maxelen; /* Max allowable length of engraving text */ ! struct engr *oep = engr_at(u.ux,u.uy); /* The current engraving */ ! struct obj *otmp; /* Object selected with which to engrave */ char *writer; multi = 0; /* moves consumed */ nomovemsg = (char *)0; /* occupation end message */ *************** *** 531,540 **** return(0); } if (IS_GRAVE(levl[u.ux][u.uy].typ)) { You("disturb the undead!"); (void) makemon(&mons[PM_GHOUL], u.ux, u.uy, NO_MM_FLAGS); exercise(A_WIS, FALSE); ! return(0); } /* SPFX for items */ --- 530,542 ---- return(0); } if (IS_GRAVE(levl[u.ux][u.uy].typ)) { + if (!levl[u.ux][u.uy].disturbed) { You("disturb the undead!"); + levl[u.ux][u.uy].disturbed = 1; (void) makemon(&mons[PM_GHOUL], u.ux, u.uy, NO_MM_FLAGS); exercise(A_WIS, FALSE); ! return(1); ! } } /* SPFX for items */ *************** *** 676,682 **** break; case WAN_CANCELLATION: case WAN_MAKE_INVISIBLE: ! if(oep) { if (!Blind) pline_The("engraving on the %s vanishes!", surface(u.ux,u.uy)); --- 678,684 ---- break; case WAN_CANCELLATION: case WAN_MAKE_INVISIBLE: ! if (oep && oep->engr_type != HEADSTONE) { if (!Blind) pline_The("engraving on the %s vanishes!", surface(u.ux,u.uy)); *************** *** 684,690 **** } break; case WAN_TELEPORTATION: ! if (oep) { if (!Blind) pline_The("engraving on the %s vanishes!", surface(u.ux,u.uy)); --- 686,692 ---- } break; case WAN_TELEPORTATION: ! if (oep && oep->engr_type != HEADSTONE) { if (!Blind) pline_The("engraving on the %s vanishes!", surface(u.ux,u.uy)); *************** *** 783,797 **** if (!Blind) You("wipe out the message here."); else ! Your("%s gets %s.", xname(otmp), ! is_ice(u.ux,u.uy) ? ! "frosty" : "dusty"); dengr = TRUE; } else Your("%s can't wipe out this engraving.", xname(otmp)); else ! Your("%s gets %s.", xname(otmp), is_ice(u.ux,u.uy) ? "frosty" : "dusty"); break; default: --- 785,800 ---- if (!Blind) You("wipe out the message here."); else ! Your("%s %s %s.", xname(otmp), ! otense(otmp, "get"), ! is_ice(u.ux,u.uy) ? ! "frosty" : "dusty"); dengr = TRUE; } else Your("%s can't wipe out this engraving.", xname(otmp)); else ! Your("%s %s %s.", xname(otmp), otense(otmp, "get"), is_ice(u.ux,u.uy) ? "frosty" : "dusty"); break; default: *************** *** 811,816 **** --- 814,831 ---- break; } + if (IS_GRAVE(levl[u.ux][u.uy].typ)) { + if (type == ENGRAVE || type == 0) + type = HEADSTONE; + else { + /* ensures the "cannot wipe out" case */ + type = DUST; + dengr = FALSE; + teleengr = FALSE; + buf[0] = (char)0; + } + } + /* End of implement setup */ /* Identify stylus */ *************** *** 839,846 **** if (zapwand && (otmp->spe < 0)) { pline("%s %sturns to dust.", The(xname(otmp)), Blind ? "" : "glows violently, then "); ! You("are not going to get anywhere trying to write in the %s with your dust.", ! is_ice(u.ux,u.uy) ? "frost" : "dust"); useup(otmp); ptext = FALSE; } --- 854,862 ---- if (zapwand && (otmp->spe < 0)) { pline("%s %sturns to dust.", The(xname(otmp)), Blind ? "" : "glows violently, then "); ! if (!IS_GRAVE(levl[u.ux][u.uy].typ)) ! You("are not going to get anywhere trying to write in the %s with your dust.", ! is_ice(u.ux,u.uy) ? "frost" : "dust"); useup(otmp); ptext = FALSE; } *************** *** 860,866 **** /* Give player the choice to add to engraving. */ ! if ( (type == oep->engr_type) && (!Blind || (oep->engr_type == BURN) || (oep->engr_type == ENGRAVE)) ) { c = yn_function("Do you want to add to the current engraving?", ynqchars, 'y'); --- 876,885 ---- /* Give player the choice to add to engraving. */ ! if (type == HEADSTONE) { ! /* no choice, only append */ ! c = 'y'; ! } else if ( (type == oep->engr_type) && (!Blind || (oep->engr_type == BURN) || (oep->engr_type == ENGRAVE)) ) { c = yn_function("Do you want to add to the current engraving?", ynqchars, 'y'); *************** *** 898,904 **** You("will overwrite the current message."); eow = TRUE; } ! } } eloc = surface(u.ux,u.uy); --- 917,923 ---- You("will overwrite the current message."); eow = TRUE; } ! } } eloc = surface(u.ux,u.uy); *************** *** 943,965 **** Sprintf(qbuf,"What do you want to %s the %s here?", everb, eloc); getlin(qbuf, ebuf); - /* Mix up engraving if surface or state of mind is unsound. */ - /* Original kludge by stewr 870708. modified by njm 910722. */ - for (sp = ebuf; *sp; sp++) - if ( ((type == DUST || type == ENGR_BLOOD) && !rn2(25)) || - (Blind && !rn2(9)) || (Confusion && !rn2(12)) || - (Stunned && !rn2(4)) || (Hallucination && !rn2(1)) ) - *sp = '!' + rn2(93); /* ASCII-code only */ - /* Count the actual # of chars engraved not including spaces */ len = strlen(ebuf); ! for (sp = ebuf, spct = 0; *sp; sp++) if (isspace(*sp)) spct++; ! ! if ( (len == spct) || index(ebuf, '\033') ) { if (zapwand) { if (!Blind) ! pline("%s glows, then fades.", The(xname(otmp))); return(1); } else { pline(Never_mind); --- 962,976 ---- Sprintf(qbuf,"What do you want to %s the %s here?", everb, eloc); getlin(qbuf, ebuf); /* Count the actual # of chars engraved not including spaces */ len = strlen(ebuf); + for (sp = ebuf; *sp; sp++) if (isspace(*sp)) len -= 1; ! if (len == 0 || index(ebuf, '\033')) { if (zapwand) { if (!Blind) ! pline("%s, then %s.", ! Tobjnam(otmp, "glow"), otense(otmp, "fade")); return(1); } else { pline(Never_mind); *************** *** 967,978 **** } } - len -= spct; - /* A single `x' is the traditional signature of an illiterate person */ if (len != 1 || (!index(ebuf, 'x') && !index(ebuf, 'X'))) u.uconduct.literate++; /* Previous engraving is overwritten */ if (eow) { del_engr(oep); --- 978,998 ---- } } /* A single `x' is the traditional signature of an illiterate person */ if (len != 1 || (!index(ebuf, 'x') && !index(ebuf, 'X'))) u.uconduct.literate++; + /* Mix up engraving if surface or state of mind is unsound. + Note: this won't add or remove any spaces. */ + for (sp = ebuf; *sp; sp++) { + if (isspace(*sp)) continue; + if (((type == DUST || type == ENGR_BLOOD) && !rn2(25)) || + (Blind && !rn2(11)) || (Confusion && !rn2(7)) || + (Stunned && !rn2(4)) || (Hallucination && !rn2(2))) + *sp = ' ' + rnd(96 - 2); /* ASCII '!' thru '~' + (excludes ' ' and DEL) */ + } + /* Previous engraving is overwritten */ if (eow) { del_engr(oep); *************** *** 1004,1015 **** * "ere", then "th". */ Your("%s dull.", aobjnam(otmp, "get")); if (len > maxelen) { multi = -maxelen; otmp->spe = -3; ! } else ! if (len > 1) otmp->spe -= len >> 1; ! else otmp->spe -= 1; /* Prevent infinite engraving */ } else if ( (otmp->oclass == RING_CLASS) || (otmp->oclass == GEM_CLASS) ) --- 1024,1042 ---- * "ere", then "th". */ Your("%s dull.", aobjnam(otmp, "get")); + if (otmp->unpaid) { + struct monst *shkp = shop_keeper(*u.ushops); + if (shkp) { + You("damage it, you pay for it!"); + bill_dummy_object(otmp); + } + } if (len > maxelen) { multi = -maxelen; otmp->spe = -3; ! } else if (len > 1) ! otmp->spe -= len >> 1; ! else otmp->spe -= 1; /* Prevent infinite engraving */ } else if ( (otmp->oclass == RING_CLASS) || (otmp->oclass == GEM_CLASS) ) *************** *** 1067,1072 **** --- 1094,1100 ---- if (doblind && !resists_blnd(&youmonst)) { You("are blinded by the flash!"); make_blinded((long)rnd(50),FALSE); + if (!Blind) Your(vision_clears); } return(1); *** nethack-3.3.1/src/exper.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/exper.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)exper.c 3.3 2000/07/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)exper.c 3.4 2002/01/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 39,45 **** experience(mtmp, nk) /* return # of exp points for mtmp after nk killed */ register struct monst *mtmp; register int nk; ! #if defined(applec) # pragma unused(nk) #endif { --- 39,45 ---- experience(mtmp, nk) /* return # of exp points for mtmp after nk killed */ register struct monst *mtmp; register int nk; ! #if defined(macintosh) && (defined(__SC__) || defined(__MRC__)) # pragma unused(nk) #endif { *************** *** 139,149 **** else if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; if (u.ulevel < urole.xlev) ! num = rn1(u.ulevel/2 + urole.enadv.lornd + urace.enadv.lornd, ! urole.enadv.lofix + urace.enadv.lofix); else ! num = rn1(u.ulevel/2 + urole.enadv.hirnd + urace.enadv.hirnd, ! urole.enadv.hifix + urace.enadv.hifix); num = enermod(num); /* M. Stephenson */ u.uenmax -= num; if (u.uenmax < 0) u.uenmax = 0; --- 139,149 ---- else if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; if (u.ulevel < urole.xlev) ! num = rn1((int)ACURR(A_WIS)/2 + urole.enadv.lornd + urace.enadv.lornd, ! urole.enadv.lofix + urace.enadv.lofix); else ! num = rn1((int)ACURR(A_WIS)/2 + urole.enadv.hirnd + urace.enadv.hirnd, ! urole.enadv.hifix + urace.enadv.hifix); num = enermod(num); /* M. Stephenson */ u.uenmax -= num; if (u.uenmax < 0) u.uenmax = 0; *************** *** 179,190 **** num = newhp(); u.uhpmax += num; u.uhp += num; if (u.ulevel < urole.xlev) num = rn1((int)ACURR(A_WIS)/2 + urole.enadv.lornd + urace.enadv.lornd, ! urole.enadv.lofix + urace.enadv.lofix); else num = rn1((int)ACURR(A_WIS)/2 + urole.enadv.hirnd + urace.enadv.hirnd, ! urole.enadv.hifix + urace.enadv.hifix); num = enermod(num); /* M. Stephenson */ u.uenmax += num; u.uen += num; --- 179,195 ---- num = newhp(); u.uhpmax += num; u.uhp += num; + if (Upolyd) { + num = rnd(8); + u.mhmax += num; + u.mh += num; + } if (u.ulevel < urole.xlev) num = rn1((int)ACURR(A_WIS)/2 + urole.enadv.lornd + urace.enadv.lornd, ! urole.enadv.lofix + urace.enadv.lofix); else num = rn1((int)ACURR(A_WIS)/2 + urole.enadv.hirnd + urace.enadv.hirnd, ! urole.enadv.hifix + urace.enadv.hifix); num = enermod(num); /* M. Stephenson */ u.uenmax += num; u.uen += num; *** nethack-3.3.1/src/explode.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/explode.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)explode.c 3.3 2000/07/07 */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)explode.c 3.4 2000/07/07 */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 22,32 **** * these disadvantages.... */ void ! explode(x, y, type, dam, olet) int x, y; int type; /* the same as in zap.c */ int dam; char olet; { int i, j, k, damu = dam; boolean starting = 1; --- 22,33 ---- * these disadvantages.... */ void ! explode(x, y, type, dam, olet, expltype) int x, y; int type; /* the same as in zap.c */ int dam; char olet; + int expltype; { int i, j, k, damu = dam; boolean starting = 1; *************** *** 39,44 **** --- 40,46 ---- int explmask[3][3]; /* 0=normal explosion, 1=do shieldeff, 2=do nothing */ boolean shopdamage = FALSE; + boolean generic = FALSE; if (olet == WAND_CLASS) /* retributive strike */ switch (Role_switch) { *************** *** 180,186 **** for (i=0; i<3; i++) for (j=0; j<3; j++) { if (explmask[i][j] == 2) continue; tmp_at(starting ? DISP_BEAM : DISP_CHANGE, ! cmap_to_glyph(expl[i][j])); tmp_at(i+x-1, j+y-1); starting = 0; } --- 182,188 ---- for (i=0; i<3; i++) for (j=0; j<3; j++) { if (explmask[i][j] == 2) continue; tmp_at(starting ? DISP_BEAM : DISP_CHANGE, ! explosion_to_glyph(expltype,expl[i][j])); tmp_at(i+x-1, j+y-1); starting = 0; } *************** *** 205,211 **** /* Cover last shield glyph with blast symbol. */ for (i=0; i<3; i++) for (j=0; j<3; j++) { if (explmask[i][j] == 1) ! show_glyph(i+x-1,j+y-1,cmap_to_glyph(expl[i][j])); } } else { /* delay a little bit. */ --- 207,214 ---- /* Cover last shield glyph with blast symbol. */ for (i=0; i<3; i++) for (j=0; j<3; j++) { if (explmask[i][j] == 1) ! show_glyph(i+x-1,j+y-1, ! explosion_to_glyph(expltype, expl[i][j])); } } else { /* delay a little bit. */ *************** *** 215,221 **** tmp_at(DISP_END, 0); /* clear the explosion */ } else { ! if (flags.soundok) You_hear("a blast."); } if (dam) --- 218,228 ---- tmp_at(DISP_END, 0); /* clear the explosion */ } else { ! if (olet == MON_EXPLODE) { ! str = "explosion"; ! generic = TRUE; ! } ! if (flags.soundok) You_hear("a blast."); } if (dam) *************** *** 258,264 **** (adtyp == AD_ACID) ? "burned" : "fried"); } else if (cansee(i+x-1, j+y-1)) ! pline("%s is caught in the %s!", Monnam(mtmp), str); idamres += destroy_mitem(mtmp, SCROLL_CLASS, (int) adtyp); idamres += destroy_mitem(mtmp, SPBOOK_CLASS, (int) adtyp); --- 265,271 ---- (adtyp == AD_ACID) ? "burned" : "fried"); } else if (cansee(i+x-1, j+y-1)) ! pline("%s is caught in the %s!", Monnam(mtmp), str); idamres += destroy_mitem(mtmp, SCROLL_CLASS, (int) adtyp); idamres += destroy_mitem(mtmp, SPBOOK_CLASS, (int) adtyp); *************** *** 277,285 **** int mdam = dam; if (resist(mtmp, olet, 0, FALSE)) { ! if (cansee(i+x-1,j+y-1)) ! pline("%s resists the %s!", Monnam(mtmp), str); ! mdam = dam/2; } if (mtmp == u.ustuck) mdam *= 2; --- 284,292 ---- int mdam = dam; if (resist(mtmp, olet, 0, FALSE)) { ! if (cansee(i+x-1,j+y-1)) ! pline("%s resists the %s!", Monnam(mtmp), str); ! mdam = dam/2; } if (mtmp == u.ustuck) mdam *= 2; *************** *** 294,300 **** /* KMH -- Don't blame the player for pets killing gas spores */ if (!flags.mon_moving) killed(mtmp); else monkilled(mtmp, "", (int)adtyp); ! } } /* Do your injury last */ --- 301,307 ---- /* KMH -- Don't blame the player for pets killing gas spores */ if (!flags.mon_moving) killed(mtmp); else monkilled(mtmp, "", (int)adtyp); ! } else if (!flags.mon_moving) setmangry(mtmp); } /* Do your injury last */ *************** *** 316,333 **** destroy_item(WAND_CLASS, (int) adtyp); ugolemeffects((int) adtyp, damu); ! if (uhurt == 2) u.uhp -= damu, flags.botl = 1; ! if (u.uhp <= 0) { if (olet == MON_EXPLODE) { /* killer handled by caller */ ! if (str != killer_buf) Strcpy(killer_buf, str); killer_format = KILLED_BY_AN; } else if (type >= 0 && olet != SCROLL_CLASS) { killer_format = NO_KILLER_PREFIX; Sprintf(killer_buf, "caught %sself in %s own %s", ! him[flags.female], his[flags.female], str); } else { killer_format = KILLED_BY; Strcpy(killer_buf, str); --- 323,349 ---- destroy_item(WAND_CLASS, (int) adtyp); ugolemeffects((int) adtyp, damu); ! if (uhurt == 2) { ! if (Upolyd) ! u.mh -= damu; ! else ! u.uhp -= damu; ! flags.botl = 1; ! } ! if (u.uhp <= 0 || (Upolyd && u.mh <= 0)) { ! if (Upolyd) { ! rehumanize(); ! } else { if (olet == MON_EXPLODE) { /* killer handled by caller */ ! if (str != killer_buf && !generic) Strcpy(killer_buf, str); killer_format = KILLED_BY_AN; } else if (type >= 0 && olet != SCROLL_CLASS) { killer_format = NO_KILLER_PREFIX; Sprintf(killer_buf, "caught %sself in %s own %s", ! uhim(), uhis(), str); } else { killer_format = KILLED_BY; Strcpy(killer_buf, str); *************** *** 336,341 **** --- 352,358 ---- /* Known BUG: BURNING suppresses corpse in bones data, but done does not handle killer reason correctly */ done((adtyp == AD_FIRE) ? BURNING : DIED); + } } exercise(A_STR, FALSE); } *************** *** 345,350 **** --- 362,372 ---- adtyp == AD_COLD ? "shatter" : adtyp == AD_DISN ? "disintegrate" : "destroy"); } + + /* explosions are noisy */ + i = dam * dam; + if (i < 50) i = 50; /* in case random damage is very small */ + wake_nearto(x, y, i); } #endif /* OVL0 */ #ifdef OVL1 *************** *** 394,413 **** qtmp = otmp->quan - 1; if (qtmp > LARGEST_INT) qtmp = LARGEST_INT; qtmp = (long)rnd((int)qtmp); ! (void) splitobj(otmp, qtmp); ! if (qtmp < otmp->quan) ! split_up = TRUE; else ! split_up = FALSE; ! } if (individual_object) { ! if (split_up) { ! if (otmp->where == OBJ_FLOOR) ! obj = otmp->nexthere; ! else ! obj = otmp->nobj; } else ! obj = (struct obj *)0; } obj_extract_self(otmp); used_up = FALSE; --- 416,433 ---- qtmp = otmp->quan - 1; if (qtmp > LARGEST_INT) qtmp = LARGEST_INT; qtmp = (long)rnd((int)qtmp); ! otmp = splitobj(otmp, qtmp); ! if (rn2(qtmp)) ! split_up = TRUE; else ! split_up = FALSE; ! } else ! split_up = FALSE; if (individual_object) { ! if (split_up) { ! obj = otmp; } else ! obj = (struct obj *)0; } obj_extract_self(otmp); used_up = FALSE; *************** *** 417,431 **** && ((otmp->otyp == BOULDER) || (otmp->otyp == STATUE)) && rn2(10)) { if (otmp->otyp == BOULDER) { ! pline("%s breaks apart.",The(xname(otmp))); fracture_rock(otmp); place_object(otmp, sx, sy); /* put fragments on floor */ } else { struct trap *trap; if ((trap = t_at(sx,sy)) && trap->ttyp == STATUE_TRAP) deltrap(trap); ! pline("%s crumbles.",The(xname(otmp))); (void) break_statue(otmp); place_object(otmp, sx, sy); /* put fragments on floor */ } --- 437,456 ---- && ((otmp->otyp == BOULDER) || (otmp->otyp == STATUE)) && rn2(10)) { if (otmp->otyp == BOULDER) { ! pline("%s apart.", Tobjnam(otmp, "break")); fracture_rock(otmp); place_object(otmp, sx, sy); /* put fragments on floor */ + if ((otmp = sobj_at(BOULDER, sx, sy)) != 0) { + /* another boulder here, restack it to the top */ + obj_extract_self(otmp); + place_object(otmp, sx, sy); + } } else { struct trap *trap; if ((trap = t_at(sx,sy)) && trap->ttyp == STATUE_TRAP) deltrap(trap); ! pline("%s.", Tobjnam(otmp, "crumble")); (void) break_statue(otmp); place_object(otmp, sx, sy); /* put fragments on floor */ } *************** *** 543,549 **** { /* ZT_SPELL(ZT_FIRE) = ZT_SPELL(AD_FIRE-1) = 10+(2-1) = 11 */ #define ZT_SPELL_O_FIRE 11 /* value kludge, see zap.c */ ! explode(x, y, ZT_SPELL_O_FIRE, d(4,4), BURNING_OIL); } #endif /* OVL1 */ --- 568,574 ---- { /* ZT_SPELL(ZT_FIRE) = ZT_SPELL(AD_FIRE-1) = 10+(2-1) = 11 */ #define ZT_SPELL_O_FIRE 11 /* value kludge, see zap.c */ ! explode(x, y, ZT_SPELL_O_FIRE, d(4,4), BURNING_OIL, EXPL_FIERY); } #endif /* OVL1 */ *** nethack-3.3.1/src/extralev.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/extralev.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)extralev.c 3.3 1999/11/26 */ /* Copyright 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)extralev.c 3.4 2001/09/06 */ /* Copyright 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 302,343 **** ghost = christen_monst(ghost, roguename()); if (rn2(4)) { ! ghostobj = mksobj_at(FOOD_RATION,x,y,FALSE); ghostobj->quan = (long) rnd(7); ghostobj->owt = weight(ghostobj); } if (rn2(2)) { ! ghostobj = mksobj_at(MACE,x,y,FALSE); ghostobj->spe = rnd(3); if (rn2(4)) curse(ghostobj); } else { ! ghostobj = mksobj_at(TWO_HANDED_SWORD,x,y,FALSE); ghostobj->spe = rnd(5) - 2; if (rn2(4)) curse(ghostobj); } ! ghostobj = mksobj_at(BOW,x,y,FALSE); ghostobj->spe = 1; if (rn2(4)) curse(ghostobj); ! ghostobj = mksobj_at(ARROW,x,y,FALSE); ghostobj->spe = 0; ghostobj->quan = (long) rn1(10,25); ghostobj->owt = weight(ghostobj); if (rn2(4)) curse(ghostobj); if (rn2(2)) { ! ghostobj = mksobj_at(RING_MAIL,x,y,FALSE); ghostobj->spe = rn2(3); if (!rn2(3)) ghostobj->oerodeproof = TRUE; if (rn2(4)) curse(ghostobj); } else { ! ghostobj = mksobj_at(PLATE_MAIL,x,y,FALSE); ghostobj->spe = rnd(5) - 2; if (!rn2(3)) ghostobj->oerodeproof = TRUE; if (rn2(4)) curse(ghostobj); } if (rn2(2)) { ! ghostobj = mksobj_at(FAKE_AMULET_OF_YENDOR,x,y,TRUE); ghostobj->known = TRUE; } } --- 302,343 ---- ghost = christen_monst(ghost, roguename()); if (rn2(4)) { ! ghostobj = mksobj_at(FOOD_RATION, x, y, FALSE, FALSE); ghostobj->quan = (long) rnd(7); ghostobj->owt = weight(ghostobj); } if (rn2(2)) { ! ghostobj = mksobj_at(MACE, x, y, FALSE, FALSE); ghostobj->spe = rnd(3); if (rn2(4)) curse(ghostobj); } else { ! ghostobj = mksobj_at(TWO_HANDED_SWORD, x, y, FALSE, FALSE); ghostobj->spe = rnd(5) - 2; if (rn2(4)) curse(ghostobj); } ! ghostobj = mksobj_at(BOW, x, y, FALSE, FALSE); ghostobj->spe = 1; if (rn2(4)) curse(ghostobj); ! ghostobj = mksobj_at(ARROW, x, y, FALSE, FALSE); ghostobj->spe = 0; ghostobj->quan = (long) rn1(10,25); ghostobj->owt = weight(ghostobj); if (rn2(4)) curse(ghostobj); if (rn2(2)) { ! ghostobj = mksobj_at(RING_MAIL, x, y, FALSE, FALSE); ghostobj->spe = rn2(3); if (!rn2(3)) ghostobj->oerodeproof = TRUE; if (rn2(4)) curse(ghostobj); } else { ! ghostobj = mksobj_at(PLATE_MAIL, x, y, FALSE, FALSE); ghostobj->spe = rnd(5) - 2; if (!rn2(3)) ghostobj->oerodeproof = TRUE; if (rn2(4)) curse(ghostobj); } if (rn2(2)) { ! ghostobj = mksobj_at(FAKE_AMULET_OF_YENDOR, x, y, TRUE, FALSE); ghostobj->known = TRUE; } } *** nethack-3.3.1/src/files.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/files.c Thu Mar 21 07:37:37 2002 *************** *** 1,10 **** ! /* SCCS Id: @(#)files.c 3.3 2000/04/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "dlb.h" #include #if !defined(MAC) && !defined(O_WRONLY) && !defined(AZTEC_C) --- 1,14 ---- ! /* SCCS Id: @(#)files.c 3.4 2002/02/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "dlb.h" + #ifdef TTY_GRAPHICS + #include "wintty.h" /* more() */ + #endif + #include #if !defined(MAC) && !defined(O_WRONLY) && !defined(AZTEC_C) *************** *** 71,76 **** --- 75,86 ---- char SAVEP[SAVESIZE]; /* holds path of directory for save file */ #endif + #ifdef WIZARD + #define WIZKIT_MAX 128 + static char wizkit[WIZKIT_MAX]; + STATIC_DCL FILE *NDECL(fopen_wizkit_file); + #endif + #ifdef AMIGA extern char PATH[]; /* see sys/amiga/amidos.c */ extern char bbs_id[]; *************** *** 80,85 **** --- 90,96 ---- # endif #include + extern void FDECL(amii_set_text_font, ( char *, int )); #endif #if defined(WIN32) || defined(MSDOS) *************** *** 91,103 **** #define DeleteFile unlink #endif extern int n_dgns; /* from dungeon.c */ STATIC_DCL char *FDECL(set_bonesfile_name, (char *,d_level*)); STATIC_DCL char *NDECL(set_bonestemp_name); #ifdef COMPRESS ! STATIC_DCL void FDECL(redirect, (char *,char *,FILE *,BOOLEAN_P)); ! STATIC_DCL void FDECL(docompress_file, (char *,BOOLEAN_P)); #endif STATIC_DCL char *FDECL(make_lockname, (const char *,char *)); STATIC_DCL FILE *FDECL(fopen_config_file, (const char *)); --- 102,118 ---- #define DeleteFile unlink #endif + #ifdef USER_SOUNDS + extern char *sounddir; + #endif + extern int n_dgns; /* from dungeon.c */ STATIC_DCL char *FDECL(set_bonesfile_name, (char *,d_level*)); STATIC_DCL char *NDECL(set_bonestemp_name); #ifdef COMPRESS ! STATIC_DCL void FDECL(redirect, (const char *,const char *,FILE *,BOOLEAN_P)); ! STATIC_DCL void FDECL(docompress_file, (const char *,BOOLEAN_P)); #endif STATIC_DCL char *FDECL(make_lockname, (const char *,char *)); STATIC_DCL FILE *FDECL(fopen_config_file, (const char *)); *************** *** 148,159 **** { FILE *fp; - #ifdef AMIGA - fp = fopenp(filename, mode); - #else filename = fqname(filename, use_scoreprefix ? SCOREPREFIX : DATAPREFIX, 0); ! # ifdef VMS /* essential to have punctuation, to avoid logical names */ { char tmp[BUFSIZ]; --- 163,171 ---- { FILE *fp; filename = fqname(filename, use_scoreprefix ? SCOREPREFIX : DATAPREFIX, 0); ! #ifdef VMS /* essential to have punctuation, to avoid logical names */ { char tmp[BUFSIZ]; *************** *** 161,169 **** filename = strcat(strcpy(tmp, filename), ";0"); fp = fopen(filename, mode, "mbc=16"); } ! # else fp = fopen(filename, mode); - # endif #endif return fp; } --- 173,180 ---- filename = strcat(strcpy(tmp, filename), ";0"); fp = fopen(filename, mode, "mbc=16"); } ! #else fp = fopen(filename, mode); #endif return fp; } *************** *** 185,193 **** strncat(levels, bbs_id, PATHLEN); #endif append_slash(bones); - #ifndef AMIGA /* We'll want bones & levels in the user specified directory -jhsa */ Strcat(bones, "bonesnn.*"); - #endif Strcpy(lock, levels); #ifndef AMIGA Strcat(lock, alllevels); --- 196,202 ---- *************** *** 322,341 **** { s_level *sptr; char *dptr; - #ifdef AMIGA - char bonetmp[16]; - #endif - #ifdef AMIGA /* We'll want the bones go the user defined Levels directory -jhsa */ - /* permbones should be subsumed by fqn_prefix[BONESPREFIX] */ - Sprintf(bonetmp, "bon%c%s", dungeons[lev->dnum].boneid, - In_quest(lev) ? urole.filecode : "0"); - Strcpy(file, permbones); - Strcat(file, bonetmp); - #else Sprintf(file, "bon%c%s", dungeons[lev->dnum].boneid, In_quest(lev) ? urole.filecode : "0"); - #endif dptr = eos(file); if ((sptr = Is_special(lev)) != 0) Sprintf(dptr, ".%c", sptr->boneid); --- 331,339 ---- *************** *** 567,597 **** const char *fq_save; int fd; - #ifdef AMIGA - fd = ami_wbench_getsave(O_WRONLY | O_CREAT | O_TRUNC); - #else fq_save = fqname(SAVEF, SAVEPREFIX, 0); ! # ifdef MICRO fd = open(fq_save, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK); ! # else ! # ifdef MAC fd = maccreat(fq_save, SAVE_TYPE); ! # else fd = creat(fq_save, FCMASK); ! # endif ! # if defined(VMS) && !defined(SECURE) /* Make sure the save file is owned by the current process. That's the default for non-privileged users, but for priv'd users the file will be owned by the directory's owner instead of the user. */ ! # ifdef getuid /*(see vmsunix.c)*/ ! # undef getuid ! # endif (void) chown(fq_save, getuid(), getgid()); ! # endif /* VMS && !SECURE */ ! # endif /* MICRO */ ! #endif /* AMIGA */ return fd; } --- 565,591 ---- const char *fq_save; int fd; fq_save = fqname(SAVEF, SAVEPREFIX, 0); ! #ifdef MICRO fd = open(fq_save, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK); ! #else ! # ifdef MAC fd = maccreat(fq_save, SAVE_TYPE); ! # else fd = creat(fq_save, FCMASK); ! # endif ! # if defined(VMS) && !defined(SECURE) /* Make sure the save file is owned by the current process. That's the default for non-privileged users, but for priv'd users the file will be owned by the directory's owner instead of the user. */ ! # ifdef getuid /*(see vmsunix.c)*/ ! # undef getuid ! # endif (void) chown(fq_save, getuid(), getgid()); ! # endif /* VMS && !SECURE */ ! #endif /* MICRO */ return fd; } *************** *** 604,619 **** const char *fq_save; int fd; - #ifdef AMIGA - fd = ami_wbench_getsave(O_RDONLY); - #else fq_save = fqname(SAVEF, SAVEPREFIX, 0); ! # ifdef MAC fd = macopen(fq_save, O_RDONLY | O_BINARY, SAVE_TYPE); ! # else fd = open(fq_save, O_RDONLY | O_BINARY, 0); ! # endif ! #endif /* AMIGA */ return fd; } --- 598,609 ---- const char *fq_save; int fd; fq_save = fqname(SAVEF, SAVEPREFIX, 0); ! #ifdef MAC fd = macopen(fq_save, O_RDONLY | O_BINARY, SAVE_TYPE); ! #else fd = open(fq_save, O_RDONLY | O_BINARY, 0); ! #endif return fd; } *************** *** 622,630 **** int delete_savefile() { - #ifdef AMIGA - ami_wbench_unlink(SAVEF); - #endif (void) unlink(fqname(SAVEF, SAVEPREFIX, 0)); return 0; /* for restore_saved_game() (ex-xxxmain.c) test */ } --- 612,617 ---- *************** *** 639,651 **** set_savefile_name(); #ifdef MFLOPPY ! if ( ! # ifdef AMIGA ! !(FromWBench || saveDiskPrompt(1)) ! # else ! !saveDiskPrompt(1) ! # endif ! ) return -1; #endif /* MFLOPPY */ fq_save = fqname(SAVEF, SAVEPREFIX, 0); --- 626,633 ---- set_savefile_name(); #ifdef MFLOPPY ! if (!saveDiskPrompt(1)) ! return -1; #endif /* MFLOPPY */ fq_save = fqname(SAVEF, SAVEPREFIX, 0); *************** *** 668,674 **** STATIC_OVL void redirect(filename, mode, stream, uncomp) ! char *filename, *mode; FILE *stream; boolean uncomp; { --- 650,656 ---- STATIC_OVL void redirect(filename, mode, stream, uncomp) ! const char *filename, *mode; FILE *stream; boolean uncomp; { *************** *** 688,694 **** */ STATIC_OVL void docompress_file(filename, uncomp) ! char *filename; boolean uncomp; { char cfn[80]; --- 670,676 ---- */ STATIC_OVL void docompress_file(filename, uncomp) ! const char *filename; boolean uncomp; { char cfn[80]; *************** *** 699,704 **** --- 681,689 ---- # endif int i = 0; int f; + # ifdef TTY_GRAPHICS + boolean istty = !strncmpi(windowprocs.name, "tty", 3); + # endif Strcpy(cfn, filename); # ifdef COMPRESS_EXTENSION *************** *** 738,744 **** --- 723,746 ---- args[++i] = (char *)0; f = fork(); + # ifdef TTY_GRAPHICS + /* If we don't do this and we are right after a y/n question *and* + * there is an error message from the compression, the 'y' or 'n' can + * end up being displayed after the error message. + */ + if (istty) + mark_synch(); + # endif if (f == 0) { /* child */ + # ifdef TTY_GRAPHICS + /* any error messages from the compression must come out after + * the first line, because the more() to let the user read + * them will have to clear the first line. This should be + * invisible if there are no error messages. + */ + if (istty) + raw_print(""); + # endif /* run compressor without privileges, in case other programs * have surprises along the line of gzip once taking filenames * in GZIP. *************** *** 789,794 **** --- 791,811 ---- /* no message needed for compress case; life will go on */ (void) unlink(cfn); } + #ifdef TTY_GRAPHICS + /* Give them a chance to read any error messages from the + * compression--these would go to stdout or stderr and would get + * overwritten only in tty mode. It's still ugly, since the + * messages are being written on top of the screen, but at least + * the user can read them. + */ + if (istty) + { + clear_nhwindow(WIN_MESSAGE); + more(); + /* No way to know if this is feasible */ + /* doredraw(); */ + } + #endif } } #endif /* COMPRESS */ *************** *** 799,805 **** const char *filename; { #ifndef COMPRESS ! #if defined(applec) || defined(__MWERKS__) # pragma unused(filename) #endif #else --- 816,822 ---- const char *filename; { #ifndef COMPRESS ! #if (defined(macintosh) && (defined(__SC__) || defined(__MRC__))) || defined(__MWERKS__) # pragma unused(filename) #endif #else *************** *** 814,820 **** const char *filename; { #ifndef COMPRESS ! #if defined(applec) || defined(__MWERKS__) # pragma unused(filename) #endif #else --- 831,837 ---- const char *filename; { #ifndef COMPRESS ! #if (defined(macintosh) && (defined(__SC__) || defined(__MRC__))) || defined(__MWERKS__) # pragma unused(filename) #endif #else *************** *** 840,846 **** const char *filename; char *lockname; { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(filename,lockname) return (char*)0; #else --- 857,863 ---- const char *filename; char *lockname; { ! #if (defined(macintosh) && (defined(__SC__) || defined(__MRC__))) || defined(__MWERKS__) # pragma unused(filename,lockname) return (char*)0; #else *************** *** 877,883 **** int whichprefix; int retryct; { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(filename, retryct) #endif char locknambuf[BUFSZ]; --- 894,900 ---- int whichprefix; int retryct; { ! #if (defined(macintosh) && (defined(__SC__) || defined(__MRC__))) || defined(__MWERKS__) # pragma unused(filename, retryct) #endif char locknambuf[BUFSZ]; *************** *** 986,992 **** void unlock_file(filename) const char *filename; ! #if defined(applec) # pragma unused(filename) #endif { --- 1003,1009 ---- void unlock_file(filename) const char *filename; ! #if defined(macintosh) && (defined(__SC__) || defined(__MRC__)) # pragma unused(filename) #endif { *************** *** 1230,1236 **** char *tmp_ramdisk; char *tmp_levels; { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(tmp_ramdisk,tmp_levels) #endif char *bufp, *altp; --- 1247,1253 ---- char *tmp_ramdisk; char *tmp_levels; { ! #if (defined(macintosh) && (defined(__SC__) || defined(__MRC__))) || defined(__MWERKS__) # pragma unused(tmp_ramdisk,tmp_levels) #endif char *bufp, *altp; *************** *** 1288,1305 **** #else /*NOCWD_ASSUMPTIONS*/ # ifdef MICRO } else if (match_varname(buf, "HACKDIR", 4)) { ! (void) strncpy(hackdir, bufp, PATHLEN); # ifdef MFLOPPY } else if (match_varname(buf, "RAMDISK", 3)) { /* The following ifdef is NOT in the wrong * place. For now, we accept and silently * ignore RAMDISK */ # ifndef AMIGA ! (void) strncpy(tmp_ramdisk, bufp, PATHLEN); # endif # endif } else if (match_varname(buf, "LEVELS", 4)) { ! (void) strncpy(tmp_levels, bufp, PATHLEN); } else if (match_varname(buf, "SAVE", 4)) { # ifdef MFLOPPY --- 1305,1322 ---- #else /*NOCWD_ASSUMPTIONS*/ # ifdef MICRO } else if (match_varname(buf, "HACKDIR", 4)) { ! (void) strncpy(hackdir, bufp, PATHLEN-1); # ifdef MFLOPPY } else if (match_varname(buf, "RAMDISK", 3)) { /* The following ifdef is NOT in the wrong * place. For now, we accept and silently * ignore RAMDISK */ # ifndef AMIGA ! (void) strncpy(tmp_ramdisk, bufp, PATHLEN-1); # endif # endif } else if (match_varname(buf, "LEVELS", 4)) { ! (void) strncpy(tmp_levels, bufp, PATHLEN-1); } else if (match_varname(buf, "SAVE", 4)) { # ifdef MFLOPPY *************** *** 1319,1325 **** saveprompt = flags.asksavedisk; # endif ! (void) strncpy(SAVEP, bufp, PATHLEN); append_slash(SAVEP); # endif /* MICRO */ #endif /*NOCWD_ASSUMPTIONS*/ --- 1336,1342 ---- saveprompt = flags.asksavedisk; # endif ! (void) strncpy(SAVEP, bufp, SAVESIZE-1); append_slash(SAVEP); # endif /* MICRO */ #endif /*NOCWD_ASSUMPTIONS*/ *************** *** 1336,1341 **** --- 1353,1360 ---- } else if (match_varname(buf, "CATNAME", 3)) { (void) strncpy(catname, bufp, PL_PSIZ-1); + } else if (match_varname(buf, "BOULDER", 3)) { + (void) get_uchars(fp, buf, bufp, &iflags.bouldersym, 1, "BOULDER"); } else if (match_varname(buf, "GRAPHICS", 4)) { len = get_uchars(fp, buf, bufp, translate, MAXPCHARS, "GRAPHICS"); assign_graphics(translate, len, MAXPCHARS, 0); *************** *** 1361,1370 **** (void) get_uchars(fp, buf, bufp, translate, WARNCOUNT, "WARNINGS"); assign_warnings(translate); #ifdef AMIGA } else if (match_varname(buf, "FONT", 4)) { char *t; - extern void amii_set_text_font( char *, int ); if( t = strchr( buf+5, ':' ) ) { --- 1380,1392 ---- (void) get_uchars(fp, buf, bufp, translate, WARNCOUNT, "WARNINGS"); assign_warnings(translate); + #ifdef WIZARD + } else if (match_varname(buf, "WIZKIT", 6)) { + (void) strncpy(wizkit, bufp, WIZKIT_MAX-1); + #endif #ifdef AMIGA } else if (match_varname(buf, "FONT", 4)) { char *t; if( t = strchr( buf+5, ':' ) ) { *************** *** 1373,1381 **** *t = ':'; } } else if (match_varname(buf, "PATH", 4)) { ! (void) strncpy(PATH, bufp, PATHLEN); ! #endif ! #ifdef AMIGA } else if (match_varname(buf, "DEPTH", 5)) { extern int amii_numcolors; int val = atoi( bufp ); --- 1395,1401 ---- *t = ':'; } } else if (match_varname(buf, "PATH", 4)) { ! (void) strncpy(PATH, bufp, PATHLEN-1); } else if (match_varname(buf, "DEPTH", 5)) { extern int amii_numcolors; int val = atoi( bufp ); *************** *** 1390,1397 **** } } else if (match_varname(buf, "SCREENMODE", 10 )) { extern long amii_scrnmode; ! if( sscanf(bufp, "%x", &amii_scrnmode) != 1 ) ! amii_scrnmode = 0; } else if (match_varname(buf, "MSGPENS", 7)) { extern int amii_msgAPen, amii_msgBPen; char *t = strtok(bufp, ",/"); --- 1410,1419 ---- } } else if (match_varname(buf, "SCREENMODE", 10 )) { extern long amii_scrnmode; ! if (!stricmp(bufp,"req")) ! amii_scrnmode = 0xffffffff; /* Requester */ ! else if( sscanf(bufp, "%x", &amii_scrnmode) != 1 ) ! amii_scrnmode = 0; } else if (match_varname(buf, "MSGPENS", 7)) { extern int amii_msgAPen, amii_msgBPen; char *t = strtok(bufp, ",/"); *************** *** 1449,1454 **** --- 1471,1504 ---- sscanf(t, "%hx", &amii_init_map[i]); } amii_setpens( amii_numcolors = i ); + } else if (match_varname(buf, "FGPENS", 6)) { + extern int foreg[ AMII_MAXCOLORS ]; + int i; + char *t; + + for (i = 0, t = strtok(bufp, ",/"); + i < AMII_MAXCOLORS && t != (char *)0; + t = strtok((char *)0, ",/"), ++i) + { + sscanf(t, "%d", &foreg[i]); + } + } else if (match_varname(buf, "BGPENS", 6)) { + extern int backg[ AMII_MAXCOLORS ]; + int i; + char *t; + + for (i = 0, t = strtok(bufp, ",/"); + i < AMII_MAXCOLORS && t != (char *)0; + t = strtok((char *)0, ",/"), ++i) + { + sscanf(t, "%d", &backg[i]); + } + #endif + #ifdef USER_SOUNDS + } else if (match_varname(buf, "SOUNDDIR", 8)) { + sounddir = (char *)strdup(bufp); + } else if (match_varname(buf, "SOUND", 5)) { + add_sound_mapping(bufp); #endif #ifdef QT_GRAPHICS } else if (match_varname(buf, "QT_TILEWIDTH", 12)) { *************** *** 1463,1474 **** --- 1513,1536 ---- extern char *qt_fontsize; if (qt_fontsize == NULL) qt_fontsize=(char *)strdup(bufp); + } else if (match_varname(buf, "QT_COMPACT", 10)) { + extern int qt_compact_mode; + qt_compact_mode = atoi(bufp); #endif } else return 0; return 1; } + #ifdef USER_SOUNDS + boolean + can_read_file(filename) + const char *filename; + { + return (access(filename, 4) == 0); + } + #endif /* USER_SOUNDS */ + void read_config_file(filename) const char *filename; *************** *** 1499,1512 **** # endif tmp_levels[0] = 0; #endif while (fgets(buf, 4*BUFSZ, fp)) { if (!parse_config_line(fp, buf, tmp_ramdisk, tmp_levels)) { ! raw_printf("Bad option line: \"%s\"", buf); wait_synch(); } } (void) fclose(fp); #if defined(MICRO) && !defined(NOCWD_ASSUMPTIONS) /* should be superseded by fqn_prefix[] */ --- 1561,1579 ---- # endif tmp_levels[0] = 0; #endif + /* begin detection of duplicate configfile options */ + set_duplicate_opt_detection(1); while (fgets(buf, 4*BUFSZ, fp)) { if (!parse_config_line(fp, buf, tmp_ramdisk, tmp_levels)) { ! raw_printf("Bad option line: \"%.50s\"", buf); wait_synch(); } } (void) fclose(fp); + + /* turn off detection of duplicate configfile options */ + set_duplicate_opt_detection(0); #if defined(MICRO) && !defined(NOCWD_ASSUMPTIONS) /* should be superseded by fqn_prefix[] */ *************** *** 1527,1532 **** --- 1594,1697 ---- return; } + #ifdef WIZARD + STATIC_OVL FILE * + fopen_wizkit_file() + { + FILE *fp; + #if defined(VMS) || defined(UNIX) + char tmp_wizkit[BUFSZ]; + #endif + char *envp; + + envp = nh_getenv("WIZKIT"); + if (envp && *envp) (void) strncpy(wizkit, envp, WIZKIT_MAX - 1); + if (!wizkit[0]) return (FILE *)0; + + #ifdef UNIX + if (access(wizkit, 4) == -1) { + /* 4 is R_OK on newer systems */ + /* nasty sneaky attempt to read file through + * NetHack's setuid permissions -- this is a + * place a file name may be wholly under the player's + * control + */ + raw_printf("Access to %s denied (%d).", + wizkit, errno); + wait_synch(); + /* fall through to standard names */ + } else + #endif + if ((fp = fopenp(wizkit, "r")) != (FILE *)0) { + return(fp); + #if defined(UNIX) || defined(VMS) + } else { + /* access() above probably caught most problems for UNIX */ + raw_printf("Couldn't open requested config file %s (%d).", + wizkit, errno); + wait_synch(); + #endif + } + + #if defined(MICRO) || defined(MAC) || defined(__BEOS__) || defined(WIN32) + if ((fp = fopenp(fqname(wizkit, CONFIGPREFIX, 0), "r")) + != (FILE *)0) + return(fp); + #else + # ifdef VMS + envp = nh_getenv("HOME"); + if (envp) + Sprintf(tmp_wizkit, "%s%s", envp, wizkit); + else + Sprintf(tmp_wizkit, "%s%s", "sys$login:", wizkit); + if ((fp = fopenp(tmp_wizkit, "r")) != (FILE *)0) + return(fp); + # else /* should be only UNIX left */ + envp = nh_getenv("HOME"); + if (envp) + Sprintf(tmp_wizkit, "%s/%s", envp, wizkit); + else Strcpy(tmp_wizkit, wizkit); + if ((fp = fopenp(tmp_wizkit, "r")) != (FILE *)0) + return(fp); + else if (errno != ENOENT) { + /* e.g., problems when setuid NetHack can't search home + * directory restricted to user */ + raw_printf("Couldn't open default wizkit file %s (%d).", + tmp_wizkit, errno); + wait_synch(); + } + # endif + #endif + return (FILE *)0; + } + + void + read_wizkit() + { + FILE *fp; + char *ep, buf[BUFSZ]; + struct obj *otmp; + if (!wizard || !(fp = fopen_wizkit_file())) return; + + while (fgets(buf, 4*BUFSZ, fp)) { + if ((ep = index(buf, '\n'))) *ep = '\0'; + if (buf[0]) { + otmp = readobjnam(buf, (struct obj *)0, FALSE); + if (otmp) { + if (otmp != &zeroobj) + otmp = addinv(otmp); + } else { + raw_printf("Bad wizkit item: \"%.50s\"", buf); + wait_synch(); + } + } + } + (void) fclose(fp); + return; + } + + #endif /*WIZARD*/ + /* ---------- END CONFIG FILE HANDLING ----------- */ /* ---------- BEGIN SCOREBOARD CREATION ----------- */ *************** *** 1536,1542 **** check_recordfile(dir) const char *dir; { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(dir) #endif const char *fq_record; --- 1701,1707 ---- check_recordfile(dir) const char *dir; { ! #if (defined(macintosh) && (defined(__SC__) || defined(__MRC__))) || defined(__MWERKS__) # pragma unused(dir) #endif const char *fq_record; *************** *** 1586,1592 **** if ((fd = open(fq_record, O_RDWR)) < 0) { /* try to create empty record */ ! # if defined(AZTEC_C) || defined(_DCC) /* Aztec doesn't use the third argument */ /* DICE doesn't like it */ if ((fd = open(fq_record, O_CREAT|O_RDWR)) < 0) { --- 1751,1757 ---- if ((fd = open(fq_record, O_RDWR)) < 0) { /* try to create empty record */ ! # if defined(AZTEC_C) || defined(_DCC) || (defined(__GNUC__) && defined(__AMIGA__)) /* Aztec doesn't use the third argument */ /* DICE doesn't like it */ if ((fd = open(fq_record, O_CREAT|O_RDWR)) < 0) { *** nethack-3.3.1/src/fountain.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/fountain.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)fountain.c 3.3 1999/08/16 */ /* Copyright Scott R. Turner, srt@ucla, 10/27/86 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)fountain.c 3.4 2001/09/06 */ /* Copyright Scott R. Turner, srt@ucla, 10/27/86 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 55,61 **** /* Give those on low levels a (slightly) better chance of survival */ if (rnd(100) > (80 + level_difficulty())) { pline("Grateful for %s release, %s grants you a wish!", ! his[pronoun_gender(mtmp)], he[pronoun_gender(mtmp)]); makewish(); mongone(mtmp); } else if (t_at(mtmp->mx, mtmp->my)) --- 55,61 ---- /* Give those on low levels a (slightly) better chance of survival */ if (rnd(100) > (80 + level_difficulty())) { pline("Grateful for %s release, %s grants you a wish!", ! mhis(mtmp), mhe(mtmp)); makewish(); mongone(mtmp); } else if (t_at(mtmp->mx, mtmp->my)) *************** *** 126,132 **** water_damage(level.objects[x][y], FALSE, TRUE); if ((mtmp = m_at(x, y)) != 0) ! (void) minwater(mtmp); else newsym(x,y); } --- 126,132 ---- water_damage(level.objects[x][y], FALSE, TRUE); if ((mtmp = m_at(x, y)) != 0) ! (void) minliquid(mtmp); else newsym(x,y); } *************** *** 135,142 **** dofindgem() /* Find a gem in the sparkling waters. */ { if (!Blind) You("spot a gem in the sparkling waters!"); (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE-1), ! u.ux, u.uy, FALSE); levl[u.ux][u.uy].looted |= F_LOOTED; newsym(u.ux, u.uy); exercise(A_WIS, TRUE); /* a discovery! */ --- 135,143 ---- dofindgem() /* Find a gem in the sparkling waters. */ { if (!Blind) You("spot a gem in the sparkling waters!"); + else You_feel("a gem here!"); (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE-1), ! u.ux, u.uy, FALSE, FALSE); levl[u.ux][u.uy].looted |= F_LOOTED; newsym(u.ux, u.uy); exercise(A_WIS, TRUE); /* a discovery! */ *************** *** 325,331 **** pline("This water gives you bad breath!"); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(!DEADMONSTER(mtmp)) ! mtmp->mflee = 1; } break; --- 326,332 ---- pline("This water gives you bad breath!"); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(!DEADMONSTER(mtmp)) ! monflee(mtmp, 0, FALSE, FALSE); } break; *************** *** 380,385 **** --- 381,387 ---- obj->oerodeproof = TRUE; exercise(A_WIS, TRUE); } + update_inventory(); levl[u.ux][u.uy].typ = ROOM; levl[u.ux][u.uy].looted = 0; if(Invisible) newsym(u.ux, u.uy); *************** *** 437,448 **** --- 439,472 ---- break; case 28: /* Strange feeling */ pline("An urge to take a bath overwhelms you."); + #ifndef GOLDOBJ if (u.ugold > 10) { u.ugold -= somegold() / 10; You("lost some of your gold in the fountain!"); levl[u.ux][u.uy].looted &= ~F_LOOTED; exercise(A_WIS, FALSE); } + #else + { + long money = money_cnt(invent); + struct obj *otmp; + if (money > 10) { + /* Amount to loose. Might get rounded up as fountains don't pay change... */ + money = somegold(money) / 10; + for (otmp = invent; otmp && money > 0; otmp = otmp->nobj) if (otmp->oclass == GOLD_CLASS) { + int denomination = objects[otmp->otyp].oc_cost; + long coin_loss = (money + denomination - 1) / denomination; + coin_loss = min(coin_loss, otmp->quan); + otmp->quan -= coin_loss; + money -= coin_loss * denomination; + if (!otmp->quan) delobj(otmp); + } + You("lost some of your money in the fountain!"); + levl[u.ux][u.uy].looted &= ~F_LOOTED; + exercise(A_WIS, FALSE); + } + } + #endif break; case 29: /* You see coins */ *************** *** 461,466 **** --- 485,491 ---- newsym(u.ux,u.uy); break; } + update_inventory(); dryup(u.ux, u.uy, TRUE); } *************** *** 552,558 **** case 10: pline("This water contains toxic wastes!"); if (!Unchanging) { You("undergo a freakish metamorphosis!"); ! polyself(); } break; /* more odd messages --JJB */ --- 577,583 ---- case 10: pline("This water contains toxic wastes!"); if (!Unchanging) { You("undergo a freakish metamorphosis!"); ! polyself(FALSE); } break; /* more odd messages --JJB */ *** nethack-3.3.1/src/hack.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/hack.c Thu Mar 21 07:37:37 2002 *************** *** 1,17 **** ! /* SCCS Id: @(#)hack.c 3.3 2000/04/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef OVL1 ! static void NDECL(maybe_wail); #endif /*OVL1*/ STATIC_DCL int NDECL(moverock); STATIC_DCL int FDECL(still_chewing,(XCHAR_P,XCHAR_P)); #ifdef SINKS STATIC_DCL void NDECL(dosinkfall); #endif STATIC_DCL boolean FDECL(monstinroom, (struct permonst *,int)); STATIC_DCL void FDECL(move_update, (BOOLEAN_P)); --- 1,18 ---- ! /* SCCS Id: @(#)hack.c 3.4 2002/03/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef OVL1 ! STATIC_DCL void NDECL(maybe_wail); #endif /*OVL1*/ STATIC_DCL int NDECL(moverock); STATIC_DCL int FDECL(still_chewing,(XCHAR_P,XCHAR_P)); #ifdef SINKS STATIC_DCL void NDECL(dosinkfall); #endif + STATIC_DCL void NDECL(findtravelpath); STATIC_DCL boolean FDECL(monstinroom, (struct permonst *,int)); STATIC_DCL void FDECL(move_update, (BOOLEAN_P)); *************** *** 132,147 **** switch(ttmp->ttyp) { case LANDMINE: if (rn2(10)) { ! pline("KAABLAMM!!! %s triggers %s land mine.", ! The(xname(otmp)), ttmp->madeby_u ? "your" : "a"); obj_extract_self(otmp); place_object(otmp, rx, ry); ! deltrap(ttmp); ! del_engr_at(rx,ry); ! scatter(rx,ry, 4, ! MAY_DESTROY|MAY_HIT|MAY_FRACTURE|VIS_EFFECTS, ! (struct obj *)0); if (cansee(rx,ry)) newsym(rx,ry); continue; } --- 133,146 ---- switch(ttmp->ttyp) { case LANDMINE: if (rn2(10)) { ! pline("KAABLAMM!!! %s %s land mine.", ! Tobjnam(otmp, "trigger"), ttmp->madeby_u ? "your" : "a"); obj_extract_self(otmp); place_object(otmp, rx, ry); ! blow_up_landmine(ttmp); ! /* if the boulder remains, it should fill the pit */ ! fill_pit(u.ux, u.uy); if (cansee(rx,ry)) newsym(rx,ry); continue; } *************** *** 160,168 **** continue; case HOLE: case TRAPDOOR: ! pline("%s %s and plugs a %s in the %s!", ! The(xname(otmp)), ! (ttmp->ttyp == TRAPDOOR) ? "triggers" : "falls into", (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole", surface(rx, ry)); deltrap(ttmp); --- 159,173 ---- continue; case HOLE: case TRAPDOOR: ! if (Blind) ! pline("Kerplunk! You no longer feel %s.", ! the(xname(otmp))); ! else ! pline("%s%s and %s a %s in the %s!", ! Tobjnam(otmp, ! (ttmp->ttyp == TRAPDOOR) ? "trigger" : "fall"), ! (ttmp->ttyp == TRAPDOOR) ? nul : " into", ! otense(otmp, "plug"), (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole", surface(rx, ry)); deltrap(ttmp); *************** *** 313,340 **** (void) memset((genericptr_t)&digging, 0, sizeof digging); if (!boulder && IS_ROCK(lev->typ) && !may_dig(x,y)) { ! You("hurt your teeth on the hard stone."); nomul(0); return 1; } else if (digging.pos.x != x || digging.pos.y != y || !on_level(&digging.level, &u.uz)) { digging.down = FALSE; digging.chew = TRUE; digging.pos.x = x; digging.pos.y = y; assign_level(&digging.level, &u.uz); /* solid rock takes more work & time to dig through */ ! digging.effort = (IS_ROCK(lev->typ) ? 30 : 60) + u.udaminc; You("start chewing %s %s.", ! boulder ? "on a" : "a hole in the", ! boulder ? "boulder" : IS_ROCK(lev->typ) ? "rock" : "door"); return 1; } else if ((digging.effort += (30 + u.udaminc)) <= 100) { if (flags.verbose) You("%s chewing on the %s.", digging.chew ? "continue" : "begin", ! boulder ? "boulder" : IS_ROCK(lev->typ) ? "rock" : "door"); digging.chew = TRUE; return 1; } --- 318,353 ---- (void) memset((genericptr_t)&digging, 0, sizeof digging); if (!boulder && IS_ROCK(lev->typ) && !may_dig(x,y)) { ! You("hurt your teeth on the %s.", ! IS_TREE(lev->typ) ? "tree" : "hard stone"); nomul(0); return 1; } else if (digging.pos.x != x || digging.pos.y != y || !on_level(&digging.level, &u.uz)) { digging.down = FALSE; digging.chew = TRUE; + digging.warned = FALSE; digging.pos.x = x; digging.pos.y = y; assign_level(&digging.level, &u.uz); /* solid rock takes more work & time to dig through */ ! digging.effort = ! (IS_ROCK(lev->typ) && !IS_TREE(lev->typ) ? 30 : 60) + u.udaminc; You("start chewing %s %s.", ! (boulder || IS_TREE(lev->typ)) ? "on a" : "a hole in the", ! boulder ? "boulder" : ! IS_TREE(lev->typ) ? "tree" : IS_ROCK(lev->typ) ? "rock" : "door"); ! watch_dig((struct monst *)0, x, y, FALSE); return 1; } else if ((digging.effort += (30 + u.udaminc)) <= 100) { if (flags.verbose) You("%s chewing on the %s.", digging.chew ? "continue" : "begin", ! boulder ? "boulder" : ! IS_TREE(lev->typ) ? "tree" : ! IS_ROCK(lev->typ) ? "rock" : "door"); digging.chew = TRUE; + watch_dig((struct monst *)0, x, y, FALSE); return 1; } *************** *** 434,451 **** register struct obj *obj; if (is_floater(youmonst.data) || (HLevitation & FROMOUTSIDE)) { ! You("wobble unsteadily for a moment."); } else { ! You("crash to the floor!"); ! losehp((rn1(10, 20 - (int)ACURR(A_CON))), ! fell_on_sink, NO_KILLER_PREFIX); ! exercise(A_DEX, FALSE); ! for(obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) ! if(obj->oclass == WEAPON_CLASS) { ! You("fell on %s.",doname(obj)); ! losehp(rnd(3), fell_on_sink, NO_KILLER_PREFIX); ! exercise(A_CON, FALSE); ! } } ELevitation &= ~W_ARTI; --- 447,465 ---- register struct obj *obj; if (is_floater(youmonst.data) || (HLevitation & FROMOUTSIDE)) { ! You("wobble unsteadily for a moment."); } else { ! You("crash to the floor!"); ! losehp(rn1(8, 25 - (int)ACURR(A_CON)), ! fell_on_sink, NO_KILLER_PREFIX); ! exercise(A_DEX, FALSE); ! selftouch("Falling, you"); ! for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) ! if (obj->oclass == WEAPON_CLASS || is_weptool(obj)) { ! You("fell on %s.", doname(obj)); ! losehp(rnd(3), fell_on_sink, NO_KILLER_PREFIX); ! exercise(A_CON, FALSE); ! } } ELevitation &= ~W_ARTI; *************** *** 511,521 **** #endif /* OVL1 */ #ifdef OVL3 void domove() { register struct monst *mtmp; ! register struct rm *tmpr,*ust; register xchar x,y; struct trap *trap; int wtcap; --- 525,729 ---- #endif /* OVL1 */ #ifdef OVL3 + /* return TRUE if (dx,dy) is an OK place to move */ + boolean + test_move(ux, uy, dx, dy, test_only) + int ux, uy, dx, dy; + boolean test_only; + { + int x = ux+dx; + int y = uy+dy; + register struct rm *tmpr = &levl[x][y]; + register struct rm *ust; + + /* + * Check for physical obstacles. First, the place we are going. + */ + if (IS_ROCK(tmpr->typ) || tmpr->typ == IRONBARS) { + if (Blind && !test_only) feel_location(x,y); + if (Passes_walls && may_passwall(x,y)) { + ; /* do nothing */ + } else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { + /* Eat the rock. */ + if (!test_only && still_chewing(x,y)) return FALSE; + } else if (flags.autodig && !flags.run && !flags.nopick && + uwep && is_pick(uwep)) { + /* MRKR: Automatic digging when wielding the appropriate tool */ + if (!test_only) + (void) use_pick_axe2(uwep); + return FALSE; + } else { + if ( !test_only ) { + if (Is_stronghold(&u.uz) && is_db_wall(x,y)) + pline_The("drawbridge is up!"); + if (Passes_walls && !may_passwall(x,y) && In_sokoban(&u.uz)) + pline_The("Sokoban walls resist your ability."); + } + return FALSE; + } + } else if (IS_DOOR(tmpr->typ)) { + if (closed_door(x,y)) { + if (Blind && !test_only) feel_location(x,y); + if (Passes_walls) + ; /* do nothing */ + else if (can_ooze(&youmonst)) { + if ( !test_only ) You("ooze under the door."); + } else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { + /* Eat the door. */ + if (!test_only && still_chewing(x,y)) return FALSE; + } else { + if ( !test_only ) { + if (amorphous(youmonst.data)) + You("try to ooze under the door, but can't squeeze your possessions through."); + else if (x == ux || y == uy) { + if (Blind || Stunned || ACURR(A_DEX) < 10 || Fumbling) { + #ifdef STEED + if (u.usteed) + You_cant("lead %s through that closed door.", + x_monnam(u.usteed, + u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, + (char *)0, SUPPRESS_SADDLE, FALSE)); + else { + #else + pline("Ouch! You bump into a door."); + exercise(A_DEX, FALSE); + #endif + #ifdef STEED + } + #endif + } else pline("That door is closed."); + } + } + return FALSE; + } + } else if (dx && dy && !Passes_walls + && ((tmpr->doormask & ~D_BROKEN) + #ifdef REINCARNATION + || Is_rogue_level(&u.uz) + #endif + || block_door(x,y))) { + /* Diagonal moves into a door are not allowed. */ + if ( Blind && !test_only ) + feel_location(x,y); + return FALSE; + } + } + if (dx && dy + && bad_rock(youmonst.data,ux,y) && bad_rock(youmonst.data,x,uy)) { + /* Move at a diagonal. */ + if (In_sokoban(&u.uz)) { + if ( !test_only ) + You("cannot pass that way."); + return FALSE; + } + if (bigmonst(youmonst.data)) { + if ( !test_only ) + Your("body is too large to fit through."); + return FALSE; + } + if (invent && (inv_weight() + weight_cap() > 600)) { + if ( !test_only ) + You("are carrying too much to get through."); + return FALSE; + } + } + + ust = &levl[ux][uy]; + + /* Now see if other things block our way . . */ + if (dx && dy && !Passes_walls + && (IS_DOOR(ust->typ) && ((ust->doormask & ~D_BROKEN) + #ifdef REINCARNATION + || Is_rogue_level(&u.uz) + #endif + || block_entry(x, y)) + )) { + /* Can't move at a diagonal out of a doorway with door. */ + return FALSE; + } + + if (sobj_at(BOULDER,x,y) && (In_sokoban(&u.uz) || !Passes_walls)) { + if (!(Blind || Hallucination) && (flags.run >= 2)) + return FALSE; + if (!test_only) { + /* tunneling monsters will chew before pushing */ + if (tunnels(youmonst.data) && !needspick(youmonst.data) && + !In_sokoban(&u.uz)) { + if (still_chewing(x,y)) return FALSE; + } else + if (moverock() < 0) return FALSE; + } + /* test_only will assume you'll be able to push it when you get there... */ + } + + /* OK, it is a legal place to move. */ + return TRUE; + } + + static void findtravelpath() + { + if ( u.tx != u.ux || u.ty != u.uy ) { + xchar travel[COLNO][ROWNO]; + xchar travelstepx[2][COLNO*ROWNO]; + xchar travelstepy[2][COLNO*ROWNO]; + int n=1; + int set=0; + int dia=1; + + (void) memset((genericptr_t)travel,0,sizeof(travel)); + + travelstepx[0][0] = u.tx; + travelstepy[0][0] = u.ty; + while ( n ) { + int i; + int nn=0; + for (i=0; i %d,%d by %d,%d\n",u.ux,u.uy,u.tx,u.ty,u.dx,u.dy); + */ + return; + } else { + /*printf("%d %d %d",isok(nx,ny), !travel[nx][ny], ACCESSIBLE(levl[nx][ny].typ));*/ + if ( !travel[nx][ny] ) { + travelstepx[1-set][nn]=nx; + travelstepy[1-set][nn]=ny; + travel[nx][ny]=dia; + nn++; + } + } + } + } + } + n = nn; + set = 1-set; + dia++; + } + + /* give up */ + } + + u.dx = 0; + u.dy = 0; + nomul(0); + } + void domove() { register struct monst *mtmp; ! register struct rm *tmpr; register xchar x,y; struct trap *trap; int wtcap; *************** *** 526,531 **** --- 734,742 ---- u_wipe_engr(rnd(5)); + if ( flags.travel ) + findtravelpath(); + if(((wtcap = near_capacity()) >= OVERLOADED || (wtcap > SLT_ENCUMBER && (Upolyd ? (u.mh < 5 && u.mh != u.mhmax) *************** *** 636,644 **** --- 847,858 ---- * otherwise: * 7.5% chance of getting away. * [strength ought to be a factor] + * If holder is tame and there is no conflict, + * guaranteed escape. */ switch (rn2(!u.ustuck->mcanmove ? 8 : 40)) { case 0: case 1: case 2: + pull_free: You("pull free from %s.", mon_nam(u.ustuck)); u.ustuck = 0; break; *************** *** 650,655 **** --- 864,872 ---- } /*FALLTHRU*/ default: + if (u.ustuck->mtame && + !Conflict && !u.ustuck->mconf) + goto pull_free; You("cannot escape from %s!", mon_nam(u.ustuck)); nomul(0); return; *************** *** 702,708 **** if(mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp)) stumble_onto_mimic(mtmp); ! else if (mtmp->mpeaceful) pline("Pardon me, %s.", m_monnam(mtmp)); else You("move right into %s.", mon_nam(mtmp)); --- 919,925 ---- if(mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp)) stumble_onto_mimic(mtmp); ! else if (mtmp->mpeaceful && !Hallucination) pline("Pardon me, %s.", m_monnam(mtmp)); else You("move right into %s.", mon_nam(mtmp)); *************** *** 735,741 **** if (flags.forcefight || /* remembered an 'I' && didn't use a move command */ (glyph_is_invisible(levl[x][y].glyph) && !flags.nopick)) { ! You("attack %s.", Underwater ? "empty water" : "thin air"); unmap_object(x, y); /* known empty -- remove 'I' if present */ newsym(x, y); nomul(0); --- 952,961 ---- if (flags.forcefight || /* remembered an 'I' && didn't use a move command */ (glyph_is_invisible(levl[x][y].glyph) && !flags.nopick)) { ! char buf[BUFSZ]; ! Sprintf(buf,"a vacant spot on the %s", surface(x,y)); ! You("attack %s.", ! !Underwater ? "thin air" : is_pool(x,y) ? "empty water" : buf); unmap_object(x, y); /* known empty -- remove 'I' if present */ newsym(x, y); nomul(0); *************** *** 748,754 **** /* not attacking an animal, so we try to move */ #ifdef STEED if (u.usteed && !u.usteed->mcanmove && (u.dx || u.dy)) { ! pline("%s won't move!", Monnam(u.usteed)); nomul(0); return; } else --- 968,977 ---- /* not attacking an animal, so we try to move */ #ifdef STEED if (u.usteed && !u.usteed->mcanmove && (u.dx || u.dy)) { ! pline("%s won't move!", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE))); nomul(0); return; } else *************** *** 770,789 **** } else if (!(--u.utrap)) { You("%s to the edge of the pit.", (In_sokoban(&u.uz) && Levitation) ? ! "struggle against the air currents and float" : "crawl"); fill_pit(u.ux, u.uy); vision_full_recalc = 1; /* vision limits change */ ! } else if (flags.verbose) Norep( (Hallucination && !rn2(5)) ? "You've fallen, and you can't get up." : "You are still in a pit." ); } else if (u.utraptype == TT_LAVA) { ! if(flags.verbose) ! Norep("You are stuck in the lava."); if(!is_lava(x,y)) { u.utrap--; if((u.utrap & 0xff) == 0) { ! You("pull yourself to the edge of the lava."); u.utrap = 0; } } --- 993,1044 ---- } else if (!(--u.utrap)) { You("%s to the edge of the pit.", (In_sokoban(&u.uz) && Levitation) ? ! "struggle against the air currents and float" : ! #ifdef STEED ! u.usteed ? "ride" : ! #endif ! "crawl"); fill_pit(u.ux, u.uy); vision_full_recalc = 1; /* vision limits change */ ! } else if (flags.verbose) { ! #ifdef STEED ! if (u.usteed) ! Norep("%s is still in a pit.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE))); ! else ! #endif Norep( (Hallucination && !rn2(5)) ? "You've fallen, and you can't get up." : "You are still in a pit." ); + } } else if (u.utraptype == TT_LAVA) { ! if(flags.verbose) { ! char *predicament = "stuck in the lava"; ! #ifdef STEED ! if (u.usteed) ! Norep("%s is %s.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)), ! predicament); ! else ! #endif ! Norep("You are %s.", predicament); ! } if(!is_lava(x,y)) { u.utrap--; if((u.utrap & 0xff) == 0) { ! #ifdef STEED ! if (u.usteed) ! You("lead %s to the edge of the lava.", ! x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)); ! else ! #endif ! You("pull yourself to the edge of the lava."); u.utrap = 0; } } *************** *** 795,922 **** return; } if(--u.utrap) { ! if(flags.verbose) ! Norep("You are stuck to the web."); ! } else You("disentangle yourself."); } else if (u.utraptype == TT_INFLOOR) { if(--u.utrap) { ! if(flags.verbose) ! Norep("You are stuck in the %s.", ! surface(u.ux, u.uy)); ! } else You("finally wiggle free."); ! } else { ! if(flags.verbose) ! Norep("You are caught in a bear trap."); ! if((u.dx && u.dy) || !rn2(5)) u.utrap--; ! } ! return; ! } ! ! ! /* ! * Check for physical obstacles. First, the place we are going. ! */ ! if (IS_ROCK(tmpr->typ) || tmpr->typ == IRONBARS) { ! if (Blind) feel_location(x,y); ! if (Passes_walls && may_passwall(x,y)) { ! ; /* do nothing */ ! } else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { ! /* Eat the rock. */ ! if (still_chewing(x,y)) return; ! } else { ! if (Is_stronghold(&u.uz) && is_db_wall(x,y)) ! pline_The("drawbridge is up!"); ! flags.move = 0; ! nomul(0); ! return; ! } ! } else if (IS_DOOR(tmpr->typ)) { ! if (closed_door(x,y)) { ! if (Blind) feel_location(x,y); ! if (Passes_walls) ! ; /* do nothing */ ! else if (can_ooze(&youmonst)) ! You("ooze under the door."); ! else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { ! /* Eat the door. */ ! if (still_chewing(x,y)) return; } else { ! flags.move = 0; ! if (amorphous(youmonst.data)) ! You("try to ooze under the door, but can't squeeze your possessions through."); ! else if (x == u.ux || y == u.uy) { ! if (Blind || Stunned || ACURR(A_DEX) < 10 || Fumbling) { ! pline("Ouch! You bump into a door."); ! exercise(A_DEX, FALSE); ! } else pline("That door is closed."); } ! nomul(0); ! return; } - } else if (u.dx && u.dy && !Passes_walls - && ((tmpr->doormask & ~D_BROKEN) - #ifdef REINCARNATION - || Is_rogue_level(&u.uz) - #endif - || block_door(x,y))) { - /* Diagonal moves into a door are not allowed. */ - if (Blind) feel_location(x,y); /* ?? */ - flags.move = 0; - nomul(0); - return; - } - } - if (u.dx && u.dy - && bad_rock(youmonst.data,u.ux,y) && bad_rock(youmonst.data,x,u.uy)) { - /* Move at a diagonal. */ - if (In_sokoban(&u.uz)) { - You("cannot pass that way."); - nomul(0); - return; - } - if (bigmonst(youmonst.data)) { - Your("body is too large to fit through."); - nomul(0); - return; - } - if (invent && (inv_weight() + weight_cap() > 600)) { - You("are carrying too much to get through."); - nomul(0); return; - } } ! ust = &levl[u.ux][u.uy]; ! ! /* Now see if other things block our way . . */ ! if (u.dx && u.dy && !Passes_walls ! && (IS_DOOR(ust->typ) && ((ust->doormask & ~D_BROKEN) ! #ifdef REINCARNATION ! || Is_rogue_level(&u.uz) ! #endif ! || block_entry(x, y)) ! )) { ! /* Can't move at a diagonal out of a doorway with door. */ flags.move = 0; nomul(0); return; } - if (sobj_at(BOULDER,x,y) && (In_sokoban(&u.uz) || !Passes_walls)) { - if (!(Blind || Hallucination) && (flags.run >= 2)) { - nomul(0); - flags.move = 0; - return; - } - /* tunneling monsters will chew before pushing */ - if (tunnels(youmonst.data) && !needspick(youmonst.data)) { - if (still_chewing(x,y)) return; - } else - if (moverock() < 0) return; - } - - /* OK, it is a legal place to move. */ - /* Move ball and chain. */ if (Punished) if (!drag_ball(x,y, &bc_control, &ballx, &bally, &chainx, &chainy, --- 1050,1130 ---- return; } if(--u.utrap) { ! if(flags.verbose) { ! char *predicament = "stuck to the web"; ! #ifdef STEED ! if (u.usteed) ! Norep("%s is %s.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)), ! predicament); ! else ! #endif ! Norep("You are %s.", predicament); ! } ! } else { ! #ifdef STEED ! if (u.usteed) ! pline("%s breaks out of the web.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE))); ! else ! #endif ! You("disentangle yourself."); ! } } else if (u.utraptype == TT_INFLOOR) { if(--u.utrap) { ! if(flags.verbose) { ! char *predicament = "stuck in the"; ! #ifdef STEED ! if (u.usteed) ! Norep("%s is %s %s.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)), ! predicament, surface(u.ux, u.uy)); ! else ! #endif ! Norep("You are %s %s.", predicament, surface(u.ux, u.uy)); ! } ! } else { ! #ifdef STEED ! if (u.usteed) ! pline("%s finally wiggles free.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE))); ! else ! #endif ! You("finally wiggle free."); ! } } else { ! if(flags.verbose) { ! char *predicament = "caught in a bear trap"; ! #ifdef STEED ! if (u.usteed) ! Norep("%s is %s.", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)), ! predicament); ! else ! #endif ! Norep("You are %s.", predicament); } ! if((u.dx && u.dy) || !rn2(5)) u.utrap--; } return; } ! if ( !test_move( u.ux, u.uy, x-u.ux, y-u.uy, 0 ) ) { flags.move = 0; nomul(0); return; } /* Move ball and chain. */ if (Punished) if (!drag_ball(x,y, &bc_control, &ballx, &bally, &chainx, &chainy, *************** *** 958,963 **** --- 1166,1172 ---- if (mtmp->mtrapped) { if (!rn2(mtmp->mtame)) { mtmp->mtame = mtmp->mpeaceful = mtmp->msleeping = 0; + if (mtmp->mleashed) m_unleash(mtmp, TRUE); growl(mtmp); } else { yelp(mtmp); *************** *** 974,988 **** /* can't swap places with pet pinned in a pit by a boulder */ u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */ } else { mtmp->mtrapped = 0; remove_monster(x, y); place_monster(mtmp, u.ux0, u.uy0); /* check for displacing it into pools and traps */ ! switch (minwater(mtmp) ? 2 : mintrap(mtmp)) { case 0: You("%s %s.", mtmp->mtame ? "displaced" : "frightened", ! y_monnam(mtmp)); break; case 1: /* trapped */ case 3: /* changed levels */ --- 1183,1201 ---- /* can't swap places with pet pinned in a pit by a boulder */ u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */ } else { + char pnambuf[BUFSZ]; + + /* save its current description in case of polymorph */ + Strcpy(pnambuf, y_monnam(mtmp)); mtmp->mtrapped = 0; remove_monster(x, y); place_monster(mtmp, u.ux0, u.uy0); /* check for displacing it into pools and traps */ ! switch (minliquid(mtmp) ? 2 : mintrap(mtmp)) { case 0: You("%s %s.", mtmp->mtame ? "displaced" : "frightened", ! pnambuf); break; case 1: /* trapped */ case 3: /* changed levels */ *************** *** 999,1004 **** --- 1212,1222 ---- u.ugangr++; adjalign(-15); } + + /* you killed your pet by direct action. + * minliquid and mintrap don't know to do this + */ + u.uconduct.killer++; break; default: pline("that's strange, unknown mintrap result!"); *************** *** 1009,1014 **** --- 1227,1233 ---- reset_occupations(); if (flags.run) { + if ( flags.run < 8 ) if (IS_DOOR(tmpr->typ) || IS_ROCK(tmpr->typ) || IS_FURNITURE(tmpr->typ)) nomul(0); *************** *** 1111,1120 **** stillinwater:; if (!Levitation && !u.ustuck && !Flying) { /* limit recursive calls through teleds() */ ! if(is_lava(u.ux,u.uy) && lava_effects()) ! return; ! if(is_pool(u.ux,u.uy) && !Wwalking && drown()) return; } check_special_room(FALSE); #ifdef SINKS --- 1330,1352 ---- stillinwater:; if (!Levitation && !u.ustuck && !Flying) { /* limit recursive calls through teleds() */ ! if (is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) { ! #ifdef STEED ! if (u.usteed && !is_flyer(u.usteed->data) && ! !is_floater(u.usteed->data) && ! !is_clinger(u.usteed->data)) { ! dismount_steed(Underwater ? ! DISMOUNT_FELL : DISMOUNT_GENERIC); ! /* dismount_steed() -> float_down() -> pickup() */ ! if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz)) ! pick = FALSE; ! } else ! #endif ! if (is_lava(u.ux, u.uy)) { ! if (lava_effects()) return; ! } else if (!Wwalking && drown()) return; + } } check_special_room(FALSE); #ifdef SINKS *************** *** 1123,1130 **** #endif if (pick && !in_steed_dismounting) (void) pickup(1); ! if ((trap = t_at(u.ux,u.uy)) != 0) ! dotrap(trap); /* fall into pit, arrow trap, etc. */ if((mtmp = m_at(u.ux, u.uy)) && !u.uswallow) { mtmp->mundetected = mtmp->msleeping = 0; switch(mtmp->data->mlet) { --- 1355,1363 ---- #endif if (pick && !in_steed_dismounting) (void) pickup(1); ! /* if dismounting, we'll check again later */ ! if ((trap = t_at(u.ux,u.uy)) != 0 && !in_steed_dismounting) ! dotrap(trap, 0); /* fall into pit, arrow trap, etc. */ if((mtmp = m_at(u.ux, u.uy)) && !u.uswallow) { mtmp->mundetected = mtmp->msleeping = 0; switch(mtmp->data->mlet) { *************** *** 1416,1421 **** --- 1649,1655 ---- multi = 0; /* always reset */ /* uswallow case added by GAN 01/29/87 */ if(u.uswallow) { + if (!u.ustuck->minvent) { if (is_animal(u.ustuck->data)) { You("pick up %s tongue.", s_suffix(mon_nam(u.ustuck))); pline("But it's kind of slimy, so you drop it."); *************** *** 1423,1428 **** --- 1657,1666 ---- You("don't %s anything in here to pick up.", Blind ? "feel" : "see"); return(1); + } else { + int tmpcount = -count; + return loot_mon(u.ustuck, &tmpcount, (boolean *)0); + } } if(is_pool(u.ux, u.uy)) { if (Wwalking || is_floater(youmonst.data) || is_clinger(youmonst.data) *************** *** 1476,1491 **** register struct monst *mtmp; register struct trap *trap; ! /* Grid bugs stop if trying to move diagonal, even if blind. Maybe */ ! /* they polymorphed while in the middle of a long move. */ ! if (u.umonnum == PM_GRID_BUG && u.dx && u.dy) { ! nomul(0); ! return; ! } ! if(Blind || flags.run == 0) return; ! for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) { ! if(!isok(x,y)) continue; if(u.umonnum == PM_GRID_BUG && x != u.ux && y != u.uy) continue; --- 1714,1729 ---- register struct monst *mtmp; register struct trap *trap; ! /* Grid bugs stop if trying to move diagonal, even if blind. Maybe */ ! /* they polymorphed while in the middle of a long move. */ ! if (u.umonnum == PM_GRID_BUG && u.dx && u.dy) { ! nomul(0); ! return; ! } ! if(Blind || flags.run == 0) return; ! for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) { ! if(!isok(x,y)) continue; if(u.umonnum == PM_GRID_BUG && x != u.ux && y != u.uy) continue; *************** *** 1513,1519 **** } else if (levl[x][y].typ == CORR) { bcorr: if(levl[u.ux][u.uy].typ != ROOM) { ! if(flags.run == 1 || flags.run == 3) { i = dist2(x,y,u.ux+u.dx,u.uy+u.dy); if(i > 2) continue; if(corrct == 1 && dist2(x,y,x0,y0) != 1) --- 1751,1757 ---- } else if (levl[x][y].typ == CORR) { bcorr: if(levl[u.ux][u.uy].typ != ROOM) { ! if(flags.run == 1 || flags.run == 3 || flags.run == 8) { i = dist2(x,y,u.ux+u.dx,u.uy+u.dy); if(i > 2) continue; if(corrct == 1 && dist2(x,y,x0,y0) != 1) *************** *** 1546,1551 **** --- 1784,1790 ---- continue; } else { /* e.g. objects or trap or stairs */ if(flags.run == 1) goto bcorr; + if(flags.run == 8) continue; if(mtmp) continue; /* d */ if(((x == u.ux - u.dx) && (y != u.uy + u.dy)) || ((y == u.uy - u.dy) && (x != u.ux + u.dx))) *************** *** 1557,1564 **** } /* end for loops */ if(corrct > 1 && flags.run == 2) goto stop; ! if((flags.run == 1 || flags.run == 3) && !noturn && !m0 && i0 && ! (corrct == 1 || (corrct == 2 && i0 == 1))) { /* make sure that we do not turn too far */ if(i0 == 2) { if(u.dx == y0-u.uy && u.dy == u.ux-x0) --- 1796,1804 ---- } /* end for loops */ if(corrct > 1 && flags.run == 2) goto stop; ! if((flags.run == 1 || flags.run == 3 || flags.run == 8) && ! !noturn && !m0 && i0 && (corrct == 1 || (corrct == 2 && i0 == 1))) ! { /* make sure that we do not turn too far */ if(i0 == 2) { if(u.dx == y0-u.uy && u.dy == u.ux-x0) *************** *** 1621,1627 **** u.uinvulnerable = FALSE; /* Kludge to avoid ctrl-C bug -dlc */ u.usleep = 0; multi = nval; ! flags.mv = flags.run = 0; } /* called when a non-movement, multi-turn action has completed */ --- 1861,1867 ---- u.uinvulnerable = FALSE; /* Kludge to avoid ctrl-C bug -dlc */ u.usleep = 0; multi = nval; ! flags.travel = flags.mv = flags.run = 0; } /* called when a non-movement, multi-turn action has completed */ *************** *** 1641,1647 **** #endif /* OVL2 */ #ifdef OVL1 ! static void maybe_wail() { static short powers[] = { TELEPORT, SEE_INVIS, POISON_RES, COLD_RES, --- 1881,1887 ---- #endif /* OVL2 */ #ifdef OVL1 ! STATIC_OVL void maybe_wail() { static short powers[] = { TELEPORT, SEE_INVIS, POISON_RES, COLD_RES, *************** *** 1745,1761 **** inv_weight() { register struct obj *otmp = invent; ! register int wt; /* when putting stuff into containers, gold is inserted at the head of invent for easier manipulation by askchain & co, but it's also retained in u.ugold in order to keep the status line accurate; we mustn't add its weight in twice under that circumstance */ wt = (otmp && otmp->oclass == GOLD_CLASS) ? 0 : (int)((u.ugold + 50L) / 100L); ! while (otmp) { if (otmp->otyp != BOULDER || !throws_rocks(youmonst.data)) wt += otmp->owt; otmp = otmp->nobj; } --- 1985,2008 ---- inv_weight() { register struct obj *otmp = invent; ! register int wt = 0; + #ifndef GOLDOBJ /* when putting stuff into containers, gold is inserted at the head of invent for easier manipulation by askchain & co, but it's also retained in u.ugold in order to keep the status line accurate; we mustn't add its weight in twice under that circumstance */ wt = (otmp && otmp->oclass == GOLD_CLASS) ? 0 : (int)((u.ugold + 50L) / 100L); ! #endif while (otmp) { + #ifndef GOLDOBJ if (otmp->otyp != BOULDER || !throws_rocks(youmonst.data)) + #else + if (otmp->oclass == GOLD_CLASS) + wt += (int)(((long)otmp->quan + 50L) / 100L); + else if (otmp->otyp != BOULDER || !throws_rocks(youmonst.data)) + #endif wt += otmp->owt; otmp = otmp->nobj; } *************** *** 1823,1828 **** --- 2070,2091 ---- return(ct); } + #ifdef GOLDOBJ + /* Counts the money in an object chain. */ + /* Intended use is for your or some monsters inventory, */ + /* now that u.gold/m.gold is gone.*/ + /* Counting money in a container might be possible too. */ + long money_cnt(otmp) + struct obj *otmp; + { + while(otmp) { + /* Must change when silver & copper is implemented: */ + if (otmp->oclass == GOLD_CLASS) return otmp->quan; + otmp = otmp->nobj; + } + return 0; + } + #endif #endif /* OVLB */ /*hack.c*/ *** nethack-3.3.1/src/hacklib.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/hacklib.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)hacklib.c 3.3 99/04/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Robert Patrick Rankin, 1991 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)hacklib.c 3.4 1999/04/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Robert Patrick Rankin, 1991 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 15,20 **** --- 15,21 ---- char highc (char) char lowc (char) char * lcase (char *) + char * upstart (char *) char * mungspaces (char *) char * eos (char *) char * s_suffix (const char *) *************** *** 92,97 **** --- 93,106 ---- return s; } + char * + upstart(s) /* convert first character of a string to uppercase */ + char *s; + { + if (s) *s = highc(*s); + return s; + } + /* remove excess whitespace from a string buffer (in place) */ char * mungspaces(bp) *************** *** 429,435 **** * - determination of what files are "very old" */ ! #if defined(AMIGA) && !defined(AZTEC_C) && !defined(__SASC_60) && !defined(_DCC) extern struct tm *FDECL(localtime,(time_t *)); #endif static struct tm *NDECL(getlt); --- 438,444 ---- * - determination of what files are "very old" */ ! #if defined(AMIGA) && !defined(AZTEC_C) && !defined(__SASC_60) && !defined(_DCC) && !defined(__GNUC__) extern struct tm *FDECL(localtime,(time_t *)); #endif static struct tm *NDECL(getlt); *************** *** 443,449 **** #ifdef RANDOM /* srandom() from sys/share/random.c */ srandom((unsigned int) time((time_t *)0)); #else ! # if defined(BSD) || defined(ULTRIX) || defined(CYGWIN32) /* system srandom() */ # ifdef BSD # if defined(SUNOS4) (void) --- 452,458 ---- #ifdef RANDOM /* srandom() from sys/share/random.c */ srandom((unsigned int) time((time_t *)0)); #else ! # if defined(__APPLE__) || defined(BSD) || defined(ULTRIX) || defined(CYGWIN32) /* system srandom() */ # ifdef BSD # if defined(SUNOS4) (void) *** nethack-3.3.1/src/invent.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/invent.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)invent.c 3.3 2000/04/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)invent.c 3.4 2002/02/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 16,28 **** STATIC_DCL boolean FDECL(only_here, (struct obj *)); #endif /* OVL1 */ STATIC_DCL void FDECL(compactify,(char *)); STATIC_PTR int FDECL(ckunpaid,(struct obj *)); #ifdef OVLB STATIC_DCL boolean FDECL(this_type_only, (struct obj *)); STATIC_DCL void NDECL(dounpaid); STATIC_DCL struct obj *FDECL(find_unpaid,(struct obj *,struct obj **)); STATIC_DCL void FDECL(menu_identify, (int)); ! static boolean FDECL(tool_in_use, (struct obj *)); #endif /* OVLB */ STATIC_DCL char FDECL(obj_to_let,(struct obj *)); --- 16,32 ---- STATIC_DCL boolean FDECL(only_here, (struct obj *)); #endif /* OVL1 */ STATIC_DCL void FDECL(compactify,(char *)); + STATIC_DCL boolean FDECL(taking_off, (const char *)); + STATIC_DCL boolean FDECL(putting_on, (const char *)); STATIC_PTR int FDECL(ckunpaid,(struct obj *)); + STATIC_PTR int FDECL(ckvalidcat,(struct obj *)); + static char FDECL(display_pickinv, (const char *,BOOLEAN_P, long *)); #ifdef OVLB STATIC_DCL boolean FDECL(this_type_only, (struct obj *)); STATIC_DCL void NDECL(dounpaid); STATIC_DCL struct obj *FDECL(find_unpaid,(struct obj *,struct obj **)); STATIC_DCL void FDECL(menu_identify, (int)); ! STATIC_DCL boolean FDECL(tool_in_use, (struct obj *)); #endif /* OVLB */ STATIC_DCL char FDECL(obj_to_let,(struct obj *)); *************** *** 49,54 **** --- 53,66 ---- register int i; register struct obj *obj; + #ifdef GOLDOBJ + /* There is only one of these in inventory... */ + if (otmp->oclass == GOLD_CLASS) { + otmp->invlet = GOLD_SYM; + return; + } + #endif + for(i = 0; i < 52; i++) inuse[i] = FALSE; for(obj = invent; obj; obj = obj->nobj) if(obj != otmp) { i = obj->invlet; *************** *** 164,170 **** / (otmp->quan + obj->quan); otmp->quan += obj->quan; ! otmp->owt += obj->owt; if(!otmp->onamelth && obj->onamelth) otmp = *potmp = oname(otmp, ONAME(obj)); obj_extract_self(obj); --- 176,186 ---- / (otmp->quan + obj->quan); otmp->quan += obj->quan; ! #ifdef GOLDOBJ ! /* temporary special case for gold objects!!!! */ ! #endif ! if (otmp->oclass == GOLD_CLASS) otmp->owt = weight(otmp); ! else otmp->owt += obj->owt; if(!otmp->onamelth && obj->onamelth) otmp = *potmp = oname(otmp, ONAME(obj)); obj_extract_self(obj); *************** *** 174,194 **** if (obj->timed) obj_stop_timers(obj); /* follows lights */ /* fixup for `#adjust' merging wielded darts, daggers, &c */ ! if (obj->owornmask) { ! otmp->owornmask |= obj->owornmask; ! /* (it isn't necessary to "unwear" `obj' first) */ ! if (carried(otmp)) ! setworn(otmp, otmp->owornmask); #if 0 ! /* (this should never be necessary, since items ! already in a monster's inventory don't ever get ! merged into other objects [only vice versa]) */ ! else if (mcarried(otmp)) { ! if (obj == MON_WEP(otmp->ocarry)) ! MON_WEP(otmp->ocarry) = otmp; ! } ! #endif } obfree(obj,otmp); /* free(obj), bill->otmp */ return(1); } --- 190,229 ---- if (obj->timed) obj_stop_timers(obj); /* follows lights */ /* fixup for `#adjust' merging wielded darts, daggers, &c */ ! if (obj->owornmask && carried(otmp)) { ! long wmask = otmp->owornmask | obj->owornmask; ! ! /* Both the items might be worn in competing slots; ! merger preference (regardless of which is which): ! primary weapon + alternate weapon -> primary weapon; ! primary weapon + quiver -> primary weapon; ! alternate weapon + quiver -> alternate weapon. ! (Prior to 3.3.0, it was not possible for the two ! stacks to be worn in different slots and `obj' ! didn't need to be unworn when merging.) */ ! if (wmask & W_WEP) wmask = W_WEP; ! else if (wmask & W_SWAPWEP) wmask = W_SWAPWEP; ! else if (wmask & W_QUIVER) wmask = W_QUIVER; ! else { ! impossible("merging strangely worn items (%lx)", wmask); ! wmask = otmp->owornmask; ! } ! if ((otmp->owornmask & ~wmask) != 0L) setnotworn(otmp); ! setworn(otmp, wmask); ! setnotworn(obj); ! } #if 0 ! /* (this should not be necessary, since items ! already in a monster's inventory don't ever get ! merged into other objects [only vice versa]) */ ! else if (obj->owornmask && mcarried(otmp)) { ! if (obj == MON_WEP(otmp->ocarry)) { ! MON_WEP(otmp->ocarry) = otmp; ! otmp->owornmask = W_WEP; ! } } + #endif /*0*/ + obfree(obj,otmp); /* free(obj), bill->otmp */ return(1); } *************** *** 211,218 **** --- 246,256 ---- struct obj *obj; { if (obj->oclass == GOLD_CLASS) { + #ifndef GOLDOBJ u.ugold += obj->quan; + #else flags.botl = 1; + #endif } else if (obj->otyp == AMULET_OF_YENDOR) { if (u.uhave.amulet) impossible("already have amulet?"); u.uhave.amulet = 1; *************** *** 269,279 **** --- 307,320 ---- if (obj->where != OBJ_FREE) panic("addinv: obj not free"); + obj->no_charge = 0; /* not meaningful for invent */ addinv_core1(obj); + #ifndef GOLDOBJ /* if handed gold, we're done */ if (obj->oclass == GOLD_CLASS) return obj; + #endif /* merge if possible; find end of chain in the process */ for (prev = 0, otmp = invent; otmp; prev = otmp, otmp = otmp->nobj) *************** *** 360,369 **** if (drop_fmt) pline(drop_fmt, drop_arg); /* undo any merge which took place */ if (obj->quan > oquan) { ! struct obj *otmp = splitobj(obj, oquan); ! /* might have merged with weapon */ ! if (obj->owornmask) ! setworn(otmp, obj->owornmask); } dropx(obj); } else { --- 401,407 ---- if (drop_fmt) pline(drop_fmt, drop_arg); /* undo any merge which took place */ if (obj->quan > oquan) { ! obj = splitobj(obj, oquan); } dropx(obj); } else { *************** *** 418,424 **** --- 456,464 ---- struct obj *obj; { if (obj->oclass == GOLD_CLASS) { + #ifndef GOLDOBJ u.ugold -= obj->quan; + #endif flags.botl = 1; return; } else if (obj->otyp == AMULET_OF_YENDOR) { *************** *** 537,542 **** --- 577,590 ---- return((struct obj *) 0); } + const char * + currency(amount) + long amount; + { + if (amount == 1L) return "zorkmid"; + else return "zorkmids"; + } + boolean have_lizard() { *************** *** 593,599 **** #endif /* OVL2 */ #ifdef OVLB ! /* Make a gold object from the hero's gold. */ struct obj * mkgoldobj(q) --- 641,647 ---- #endif /* OVL2 */ #ifdef OVLB ! #ifndef GOLDOBJ /* Make a gold object from the hero's gold. */ struct obj * mkgoldobj(q) *************** *** 608,614 **** flags.botl = 1; return(otmp); } ! #endif /* OVLB */ #ifdef OVL1 --- 656,662 ---- flags.botl = 1; return(otmp); } ! #endif #endif /* OVLB */ #ifdef OVL1 *************** *** 642,652 **** --- 690,720 ---- } } + /* match the prompt for either 'T' or 'R' command */ + STATIC_OVL boolean + taking_off(action) + const char *action; + { + return !strcmp(action, "take off") || !strcmp(action, "remove"); + } + + /* match the prompt for either 'W' or 'P' command */ + STATIC_OVL boolean + putting_on(action) + const char *action; + { + return !strcmp(action, "wear") || !strcmp(action, "put on"); + } + /* * getobj returns: * struct obj *xxx: object to do something with. * (struct obj *) 0 error return: no object. * &zeroobj explicitly no object (as in w-). + #ifdef GOLDOBJ + !!!! test if gold can be used in unusual ways (eaten etc.) + !!!! may be able to remove "usegold" + #endif */ struct obj * getobj(let,word) *************** *** 659,668 **** register int foo = 0; register char *bp = buf; xchar allowcnt = 0; /* 0, 1 or 2 */ ! boolean allowgold = FALSE, usegold = FALSE; ! /* Two possibilities: they can't use gold because it's illegal, ! * or they can't use gold because they don't have any. ! */ boolean allowall = FALSE; boolean allownone = FALSE; xchar foox = 0; --- 727,736 ---- register int foo = 0; register char *bp = buf; xchar allowcnt = 0; /* 0, 1 or 2 */ ! #ifndef GOLDOBJ ! boolean allowgold = FALSE; /* can't use gold because they don't have any */ ! #endif ! boolean usegold = FALSE; /* can't use gold because its illegal */ boolean allowall = FALSE; boolean allownone = FALSE; xchar foox = 0; *************** *** 671,682 **** --- 739,758 ---- long dummymask; if(*let == ALLOW_COUNT) let++, allowcnt = 1; + #ifndef GOLDOBJ if(*let == GOLD_CLASS) let++, usegold = TRUE, allowgold = (u.ugold ? TRUE : FALSE); + #else + if(*let == GOLD_CLASS) let++, usegold = TRUE; + #endif /* Equivalent of an "ugly check" for gold */ if (usegold && !strcmp(word, "eat") && !metallivorous(youmonst.data)) + #ifndef GOLDOBJ usegold = allowgold = FALSE; + #else + usegold = FALSE; + #endif if(*let == ALL_CLASSES) let++, allowall = TRUE; if(*let == ALLOW_NONE) let++, allownone = TRUE; *************** *** 689,714 **** if(allowall && !strcmp(word, "read")) allowall = FALSE; if(allownone) *bp++ = '-'; if(allowgold) *bp++ = def_oc_syms[GOLD_CLASS]; if(bp > buf && bp[-1] == '-') *bp++ = ' '; ap = altlets; ilet = 'a'; for (otmp = invent; otmp; otmp = otmp->nobj) { ! if (!flags.invlet_constant) otmp->invlet = ilet; /* reassign() */ ! if (!*let || index(let, otmp->oclass)) { register int otyp = otmp->otyp; bp[foo++] = otmp->invlet; /* ugly check: remove inappropriate things */ ! if((!strcmp(word, "take off") && (!(otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) || (otmp==uarm && uarmc) #ifdef TOURIST || (otmp==uarmu && (uarm || uarmc)) #endif )) ! || (!strcmp(word, "wear") && (otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))) /* already worn */ || (!strcmp(word, "wield") && --- 765,800 ---- if(allowall && !strcmp(word, "read")) allowall = FALSE; if(allownone) *bp++ = '-'; + #ifndef GOLDOBJ if(allowgold) *bp++ = def_oc_syms[GOLD_CLASS]; + #endif if(bp > buf && bp[-1] == '-') *bp++ = ' '; ap = altlets; ilet = 'a'; for (otmp = invent; otmp; otmp = otmp->nobj) { ! if (!flags.invlet_constant) ! #ifdef GOLDOBJ ! if (otmp->invlet != GOLD_SYM) /* don't reassign this */ ! #endif ! otmp->invlet = ilet; /* reassign() */ ! if (!*let || index(let, otmp->oclass) ! #ifdef GOLDOBJ ! || (usegold && otmp->invlet == GOLD_SYM) ! #endif ! ) { register int otyp = otmp->otyp; bp[foo++] = otmp->invlet; /* ugly check: remove inappropriate things */ ! if ((taking_off(word) && (!(otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) || (otmp==uarm && uarmc) #ifdef TOURIST || (otmp==uarmu && (uarm || uarmc)) #endif )) ! || (putting_on(word) && (otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))) /* already worn */ || (!strcmp(word, "wield") && *************** *** 723,729 **** /* Second ugly check; unlike the first it won't trigger an * "else" in "you don't have anything else to ___". */ ! else if ((!strcmp(word, "wear") && ((otmp->oclass == FOOD_CLASS && otmp->otyp != MEAT_RING) || (otmp->oclass == TOOL_CLASS && otyp != BLINDFOLD && otyp != TOWEL && otyp != LENSES))) --- 809,815 ---- /* Second ugly check; unlike the first it won't trigger an * "else" in "you don't have anything else to ___". */ ! else if ((putting_on(word) && ((otmp->oclass == FOOD_CLASS && otmp->otyp != MEAT_RING) || (otmp->oclass == TOOL_CLASS && otyp != BLINDFOLD && otyp != TOWEL && otyp != LENSES))) *************** *** 739,747 **** || (!strcmp(word, "tin") && (otyp != CORPSE || !tinnable(otmp))) || (!strcmp(word, "rub") && ! (otmp->oclass == TOOL_CLASS && ! otyp != OIL_LAMP && otyp != MAGIC_LAMP && ! otyp != BRASS_LANTERN)) || ((!strcmp(word, "use or apply") || !strcmp(word, "untrap with")) && /* Picks, axes, pole-weapons, bullwhips */ --- 825,834 ---- || (!strcmp(word, "tin") && (otyp != CORPSE || !tinnable(otmp))) || (!strcmp(word, "rub") && ! ((otmp->oclass == TOOL_CLASS && ! otyp != OIL_LAMP && otyp != MAGIC_LAMP && ! otyp != BRASS_LANTERN) || ! (otmp->oclass == GEM_CLASS && !is_graystone(otmp)))) || ((!strcmp(word, "use or apply") || !strcmp(word, "untrap with")) && /* Picks, axes, pole-weapons, bullwhips */ *************** *** 751,757 **** /* only applicable potion is oil, and it will only be offered as a choice when already discovered */ (otyp != POT_OIL || !otmp->dknown || ! !objects[POT_OIL].oc_name_known)))) || (!strcmp(word, "invoke") && (!otmp->oartifact && !objects[otyp].oc_unique && (otyp != FAKE_AMULET_OF_YENDOR || otmp->known) && --- 838,845 ---- /* only applicable potion is oil, and it will only be offered as a choice when already discovered */ (otyp != POT_OIL || !otmp->dknown || ! !objects[POT_OIL].oc_name_known)) ! || (otmp->oclass == GEM_CLASS && !is_graystone(otmp)))) || (!strcmp(word, "invoke") && (!otmp->oartifact && !objects[otyp].oc_unique && (otyp != FAKE_AMULET_OF_YENDOR || otmp->known) && *************** *** 767,773 **** ) foo--; /* ugly check for unworn armor that can't be worn */ ! else if (!strcmp(word, "wear") && *let == ARMOR_CLASS && !canwearobj(otmp, &dummymask, FALSE)) { foo--; allowall = TRUE; --- 855,861 ---- ) foo--; /* ugly check for unworn armor that can't be worn */ ! else if (putting_on(word) && *let == ARMOR_CLASS && !canwearobj(otmp, &dummymask, FALSE)) { foo--; allowall = TRUE; *************** *** 794,800 **** --- 882,892 ---- compactify(bp); *ap = '\0'; + #ifndef GOLDOBJ if(!foo && !allowall && !allowgold && !allownone) { + #else + if(!foo && !allowall && !allownone) { + #endif You("don't have anything %sto %s.", foox ? "else " : "", word); return((struct obj *)0); *************** *** 836,848 **** return(allownone ? &zeroobj : (struct obj *) 0); } if(ilet == def_oc_syms[GOLD_CLASS]) { ! if(!usegold){ ! You("cannot %s gold.", word); ! return(struct obj *)0; } else if (!allowgold) { You("are not carrying any gold."); return(struct obj *)0; ! } if(cnt == 0 && prezero) return((struct obj *)0); /* Historic note: early Nethack had a bug which was * first reported for Larn, where trying to drop 2^32-n --- 928,942 ---- return(allownone ? &zeroobj : (struct obj *) 0); } if(ilet == def_oc_syms[GOLD_CLASS]) { ! if (!usegold) { ! You("cannot %s gold.", word); ! return(struct obj *)0; ! #ifndef GOLDOBJ } else if (!allowgold) { You("are not carrying any gold."); return(struct obj *)0; ! #endif ! } if(cnt == 0 && prezero) return((struct obj *)0); /* Historic note: early Nethack had a bug which was * first reported for Larn, where trying to drop 2^32-n *************** *** 855,882 **** return(struct obj *)0; } if(!(allowcnt == 2 && cnt < u.ugold)) cnt = u.ugold; return(mkgoldobj(cnt)); ! } ! if(allowcnt == 2 && !strcmp(word,"throw")) { ! /* permit counts for throwing gold, but don't accept ! * counts for other things since the throw code will ! * split off a single item anyway */ ! allowcnt = 1; ! if(cnt == 0 && prezero) return((struct obj *)0); ! if(cnt > 1) { ! You("can only throw one item at a time."); ! continue; ! } } if(ilet == '?' || ilet == '*') { char *allowed_choices = (ilet == '?') ? lets : (char *)0; if (ilet == '?' && !*lets && *altlets) allowed_choices = altlets; ! ilet = display_inventory(allowed_choices, TRUE); if(!ilet) continue; if(ilet == '\033') { if(flags.verbose) pline(Never_mind); --- 949,974 ---- return(struct obj *)0; } + #ifndef GOLDOBJ if(!(allowcnt == 2 && cnt < u.ugold)) cnt = u.ugold; return(mkgoldobj(cnt)); ! #endif } if(ilet == '?' || ilet == '*') { char *allowed_choices = (ilet == '?') ? lets : (char *)0; + long ctmp = 0; if (ilet == '?' && !*lets && *altlets) allowed_choices = altlets; ! ilet = display_pickinv(allowed_choices, TRUE, ! allowcnt ? &ctmp : (long *)0); if(!ilet) continue; + if (allowcnt && ctmp >= 0) { + cnt = ctmp; + if (!cnt) prezero = TRUE; + allowcnt = 2; + } if(ilet == '\033') { if(flags.verbose) pline(Never_mind); *************** *** 884,889 **** --- 976,998 ---- } /* they typed a letter (not a space) at the prompt */ } + if(allowcnt == 2 && !strcmp(word,"throw")) { + /* permit counts for throwing gold, but don't accept + * counts for other things since the throw code will + * split off a single item anyway */ + #ifdef GOLDOBJ + if (ilet != def_oc_syms[GOLD_CLASS]) + #endif + allowcnt = 1; + if(cnt == 0 && prezero) return((struct obj *)0); + if(cnt > 1) { + You("can only throw one item at a time."); + continue; + } + } + #ifdef GOLDOBJ + flags.botl = 1; /* May have changed the amount of money */ + #endif #ifdef REDO savech(ilet); #endif *************** *** 905,929 **** } break; } ! if(!allowall && let && !index(let,otmp->oclass)) { pline(silly_thing_to, word); return((struct obj *)0); } if(allowcnt == 2) { /* cnt given */ ! if(cnt == 0) return (struct obj *)0; ! if(cnt != otmp->quan) { ! register struct obj *obj = splitobj(otmp, cnt); /* Very ugly kludge necessary to prevent someone from trying * to drop one of several loadstones and having the loadstone * now be separate. */ ! if (!strcmp(word, "drop") && ! obj->otyp == LOADSTONE && obj->cursed) ! otmp->corpsenm = obj->invlet; ! if(otmp == uwep) setuwep(obj); ! else if (otmp == uquiver) setuqwep(obj); ! if (otmp == uswapwep) setuswapwep(obj); ! } } return(otmp); } --- 1014,1039 ---- } break; } ! if(!allowall && let && !index(let,otmp->oclass) ! #ifdef GOLDOBJ ! && !(usegold && otmp->oclass == GOLD_CLASS) ! #endif ! ) { pline(silly_thing_to, word); return((struct obj *)0); } if(allowcnt == 2) { /* cnt given */ ! if(cnt == 0) return (struct obj *)0; ! if(cnt != otmp->quan) { ! otmp = splitobj(otmp, cnt); /* Very ugly kludge necessary to prevent someone from trying * to drop one of several loadstones and having the loadstone * now be separate. */ ! if (!strcmp(word, "drop") && ! otmp->otyp == LOADSTONE && otmp->cursed) ! otmp->corpsenm = otmp->invlet; ! } } return(otmp); } *************** *** 932,937 **** --- 1042,1055 ---- #ifdef OVLB STATIC_PTR int + ckvalidcat(otmp) + register struct obj *otmp; + { + /* use allow_category() from pickup.c */ + return((int)allow_category(otmp)); + } + + STATIC_PTR int ckunpaid(otmp) register struct obj *otmp; { *************** *** 966,991 **** /* Takeoff (A). Return the number of times fn was called successfully */ /* If combo is TRUE, we just use this to get a category list */ int ! ggetobj(word, fn, mx, combo) const char *word; int FDECL((*fn),(OBJ_P)), mx; boolean combo; /* combination menu flag */ { int FDECL((*ckfn),(OBJ_P)) = (int FDECL((*),(OBJ_P))) 0; boolean FDECL((*filter),(OBJ_P)) = (boolean FDECL((*),(OBJ_P))) 0; boolean takeoff, ident, allflag, m_seen; int oletct, iletct, allowgold, unpaid, oc_of_sym; char sym, *ip, olets[MAXOCLASSES+5], ilets[MAXOCLASSES+5]; char buf[BUFSZ], qbuf[QBUFSZ]; allowgold = (u.ugold && !strcmp(word, "drop")) ? 1 : 0; takeoff = ident = allflag = m_seen = FALSE; if(!invent && !allowgold){ You("have nothing to %s.", word); return(0); } ! if (combo) add_valid_menu_class(0); /* reset */ ! if (!strcmp(word, "take off")) { takeoff = TRUE; filter = is_worn; } else if (!strcmp(word, "identify")) { --- 1084,1121 ---- /* Takeoff (A). Return the number of times fn was called successfully */ /* If combo is TRUE, we just use this to get a category list */ int ! ggetobj(word, fn, mx, combo, resultflags) const char *word; int FDECL((*fn),(OBJ_P)), mx; boolean combo; /* combination menu flag */ + unsigned *resultflags; { int FDECL((*ckfn),(OBJ_P)) = (int FDECL((*),(OBJ_P))) 0; boolean FDECL((*filter),(OBJ_P)) = (boolean FDECL((*),(OBJ_P))) 0; boolean takeoff, ident, allflag, m_seen; + #ifndef GOLDOBJ int oletct, iletct, allowgold, unpaid, oc_of_sym; + #else + int oletct, iletct, unpaid, oc_of_sym; + #endif char sym, *ip, olets[MAXOCLASSES+5], ilets[MAXOCLASSES+5]; char buf[BUFSZ], qbuf[QBUFSZ]; + if (resultflags) *resultflags = 0; + #ifndef GOLDOBJ allowgold = (u.ugold && !strcmp(word, "drop")) ? 1 : 0; + #endif takeoff = ident = allflag = m_seen = FALSE; + #ifndef GOLDOBJ if(!invent && !allowgold){ + #else + if(!invent){ + #endif You("have nothing to %s.", word); return(0); } ! add_valid_menu_class(0); /* reset */ ! if (taking_off(word)) { takeoff = TRUE; filter = is_worn; } else if (!strcmp(word, "identify")) { *************** *** 994,1000 **** } iletct = collect_obj_classes(ilets, invent, ! FALSE, (allowgold != 0), filter); unpaid = count_unpaid(invent); if (ident && !iletct) { --- 1124,1134 ---- } iletct = collect_obj_classes(ilets, invent, ! FALSE, ! #ifndef GOLDOBJ ! (allowgold != 0), ! #endif ! filter); unpaid = count_unpaid(invent); if (ident && !iletct) { *************** *** 1002,1007 **** --- 1136,1145 ---- } else if (!takeoff && (unpaid || invent)) { ilets[iletct++] = ' '; if (unpaid) ilets[iletct++] = 'u'; + if (count_buc(invent, BUC_BLESSED)) ilets[iletct++] = 'B'; + if (count_buc(invent, BUC_UNCURSED)) ilets[iletct++] = 'U'; + if (count_buc(invent, BUC_CURSED)) ilets[iletct++] = 'C'; + if (count_buc(invent, BUC_UNKNOWN)) ilets[iletct++] = 'X'; if (invent) ilets[iletct++] = 'a'; } else if (takeoff && invent) { ilets[iletct++] = ' '; *************** *** 1051,1068 **** } if (oc_of_sym == GOLD_CLASS && !combo) { if (allowgold == 1) (*fn)(mkgoldobj(u.ugold)); else if (!u.ugold) You("have no gold."); allowgold = 2; } else if (sym == 'a') { allflag = TRUE; } else if (sym == 'A') { /* same as the default */ ; ! } else if (sym == 'u' || sym == 'U') { add_valid_menu_class('u'); ckfn = ckunpaid; } else if (sym == 'm') { m_seen = TRUE; } else if (oc_of_sym == MAXOCLASSES) { --- 1189,1222 ---- } if (oc_of_sym == GOLD_CLASS && !combo) { + #ifndef GOLDOBJ if (allowgold == 1) (*fn)(mkgoldobj(u.ugold)); else if (!u.ugold) You("have no gold."); allowgold = 2; + #else + flags.botl = 1; + #endif } else if (sym == 'a') { allflag = TRUE; } else if (sym == 'A') { /* same as the default */ ; ! } else if (sym == 'u') { add_valid_menu_class('u'); ckfn = ckunpaid; + } else if (sym == 'B') { + add_valid_menu_class('B'); + ckfn = ckvalidcat; + } else if (sym == 'U') { + add_valid_menu_class('U'); + ckfn = ckvalidcat; + } else if (sym == 'C') { + add_valid_menu_class('C'); + ckfn = ckvalidcat; + } else if (sym == 'X') { + add_valid_menu_class('X'); + ckfn = ckvalidcat; } else if (sym == 'm') { m_seen = TRUE; } else if (oc_of_sym == MAXOCLASSES) { *************** *** 1080,1089 **** return (allflag || (!oletct && ckfn != ckunpaid)) ? -2 : -3; else if (flags.menu_style != MENU_TRADITIONAL && combo && !allflag) return 0; else if (allowgold == 2 && !oletct) return 1; /* you dropped gold (or at least tried to) */ ! else ! return askchain(&invent, olets, allflag, fn, ckfn, mx, word); } /* --- 1234,1260 ---- return (allflag || (!oletct && ckfn != ckunpaid)) ? -2 : -3; else if (flags.menu_style != MENU_TRADITIONAL && combo && !allflag) return 0; + #ifndef GOLDOBJ else if (allowgold == 2 && !oletct) return 1; /* you dropped gold (or at least tried to) */ ! else { ! #else ! else /*!!!! if (allowgold == 2 && !oletct) ! !!!! return 1; you dropped gold (or at least tried to) ! !!!! test gold dropping ! else*/ { ! #endif ! int cnt = askchain(&invent, olets, allflag, fn, ckfn, mx, word); ! /* ! * askchain() has already finished the job in this case ! * so set a special flag to convey that back to the caller ! * so that it won't continue processing. ! * Fix for bug C331-1 reported by Irina Rempt-Drijfhout. ! */ ! if (combo && allflag && resultflags) ! *resultflags |= ALL_FINISHED; ! return cnt; ! } } /* *************** *** 1106,1112 **** boolean takeoff, nodot, ident, ininv; char qbuf[QBUFSZ]; ! takeoff = !strcmp(word, "take off"); ident = !strcmp(word, "identify"); nodot = (!strcmp(word, "nodot") || !strcmp(word, "drop") || ident || takeoff); --- 1277,1283 ---- boolean takeoff, nodot, ident, ininv; char qbuf[QBUFSZ]; ! takeoff = taking_off(word); ident = !strcmp(word, "identify"); nodot = (!strcmp(word, "nodot") || !strcmp(word, "drop") || ident || takeoff); *************** *** 1128,1134 **** if (ckfn && !(*ckfn)(otmp)) continue; if (!allflag) { Strcpy(qbuf, !ininv ? doname(otmp) : ! xprname(otmp, (char *)0, ilet, !nodot, 0L)); Strcat(qbuf, "?"); sym = (takeoff || ident || otmp->quan < 2L) ? nyaq(qbuf) : nyNaq(qbuf); --- 1299,1305 ---- if (ckfn && !(*ckfn)(otmp)) continue; if (!allflag) { Strcpy(qbuf, !ininv ? doname(otmp) : ! xprname(otmp, (char *)0, ilet, !nodot, 0L, 0L)); Strcat(qbuf, "?"); sym = (takeoff || ident || otmp->quan < 2L) ? nyaq(qbuf) : nyNaq(qbuf); *************** *** 1148,1160 **** sym = 'y'; if (yn_number < otmp->quan && !welded(otmp) && (!otmp->cursed || otmp->otyp != LOADSTONE)) { ! struct obj *otmpx = splitobj(otmp, yn_number); ! if (!otmpx || otmpx->nobj != otmp2) ! impossible("bad object split in askchain"); ! /* assume other worn items aren't mergable */ ! if (otmp == uwep) setuwep(otmpx); ! if (otmp == uquiver) setuqwep(otmpx); ! if (otmp == uswapwep) setuswapwep(otmpx); } } } --- 1319,1325 ---- sym = 'y'; if (yn_number < otmp->quan && !welded(otmp) && (!otmp->cursed || otmp->otyp != LOADSTONE)) { ! otmp = splitobj(otmp, yn_number); } } } *************** *** 1272,1278 **** n = 0; if (flags.menu_style == MENU_TRADITIONAL) do { ! n = ggetobj("identify", identify, id_limit, FALSE); if (n < 0) break; /* quit or no eligible items */ } while ((id_limit -= n) > 0); if (n == 0 || n < -1) --- 1437,1443 ---- n = 0; if (flags.menu_style == MENU_TRADITIONAL) do { ! n = ggetobj("identify", identify, id_limit, FALSE, (unsigned *)0); if (n < 0) break; /* quit or no eligible items */ } while ((id_limit -= n) > 0); if (n == 0 || n < -1) *************** *** 1288,1295 **** --- 1453,1462 ---- obj_to_let(obj) /* should of course only be called for things in invent */ register struct obj *obj; { + #ifndef GOLDOBJ if (obj->oclass == GOLD_CLASS) return GOLD_SYM; + #endif if (!flags.invlet_constant) { obj->invlet = NOINVSYM; reassign(); *************** *** 1307,1338 **** register struct obj *obj; long quan; { - long savequan = obj->quan; - if (quan) obj->quan = quan; if (!prefix) prefix = ""; pline("%s%s%s", prefix, *prefix ? " " : "", ! xprname(obj, (char *)0, obj_to_let(obj), TRUE, 0L)); ! if (quan) obj->quan = savequan; } #endif /* OVL2 */ #ifdef OVL1 char * ! xprname(obj, txt, let, dot, cost) struct obj *obj; const char *txt; /* text to print instead of obj */ char let; /* inventory letter */ boolean dot; /* append period; (dot && cost => Iu) */ long cost; /* cost (for inventory of unpaid or expended items) */ { #ifdef LINT /* handle static char li[BUFSZ]; */ ! char li[BUFSZ]; #else ! static char li[BUFSZ]; #endif ! boolean use_invlet = flags.invlet_constant && let != CONTAINED_SYM; /* * If let is: * * Then obj == null and we are printing a total amount. --- 1474,1510 ---- register struct obj *obj; long quan; { if (!prefix) prefix = ""; pline("%s%s%s", prefix, *prefix ? " " : "", ! xprname(obj, (char *)0, obj_to_let(obj), TRUE, 0L, quan)); } #endif /* OVL2 */ #ifdef OVL1 char * ! xprname(obj, txt, let, dot, cost, quan) struct obj *obj; const char *txt; /* text to print instead of obj */ char let; /* inventory letter */ boolean dot; /* append period; (dot && cost => Iu) */ long cost; /* cost (for inventory of unpaid or expended items) */ + long quan; /* if non-0, print this quantity, not obj->quan */ { #ifdef LINT /* handle static char li[BUFSZ]; */ ! char li[BUFSZ]; #else ! static char li[BUFSZ]; #endif ! boolean use_invlet = flags.invlet_constant && let != CONTAINED_SYM; ! long savequan = 0; ! ! if (quan && obj) { ! savequan = obj->quan; ! obj->quan = quan; ! } ! /* * If let is: * * Then obj == null and we are printing a total amount. *************** *** 1340,1357 **** */ if (cost != 0 || let == '*') { /* if dot is true, we're doing Iu, otherwise Ix */ ! Sprintf(li, "%c - %-45s %6ld zorkmid%s", (dot && use_invlet ? obj->invlet : let), ! (txt ? txt : doname(obj)), cost, plur(cost)); ! } else if (obj->oclass == GOLD_CLASS) { Sprintf(li, "%ld gold piece%s%s", obj->quan, plur(obj->quan), (dot ? "." : "")); } else { /* ordinary inventory display or pickup message */ Sprintf(li, "%c - %s%s", (use_invlet ? obj->invlet : let), (txt ? txt : doname(obj)), (dot ? "." : "")); } return li; } --- 1512,1533 ---- */ if (cost != 0 || let == '*') { /* if dot is true, we're doing Iu, otherwise Ix */ ! Sprintf(li, "%c - %-45s %6ld %s", (dot && use_invlet ? obj->invlet : let), ! (txt ? txt : doname(obj)), cost, currency(cost)); ! #ifndef GOLDOBJ ! } else if (obj && obj->oclass == GOLD_CLASS) { Sprintf(li, "%ld gold piece%s%s", obj->quan, plur(obj->quan), (dot ? "." : "")); + #endif } else { /* ordinary inventory display or pickup message */ Sprintf(li, "%c - %s%s", (use_invlet ? obj->invlet : let), (txt ? txt : doname(obj)), (dot ? "." : "")); } + if (savequan) obj->quan = savequan; + return li; } *************** *** 1400,1415 **** } /* ! * If lets == NULL or "", list all objects in the inventory. Otherwise, ! * list all objects with object classes that match the order in lets. ! * ! * Returns the letter identifier of a selected item, or 0 if nothing ! * was selected. */ ! char ! display_inventory(lets, want_reply) register const char *lets; boolean want_reply; { struct obj *otmp; char ilet, ret; --- 1576,1590 ---- } /* ! * Internal function used by display_inventory and getobj that can display ! * inventory and return a count as well as a letter. If out_cnt is not null, ! * any count returned from the menu selection is placed here. */ ! static char ! display_pickinv(lets, want_reply, out_cnt) register const char *lets; boolean want_reply; + long* out_cnt; { struct obj *otmp; char ilet, ret; *************** *** 1441,1447 **** --- 1616,1626 ---- to here is short circuited away. */ if (!invent && !(flags.perm_invent && !lets && !want_reply)) { + #ifndef GOLDOBJ pline("Not carrying anything%s.", u.ugold ? " except gold" : ""); + #else + pline("Not carrying anything."); + #endif return 0; } *************** *** 1456,1463 **** for (otmp = invent; otmp; otmp = otmp->nobj) { if (otmp->invlet == lets[0]) { ret = message_menu(lets[0], ! want_reply ? PICK_ONE : PICK_NONE, ! xprname(otmp, (char *)0, lets[0], TRUE, 0L)); break; } } --- 1635,1642 ---- for (otmp = invent; otmp; otmp = otmp->nobj) { if (otmp->invlet == lets[0]) { ret = message_menu(lets[0], ! want_reply ? PICK_ONE : PICK_NONE, ! xprname(otmp, (char *)0, lets[0], TRUE, 0L, 0L)); break; } } *************** *** 1499,1504 **** --- 1678,1684 ---- n = select_menu(win, want_reply ? PICK_ONE : PICK_NONE, &selected); if (n > 0) { ret = selected[0].item.a_char; + if (out_cnt) *out_cnt = selected[0].count; free((genericptr_t)selected); } else ret = !n ? '\0' : '\033'; /* cancelled */ *************** *** 1507,1512 **** --- 1687,1707 ---- } /* + * If lets == NULL or "", list all objects in the inventory. Otherwise, + * list all objects with object classes that match the order in lets. + * + * Returns the letter identifier of a selected item, or 0 if nothing + * was selected. + */ + char + display_inventory(lets, want_reply) + register const char *lets; + boolean want_reply; + { + return display_pickinv(lets, want_reply, (long *)0); + } + + /* * Returns the number of unpaid items within the given list. This includes * contained objects. */ *************** *** 1525,1530 **** --- 1720,1764 ---- return count; } + /* + * Returns the number of items with b/u/c/unknown within the given list. + * This does NOT include contained objects. + */ + int + count_buc(list, type) + struct obj *list; + int type; + { + int count = 0; + + while (list) { + switch(type) { + case BUC_BLESSED: + if (list->oclass != GOLD_CLASS && list->bknown && list->blessed) + count++; + break; + case BUC_CURSED: + if (list->oclass != GOLD_CLASS && list->bknown && list->cursed) + count++; + break; + case BUC_UNCURSED: + if (list->oclass != GOLD_CLASS && + list->bknown && !list->blessed && !list->cursed) + count++; + break; + case BUC_UNKNOWN: + if (list->oclass != GOLD_CLASS && !list->bknown) + count++; + break; + default: + impossible("need count of curse status %d?", type); + return 0; + } + list = list->nobj; + } + return count; + } + STATIC_OVL void dounpaid() { *************** *** 1548,1554 **** pline("%s", xprname(otmp, distant_name(otmp, doname), marker ? otmp->invlet : CONTAINED_SYM, ! TRUE, unpaid_cost(otmp))); return; } --- 1782,1788 ---- pline("%s", xprname(otmp, distant_name(otmp, doname), marker ? otmp->invlet : CONTAINED_SYM, ! TRUE, unpaid_cost(otmp), 0L)); return; } *************** *** 1573,1579 **** save_unpaid = otmp->unpaid; otmp->unpaid = 0; putstr(win, 0, xprname(otmp, distant_name(otmp, doname), ! ilet, TRUE, cost)); otmp->unpaid = save_unpaid; num_so_far++; } --- 1807,1813 ---- save_unpaid = otmp->unpaid; otmp->unpaid = 0; putstr(win, 0, xprname(otmp, distant_name(otmp, doname), ! ilet, TRUE, cost, 0L)); otmp->unpaid = save_unpaid; num_so_far++; } *************** *** 1599,1605 **** marker->unpaid = 0; /* suppress "(unpaid)" suffix */ putstr(win, 0, xprname(marker, distant_name(marker, doname), ! CONTAINED_SYM, TRUE, cost)); marker->unpaid = save_unpaid; } } --- 1833,1839 ---- marker->unpaid = 0; /* suppress "(unpaid)" suffix */ putstr(win, 0, xprname(marker, distant_name(marker, doname), ! CONTAINED_SYM, TRUE, cost, 0L)); marker->unpaid = save_unpaid; } } *************** *** 1607,1613 **** } putstr(win, 0, ""); ! putstr(win, 0, xprname((struct obj *)0, "Total:", '*', FALSE, totcost)); display_nhwindow(win, FALSE); destroy_nhwindow(win); } --- 1841,1847 ---- } putstr(win, 0, ""); ! putstr(win, 0, xprname((struct obj *)0, "Total:", '*', FALSE, totcost, 0L)); display_nhwindow(win, FALSE); destroy_nhwindow(win); } *************** *** 1636,1642 **** --- 1870,1880 ---- boolean traditional = TRUE; const char *prompt = "What type of object do you want an inventory of?"; + #ifndef GOLDOBJ if (!invent && !u.ugold && !billx) { + #else + if (!invent && !billx) { + #endif You("aren't carrying anything."); return 0; } *************** *** 1657,1663 **** /* collect a list of classes of objects carried, for use as a prompt */ types[0] = 0; class_count = collect_obj_classes(types, invent, ! FALSE, (u.ugold != 0), (boolean FDECL((*),(OBJ_P))) 0); if (unpaid_count) { Strcat(types, "u"); --- 1895,1904 ---- /* collect a list of classes of objects carried, for use as a prompt */ types[0] = 0; class_count = collect_obj_classes(types, invent, ! FALSE, ! #ifndef GOLDOBJ ! (u.ugold != 0), ! #endif (boolean FDECL((*),(OBJ_P))) 0); if (unpaid_count) { Strcat(types, "u"); *************** *** 1810,1818 **** winid tmpwin; boolean skip_objects = (obj_cnt >= 5); ! if (u.uswallow) { You("%s no objects here.", verb); ! return(!!Blind); } if (!skip_objects && (trap = t_at(u.ux,u.uy)) && trap->tseen) There("is %s here.", --- 2051,2076 ---- winid tmpwin; boolean skip_objects = (obj_cnt >= 5); ! if (u.uswallow && u.ustuck) { ! struct monst *mtmp = u.ustuck; ! Sprintf(fbuf, "Contents of %s %s", ! s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH)); ! /* Skip "Contents of " by using fbuf index 12 */ ! You("%s to %s what is lying in %s.", ! Blind ? "try" : "look around", verb, &fbuf[12]); ! otmp = mtmp->minvent; ! if (otmp) { ! for ( ; otmp; otmp = otmp->nobj) { ! /* If swallower is an animal, it should have become stone but... */ ! if (otmp->otyp == CORPSE) feel_cockatrice(otmp, FALSE); ! } ! if (Blind) Strcpy(fbuf, "You feel"); ! Strcat(fbuf,":"); ! (void) display_minventory(mtmp, MINV_ALL, fbuf); ! } else { You("%s no objects here.", verb); ! } ! return(!!Blind); } if (!skip_objects && (trap = t_at(u.ux,u.uy)) && trap->tseen) There("is %s here.", *************** *** 1928,1934 **** --- 2186,2201 ---- mergable(otmp, obj) /* returns TRUE if obj & otmp can be merged */ register struct obj *otmp, *obj; { + #ifndef GOLDOBJ if (obj->otyp != otmp->otyp || obj->unpaid != otmp->unpaid || + #else + if (obj->otyp != otmp->otyp) return FALSE; + + /* Coins of the same kind will always merge. */ + if (obj->oclass == GOLD_CLASS) return TRUE; + + if (obj->unpaid != otmp->unpaid || + #endif obj->spe != otmp->spe || obj->dknown != otmp->dknown || (obj->bknown != otmp->bknown && !Role_if(PM_PRIEST)) || obj->cursed != otmp->cursed || obj->blessed != otmp->blessed || *************** *** 1941,1947 **** #endif obj->greased != otmp->greased || obj->oeroded != otmp->oeroded || ! obj->oeroded2 != otmp->oeroded2) return(FALSE); if ((obj->oclass==WEAPON_CLASS || obj->oclass==ARMOR_CLASS) && --- 2208,2215 ---- #endif obj->greased != otmp->greased || obj->oeroded != otmp->oeroded || ! obj->oeroded2 != otmp->oeroded2 || ! obj->bypass != otmp->bypass) return(FALSE); if ((obj->oclass==WEAPON_CLASS || obj->oclass==ARMOR_CLASS) && *************** *** 1960,1966 **** /* hatching eggs don't merge; ditto for revivable corpses */ if ((obj->otyp == EGG && (obj->timed || otmp->timed)) || (obj->otyp == CORPSE && otmp->corpsenm >= LOW_PM && ! mons[otmp->corpsenm].mlet == S_TROLL)) return FALSE; /* allow candle merging only if their ages are close */ --- 2228,2234 ---- /* hatching eggs don't merge; ditto for revivable corpses */ if ((obj->otyp == EGG && (obj->timed || otmp->timed)) || (obj->otyp == CORPSE && otmp->corpsenm >= LOW_PM && ! is_reviver(&mons[otmp->corpsenm]))) return FALSE; /* allow candle merging only if their ages are close */ *************** *** 2000,2009 **** --- 2268,2285 ---- { /* the messages used to refer to "carrying gold", but that didn't take containers into account */ + #ifndef GOLDOBJ if(!u.ugold) Your("wallet is empty."); else Your("wallet contains %ld gold piece%s.", u.ugold, plur(u.ugold)); + #else + long umoney = money_cnt(invent); + if(!umoney) + Your("wallet is empty."); + else + Your("wallet contains %ld %s.", umoney, currency(umoney)); + #endif shopper_financial_report(); return 0; } *************** *** 2078,2084 **** return 0; } ! static boolean tool_in_use(obj) struct obj *obj; { --- 2354,2360 ---- return 0; } ! STATIC_OVL boolean tool_in_use(obj) struct obj *obj; { *************** *** 2139,2145 **** /* burn_floor_paper() keeps an object pointer that it tries to * useupf() multiple times, so obj must survive if plural */ if (obj->quan > numused) ! otmp = splitobj(obj, obj->quan - numused); else otmp = obj; if(costly_spot(otmp->ox, otmp->oy)) { --- 2415,2421 ---- /* burn_floor_paper() keeps an object pointer that it tries to * useupf() multiple times, so obj must survive if plural */ if (obj->quan > numused) ! otmp = splitobj(obj, numused); else otmp = obj; if(costly_spot(otmp->ox, otmp->oy)) { *************** *** 2364,2390 **** * MINV_ALL - display all inventory */ struct obj * ! display_minventory(mon, dflags) register struct monst *mon; int dflags; { ! struct obj *ret, m_gold; char tmp[QBUFSZ]; int n; menu_item *selected = 0; int do_all = (dflags & MINV_ALL) != 0, do_gold = (do_all && mon->mgold); Sprintf(tmp,"%s %s:", s_suffix(noit_Monnam(mon)), do_all ? "possessions" : "armament"); if (do_all ? (mon->minvent || mon->mgold) : (mon->misc_worn_check || MON_WEP(mon))) { /* Fool the 'weapon in hand' routine into * displaying 'weapon in claw', etc. properly. */ youmonst.data = mon->data; if (do_gold) { /* * Make temporary gold object and insert at the head of --- 2640,2679 ---- * MINV_ALL - display all inventory */ struct obj * ! display_minventory(mon, dflags, title) register struct monst *mon; int dflags; + char *title; { ! struct obj *ret; ! #ifndef GOLDOBJ ! struct obj m_gold; ! #endif char tmp[QBUFSZ]; int n; menu_item *selected = 0; + #ifndef GOLDOBJ int do_all = (dflags & MINV_ALL) != 0, do_gold = (do_all && mon->mgold); + #else + int do_all = (dflags & MINV_ALL) != 0; + #endif Sprintf(tmp,"%s %s:", s_suffix(noit_Monnam(mon)), do_all ? "possessions" : "armament"); + #ifndef GOLDOBJ if (do_all ? (mon->minvent || mon->mgold) + #else + if (do_all ? (mon->minvent != 0) + #endif : (mon->misc_worn_check || MON_WEP(mon))) { /* Fool the 'weapon in hand' routine into * displaying 'weapon in claw', etc. properly. */ youmonst.data = mon->data; + #ifndef GOLDOBJ if (do_gold) { /* * Make temporary gold object and insert at the head of *************** *** 2401,2427 **** panic("display_minventory: static object freed."); } ! n = query_objlist(tmp, mon->minvent, INVORDER_SORT, &selected, (dflags & MINV_NOLET) ? PICK_NONE : PICK_ONE, do_all ? allow_all : worn_wield_only); if (do_gold) obj_extract_self(&m_gold); set_uasmon(); } else { ! invdisp_nothing(tmp, "(none)"); n = 0; } if (n > 0) { ret = selected[0].item.a_obj; free((genericptr_t)selected); /* * Unfortunately, we can't return a pointer to our temporary * gold object. We'll have to work out a scheme where this * can happen. Maybe even put gold in the inventory list... */ if (ret == &m_gold) ret = (struct obj *) 0; } else ret = (struct obj *) 0; return ret; --- 2690,2721 ---- panic("display_minventory: static object freed."); } ! #endif ! n = query_objlist(title ? title : tmp, mon->minvent, INVORDER_SORT, &selected, (dflags & MINV_NOLET) ? PICK_NONE : PICK_ONE, do_all ? allow_all : worn_wield_only); + #ifndef GOLDOBJ if (do_gold) obj_extract_self(&m_gold); + #endif set_uasmon(); } else { ! invdisp_nothing(title ? title : tmp, "(none)"); n = 0; } if (n > 0) { ret = selected[0].item.a_obj; free((genericptr_t)selected); + #ifndef GOLDOBJ /* * Unfortunately, we can't return a pointer to our temporary * gold object. We'll have to work out a scheme where this * can happen. Maybe even put gold in the inventory list... */ if (ret == &m_gold) ret = (struct obj *) 0; + #endif } else ret = (struct obj *) 0; return ret; *** nethack-3.3.1/src/light.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/light.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)light.c 3.3 97/04/10 */ /* Copyright (c) Dean Luick, 1994 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)light.c 3.4 1997/04/10 */ /* Copyright (c) Dean Luick, 1994 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 40,54 **** #ifdef OVL3 - typedef struct ls_t { - struct ls_t *next; - xchar x, y; /* source's position */ - short range; /* source's current range */ - short flags; - short type; /* type of light source */ - genericptr_t id; /* source's identifier */ - } light_source; - /* flags */ #define LSF_SHOW 0x1 /* display the light source */ #define LSF_NEEDS_FIXUP 0x2 /* need oid fixup */ --- 40,45 ---- *************** *** 462,467 **** --- 453,464 ---- if (ls->type == LS_OBJECT && ls->x == x && ls->y == y) { obj = (struct obj *) ls->id; if (obj_is_burning(obj)) { + /* The only way to snuff Sunsword is to unwield it. Darkness + * scrolls won't affect it. (If we got here because it was + * dropped or thrown inside a monster, this won't matter anyway + * because it will go out when dropped.) + */ + if (artifact_light(obj)) continue; end_burn(obj, obj->otyp != MAGIC_LAMP); /* * The current ls element has just been removed (and *************** *** 494,500 **** || obj->otyp == CANDELABRUM_OF_INVOCATION || obj->otyp == TALLOW_CANDLE || obj->otyp == WAX_CANDLE ! || obj->otyp == POT_OIL)); } /* copy the light source(s) attachted to src, and attach it/them to dest */ --- 491,498 ---- || obj->otyp == CANDELABRUM_OF_INVOCATION || obj->otyp == TALLOW_CANDLE || obj->otyp == WAX_CANDLE ! || obj->otyp == POT_OIL ! || artifact_light(obj))); } /* copy the light source(s) attachted to src, and attach it/them to dest */ *** nethack-3.3.1/src/lock.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/lock.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)lock.c 3.3 2000/02/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)lock.c 3.4 2000/02/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 103,109 **** return((xlock.usedtime = 0)); } ! if(rn2(100) > xlock.chance) return(1); /* still busy */ You("succeed in %s.", lock_action()); if (xlock.door) { --- 103,109 ---- return((xlock.usedtime = 0)); } ! if(rn2(100) >= xlock.chance) return(1); /* still busy */ You("succeed in %s.", lock_action()); if (xlock.door) { *************** *** 160,166 **** } else /* blunt */ wake_nearby(); /* due to hammering on the container */ ! if(rn2(100) > xlock.chance) return(1); /* still busy */ You("succeed in forcing the lock."); xlock.box->olocked = 0; --- 160,166 ---- } else /* blunt */ wake_nearby(); /* due to hammering on the container */ ! if(rn2(100) >= xlock.chance) return(1); /* still busy */ You("succeed in forcing the lock."); xlock.box->olocked = 0; *************** *** 201,207 **** if (costly) loss += stolen_value(xlock.box, u.ux, u.uy, (boolean)shkp->mpeaceful, TRUE); ! if(loss) You("owe %ld zorkmids for objects destroyed.", loss); delobj(xlock.box); } exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE); --- 201,207 ---- if (costly) loss += stolen_value(xlock.box, u.ux, u.uy, (boolean)shkp->mpeaceful, TRUE); ! if(loss) You("owe %ld %s for objects destroyed.", loss, currency(loss)); delobj(xlock.box); } exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE); *************** *** 476,482 **** else You("start bashing it with your %s.", xname(uwep)); xlock.box = otmp; ! xlock.chance = objects[otmp->otyp].oc_wldam * 2; xlock.picktyp = picktyp; xlock.usedtime = 0; break; --- 476,482 ---- else You("start bashing it with your %s.", xname(uwep)); xlock.box = otmp; ! xlock.chance = objects[uwep->otyp].oc_wldam * 2; xlock.picktyp = picktyp; xlock.usedtime = 0; break; *************** *** 877,884 **** long save_Blinded; if (otmp->oclass == POTION_CLASS) { ! You("%s a flask shatter!", Blind ? "hear" : "see"); ! potionbreathe(otmp); return; } /* We have functions for distant and singular names, but not one */ --- 877,885 ---- long save_Blinded; if (otmp->oclass == POTION_CLASS) { ! You("%s a %s shatter!", Blind ? "hear" : "see", bottlename()); ! if (!breathless(youmonst.data) || haseyes(youmonst.data)) ! potionbreathe(otmp); return; } /* We have functions for distant and singular names, but not one */ *** nethack-3.3.1/src/mail.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mail.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mail.c 3.3 1999/08/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mail.c 3.4 2002/01/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 446,452 **** "Only Amiga makes it possible.", "CATS have all the answers.", #endif ! "Report bugs to ." }; if (Blind) { --- 446,453 ---- "Only Amiga makes it possible.", "CATS have all the answers.", #endif ! "Report bugs to .", ! "Invitation: Visit the NetHack web site at http://www.nethack.org!" }; if (Blind) { *** nethack-3.3.1/src/makemon.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/makemon.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)makemon.c 3.3 2000/06/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)makemon.c 3.4 2002/02/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,17 **** --- 12,24 ---- STATIC_VAR NEARDATA struct monst zeromonst; + /* this assumes that a human quest leader or nemesis is an archetype + of the corresponding role; that isn't so for some roles (tourist + for instance) but is for the priests and monks we use it for... */ + #define quest_mon_represents_role(mptr,role_pm) \ + (mptr->mlet == S_HUMAN && Role_if(role_pm) && \ + (mptr->msound == MS_LEADER || mptr->msound == MS_NEMESIS)) + #ifdef OVL0 STATIC_DCL boolean FDECL(uncommon, (int)); STATIC_DCL int FDECL(align_shift, (struct permonst *)); *************** *** 125,130 **** --- 132,138 ---- if (enexto(&mm, mm.x, mm.y, mtmp->data)) { mon = makemon(mtmp->data, mm.x, mm.y, NO_MM_FLAGS); mon->mpeaceful = FALSE; + mon->mavenge = 0; set_malign(mon); /* Undo the second peace_minded() check in makemon(); if the * monster turned out to be peaceful the first time we *************** *** 238,244 **** (void)mongets(mtmp, PICK_AXE); if (!rn2(50)) (void)mongets(mtmp, CRYSTAL_BALL); } ! } else if (ptr->msound == MS_PRIEST) { otmp = mksobj(MACE, FALSE, FALSE); if(otmp) { otmp->spe = rnd(3); --- 246,253 ---- (void)mongets(mtmp, PICK_AXE); if (!rn2(50)) (void)mongets(mtmp, CRYSTAL_BALL); } ! } else if (ptr->msound == MS_PRIEST || ! quest_mon_represents_role(ptr,PM_PRIEST)) { otmp = mksobj(MACE, FALSE, FALSE); if(otmp) { otmp->spe = rnd(3); *************** *** 466,471 **** --- 475,496 ---- #endif /* OVL2 */ #ifdef OVL1 + #ifdef GOLDOBJ + /* + * Makes up money for monster's inventory. + * This will change with silver & copper coins + */ + void + mkmonmoney(mtmp, amount) + struct monst *mtmp; + long amount; + { + struct obj *gold = mksobj(GOLD_PIECE, FALSE, FALSE); + gold->quan = amount; + add_to_minv(mtmp, gold); + } + #endif + STATIC_OVL void m_initinv(mtmp) register struct monst *mtmp; *************** *** 526,532 **** if (mac < 10 && rn2(3)) mac += 1 + mongets(mtmp, LEATHER_GLOVES); else if (mac < 10 && rn2(2)) ! mac += 1 + mongets(mtmp, ELVEN_CLOAK); if(ptr != &mons[PM_GUARD] && ptr != &mons[PM_WATCHMAN] && --- 551,557 ---- if (mac < 10 && rn2(3)) mac += 1 + mongets(mtmp, LEATHER_GLOVES); else if (mac < 10 && rn2(2)) ! mac += 1 + mongets(mtmp, LEATHER_CLOAK); if(ptr != &mons[PM_GUARD] && ptr != &mons[PM_WATCHMAN] && *************** *** 547,556 **** case 2: (void) mongets(mtmp, POT_HEALING); case 3: (void) mongets(mtmp, WAN_STRIKING); } ! } else if (ptr->msound == MS_PRIEST) { ! (void) mongets(mtmp, ROBE); (void) mongets(mtmp, SMALL_SHIELD); mtmp->mgold = (long)rn1(10,20); } break; case S_NYMPH: --- 572,591 ---- case 2: (void) mongets(mtmp, POT_HEALING); case 3: (void) mongets(mtmp, WAN_STRIKING); } ! } else if (ptr->msound == MS_PRIEST || ! quest_mon_represents_role(ptr,PM_PRIEST)) { ! (void) mongets(mtmp, rn2(7) ? ROBE : ! rn2(3) ? CLOAK_OF_PROTECTION : ! CLOAK_OF_MAGIC_RESISTANCE); (void) mongets(mtmp, SMALL_SHIELD); + #ifndef GOLDOBJ mtmp->mgold = (long)rn1(10,20); + #else + mkmonmoney(mtmp,(long)rn1(10,20)); + #endif + } else if (quest_mon_represents_role(ptr,PM_MONK)) { + (void) mongets(mtmp, rn2(11) ? ROBE : + CLOAK_OF_MAGIC_RESISTANCE); } break; case S_NYMPH: *************** *** 601,607 **** --- 636,646 ---- } break; case S_LEPRECHAUN: + #ifndef GOLDOBJ mtmp->mgold = (long) d(level_difficulty(), 30); + #else + mkmonmoney(mtmp, (long) d(level_difficulty(), 30)); + #endif break; default: break; *************** *** 614,622 **** --- 653,666 ---- (void) mongets(mtmp, rnd_defensive_item(mtmp)); if ((int) mtmp->m_lev > rn2(100)) (void) mongets(mtmp, rnd_misc_item(mtmp)); + #ifndef GOLDOBJ if (likes_gold(ptr) && !mtmp->mgold && !rn2(5)) mtmp->mgold = (long) d(level_difficulty(), mtmp->minvent ? 5 : 10); + #else + if (likes_gold(ptr) && !findgold(mtmp->minvent) && !rn2(5)) + mkmonmoney(mtmp, (long) d(level_difficulty(), mtmp->minvent ? 5 : 10)); + #endif } struct monst * *************** *** 645,651 **** --- 689,697 ---- m2->minvent = (struct obj *) 0; /* objects don't clone */ m2->mleashed = FALSE; + #ifndef GOLDOBJ m2->mgold = 0L; + #endif /* Max HP the same, but current HP halved for both. The caller * might want to override this by halving the max HP also. * When current HP is odd, the original keeps the extra point. *************** *** 658,688 **** * polymorphed away from their original forms, the clone doesn't have * room for the extra information. we also don't want two shopkeepers * around for the same shop. - * similarly, clones of named monsters don't have room for the name, - * so we just make the clone unnamed instead of bothering to create - * a clone with room and copying over the name from the right place - * (which changes if the original was a shopkeeper or guard). */ if (mon->isshk) m2->isshk = FALSE; if (mon->isgd) m2->isgd = FALSE; if (mon->ispriest) m2->ispriest = FALSE; m2->mxlth = 0; - m2->mnamelth = 0; place_monster(m2, m2->mx, m2->my); if (emits_light(m2->data)) new_light_source(m2->mx, m2->my, emits_light(m2->data), LS_MONSTER, (genericptr_t)m2); newsym(m2->mx,m2->my); /* display the new monster */ if (mon->mtame) { struct monst *m3; ! /* because m2 is a copy of mon it is tame but not init'ed. ! * however, tamedog will not re-tame a tame dog, so m2 ! * must be made non-tame to get initialized properly. ! */ ! m2->mtame = 0; ! if ((m3 = tamedog(m2, (struct obj *)0)) != 0) m2 = m3; } return m2; } --- 704,745 ---- * polymorphed away from their original forms, the clone doesn't have * room for the extra information. we also don't want two shopkeepers * around for the same shop. */ if (mon->isshk) m2->isshk = FALSE; if (mon->isgd) m2->isgd = FALSE; if (mon->ispriest) m2->ispriest = FALSE; m2->mxlth = 0; place_monster(m2, m2->mx, m2->my); if (emits_light(m2->data)) new_light_source(m2->mx, m2->my, emits_light(m2->data), LS_MONSTER, (genericptr_t)m2); + if (m2->mnamelth) { + m2->mnamelth = 0; /* or it won't get allocated */ + m2 = christen_monst(m2, NAME(mon)); + } newsym(m2->mx,m2->my); /* display the new monster */ if (mon->mtame) { struct monst *m3; ! if (mon->isminion) { ! m3 = newmonst(sizeof(struct epri) + mon->mnamelth); ! *m3 = *m2; ! m3->mxlth = sizeof(struct epri); ! if (m2->mnamelth) Strcpy(NAME(m3), NAME(m2)); ! *(EPRI(m3)) = *(EPRI(mon)); ! replmon(m2, m3); m2 = m3; + } else { + /* because m2 is a copy of mon it is tame but not init'ed. + * however, tamedog will not re-tame a tame dog, so m2 + * must be made non-tame to get initialized properly. + */ + m2->mtame = 0; + if ((m3 = tamedog(m2, (struct obj *)0)) != 0) { + m2 = m3; + *(EDOG(m2)) = *(EDOG(mon)); + } + } } return m2; } *************** *** 705,710 **** --- 762,768 ---- boolean anymon = (!ptr); boolean byyou = (x == u.ux && y == u.uy); boolean allow_minvent = ((mmflags & NO_MINVENT) == 0); + boolean countbirth = ((mmflags & MM_NOCOUNTBIRTH) == 0); uchar lim; /* if caller wants random location, do it here */ *************** *** 772,782 **** * the caller manually decrement mvitals if the monster is created * under circumstances where one would not logically expect the * creation to reduce the supply of wild monsters. Monster cloning ! * might be one such case, but we go against logic there in order to * reduce the possibility of abuse. */ ! if (mvitals[mndx].born < 255) mvitals[mndx].born++; ! lim = (mndx == PM_NAZGUL ? 9 : mndx == PM_ERINYS ? 3 : MAXMONNO); if ((int) mvitals[mndx].born >= lim && !(mons[mndx].geno & G_NOGEN) && !(mvitals[mndx].mvflags & G_EXTINCT)) { #ifdef DEBUG --- 830,840 ---- * the caller manually decrement mvitals if the monster is created * under circumstances where one would not logically expect the * creation to reduce the supply of wild monsters. Monster cloning ! * might be one such case, but we go against logic there in order to * reduce the possibility of abuse. */ ! if (mvitals[mndx].born < 255 && countbirth) mvitals[mndx].born++; ! lim = mbirth_limit(mndx); if ((int) mvitals[mndx].born >= lim && !(mons[mndx].geno & G_NOGEN) && !(mvitals[mndx].mvflags & G_EXTINCT)) { #ifdef DEBUG *************** *** 798,803 **** --- 856,863 ---- mtmp->m_id = flags.ident++; if (!mtmp->m_id) mtmp->m_id = flags.ident++; /* ident overflowed */ set_mon_data(mtmp, ptr, 0); + if (mtmp->data->msound == MS_LEADER) + quest_status.leader_m_id = mtmp->m_id; mtmp->mxlth = xlth; mtmp->mnum = mndx; *************** *** 832,837 **** --- 892,899 ---- if (In_sokoban(&u.uz) && !mindless(ptr)) /* know about traps here */ mtmp->mtrapseen = (1L << (PIT - 1)) | (1L << (HOLE - 1)); + if (ptr->msound == MS_LEADER) /* leader knows about portal */ + mtmp->mtrapseen |= (1 << (MAGIC_PORTAL-1)); place_monster(mtmp, x, y); mtmp->mcansee = mtmp->mcanmove = TRUE; *************** *** 877,883 **** break; case S_BAT: if (Inhell && is_bat(ptr)) ! mon_adjust_speed(mtmp, 2); break; } if ((ct = emits_light(mtmp->data)) > 0) --- 939,945 ---- break; case S_BAT: if (Inhell && is_bat(ptr)) ! mon_adjust_speed(mtmp, 2, (struct obj *)0); break; } if ((ct = emits_light(mtmp->data)) > 0) *************** *** 893,899 **** mtmp->cham = CHAM_ORDINARY; else { mtmp->cham = mcham; ! (void) newcham(mtmp, rndmonst()); } } else if (mndx == PM_WIZARD_OF_YENDOR) { mtmp->iswiz = TRUE; --- 955,961 ---- mtmp->cham = CHAM_ORDINARY; else { mtmp->cham = mcham; ! (void) newcham(mtmp, rndmonst(), FALSE); } } else if (mndx == PM_WIZARD_OF_YENDOR) { mtmp->iswiz = TRUE; *************** *** 931,936 **** --- 993,999 ---- } if(is_dprince(ptr) && ptr->msound == MS_BRIBE) { mtmp->mpeaceful = mtmp->minvis = mtmp->perminvis = 1; + mtmp->mavenge = 0; if (uwep && uwep->oartifact == ART_EXCALIBUR) mtmp->mpeaceful = mtmp->mtame = FALSE; } *************** *** 981,986 **** --- 1044,1056 ---- return(mtmp); } + int + mbirth_limit(mndx) + int mndx; + { + return (mndx == PM_NAZGUL ? 9 : mndx == PM_ERINYS ? 3 : MAXMONNO); + } + /* used for wand/scroll/spell of create monster */ /* returns TRUE iff you know monsters have been created */ boolean *************** *** 1326,1332 **** if (mvitals[newtype].mvflags & G_GENOD) { /* allow G_EXTINCT */ if (sensemon(mtmp)) pline("As %s grows up into %s, %s %s!", mon_nam(mtmp), ! an(ptr->mname), he[pronoun_gender(mtmp)], nonliving(ptr) ? "expires" : "dies"); set_mon_data(mtmp, ptr, -1); /* keep mvitals[] accurate */ mondied(mtmp); --- 1396,1402 ---- if (mvitals[newtype].mvflags & G_GENOD) { /* allow G_EXTINCT */ if (sensemon(mtmp)) pline("As %s grows up into %s, %s %s!", mon_nam(mtmp), ! an(ptr->mname), mhe(mtmp), nonliving(ptr) ? "expires" : "dies"); set_mon_data(mtmp, ptr, -1); /* keep mvitals[] accurate */ mondied(mtmp); *** nethack-3.3.1/src/mcastu.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mcastu.c Thu Mar 21 07:37:37 2002 *************** *** 1,10 **** ! /* SCCS Id: @(#)mcastu.c 3.3 97/11/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" ! STATIC_DCL void FDECL(cursetxt,(struct monst *)); #ifdef OVL0 --- 1,42 ---- ! /* SCCS Id: @(#)mcastu.c 3.4 2002/02/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" ! /* monster mage spells */ ! #define MGC_PSI_BOLT 0 ! #define MGC_CURE_SELF 1 ! #define MGC_HASTE_SELF 2 ! #define MGC_STUN_YOU 3 ! #define MGC_DISAPPEAR 4 ! #define MGC_WEAKEN_YOU 5 ! #define MGC_DESTRY_ARMR 6 ! #define MGC_CURSE_ITEMS 7 ! #define MGC_AGGRAVATION 8 ! #define MGC_SUMMON_MONS 9 ! #define MGC_CLONE_WIZ 10 ! #define MGC_DEATH_TOUCH 11 ! ! /* monster cleric spells */ ! #define CLC_OPEN_WOUNDS 0 ! #define CLC_CURE_SELF 1 ! #define CLC_CONFUSE_YOU 2 ! #define CLC_PARALYZE 3 ! #define CLC_BLIND_YOU 4 ! #define CLC_INSECTS 5 ! #define CLC_CURSE_ITEMS 6 ! #define CLC_LIGHTNING 7 ! #define CLC_FIRE_PILLAR 8 ! #define CLC_GEYSER 9 ! ! STATIC_DCL void FDECL(cursetxt,(struct monst *,BOOLEAN_P)); ! STATIC_DCL int FDECL(choose_magic_spell, (int)); ! STATIC_DCL int FDECL(choose_clerical_spell, (int)); ! STATIC_DCL void FDECL(cast_wizard_spell,(struct monst *, int,int)); ! STATIC_DCL void FDECL(cast_cleric_spell,(struct monst *, int,int)); ! STATIC_DCL boolean FDECL(is_undirected_spell,(unsigned int,int)); ! STATIC_DCL boolean FDECL(spell_would_be_useless,(struct monst *,unsigned int,int)); #ifdef OVL0 *************** *** 13,25 **** /* feedback when frustrated monster couldn't cast a spell */ STATIC_OVL void ! cursetxt(mtmp) struct monst *mtmp; { ! if (canseemon(mtmp)) { const char *point_msg; /* spellcasting monsters are impolite */ ! if ((Invis && !perceives(mtmp->data) && (mtmp->mux != u.ux || mtmp->muy != u.uy)) || (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance == STRANGE_OBJECT) || --- 45,60 ---- /* feedback when frustrated monster couldn't cast a spell */ STATIC_OVL void ! cursetxt(mtmp, undirected) struct monst *mtmp; + boolean undirected; { ! if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)) { const char *point_msg; /* spellcasting monsters are impolite */ ! if (undirected) ! point_msg = "all around, then curses"; ! else if ((Invis && !perceives(mtmp->data) && (mtmp->mux != u.ux || mtmp->muy != u.uy)) || (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance == STRANGE_OBJECT) || *************** *** 39,72 **** #endif /* OVL0 */ #ifdef OVLB int ! castmu(mtmp, mattk) /* monster casts spell at you */ register struct monst *mtmp; register struct attack *mattk; { int dmg, ml = mtmp->m_lev; ! if(mtmp->mcan || mtmp->mspec_used || !ml) { /* could not attack */ ! cursetxt(mtmp); return(0); - } else { - nomul(0); - if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) { /* fumbled attack */ - if (canseemon(mtmp) && flags.soundok) - pline_The("air crackles around %s.", mon_nam(mtmp)); - return(0); - } } /* * As these are spells, the damage is related to the level * of the monster casting the spell. */ ! if (mattk->damd) ! dmg = d((int)((ml/3) + mattk->damn), (int)mattk->damd); ! else dmg = d((int)((ml/3) + 1), 6); if (Half_spell_damage) dmg = (dmg+1) / 2; ! switch(mattk->adtyp) { case AD_FIRE: pline("You're enveloped in flames."); --- 74,271 ---- #endif /* OVL0 */ #ifdef OVLB + /* convert a level based random selection into a specific mage spell; + inappropriate choices will be screened out by spell_would_be_useless() */ + STATIC_OVL int + choose_magic_spell(spellval) + int spellval; + { + switch (spellval) { + case 22: + case 21: + case 20: + return MGC_DEATH_TOUCH; + case 19: + case 18: + return MGC_CLONE_WIZ; + case 17: + case 16: + case 15: + return MGC_SUMMON_MONS; /* also aggravates */ + case 14: + case 13: + return MGC_AGGRAVATION; + case 12: + case 11: + case 10: + return MGC_CURSE_ITEMS; + case 9: + case 8: + return MGC_DESTRY_ARMR; + case 7: + case 6: + return MGC_WEAKEN_YOU; + case 5: + case 4: + return MGC_DISAPPEAR; + case 3: + return MGC_STUN_YOU; + case 2: + return MGC_HASTE_SELF; + case 1: + return MGC_CURE_SELF; + case 0: + default: + return MGC_PSI_BOLT; + } + } + + /* convert a level based random selection into a specific cleric spell */ + STATIC_OVL int + choose_clerical_spell(spellnum) + int spellnum; + { + switch (spellnum) { + case 13: + return CLC_GEYSER; + case 12: + return CLC_FIRE_PILLAR; + case 11: + return CLC_LIGHTNING; + case 10: + case 9: + return CLC_CURSE_ITEMS; + case 8: + return CLC_INSECTS; + case 7: + case 6: + return CLC_BLIND_YOU; + case 5: + case 4: + return CLC_PARALYZE; + case 3: + case 2: + return CLC_CONFUSE_YOU; + case 1: + return CLC_CURE_SELF; + case 0: + default: + return CLC_OPEN_WOUNDS; + } + } + + /* return values: + * 1: successful spell + * 0: unsuccessful spell + */ int ! castmu(mtmp, mattk, thinks_it_foundyou, foundyou) register struct monst *mtmp; register struct attack *mattk; + boolean thinks_it_foundyou; + boolean foundyou; { int dmg, ml = mtmp->m_lev; + int ret; + int spellnum = 0; + + /* Three cases: + * -- monster is attacking you. Search for a useful spell. + * -- monster thinks it's attacking you. Search for a useful spell, + * without checking for undirected. If the spell found is directed, + * it fails with cursetxt() and loss of mspec_used. + * -- monster isn't trying to attack. Select a spell once. Don't keep + * searching; if that spell is not useful (or if it's directed), + * return and do something else. + * Since most spells are directed, this means that a monster that isn't + * attacking casts spells only a small portion of the time that an + * attacking monster does. + */ + if (mattk->adtyp == AD_SPEL || mattk->adtyp == AD_CLRC) { + int cnt = 40; + + do { + spellnum = rn2(ml); + if (mattk->adtyp == AD_SPEL) + spellnum = choose_magic_spell(spellnum); + else + spellnum = choose_clerical_spell(spellnum); + /* not trying to attack? don't allow directed spells */ + if (!thinks_it_foundyou) { + if (!is_undirected_spell(mattk->adtyp, spellnum) || + spell_would_be_useless(mtmp, mattk->adtyp, spellnum)) { + if (foundyou) + impossible("spellcasting monster found you and doesn't know it?"); + return 0; + } + break; + } + } while(--cnt > 0 && + spell_would_be_useless(mtmp, mattk->adtyp, spellnum)); + if (cnt == 0) return 0; + } ! /* monster unable to cast spells? */ ! if(mtmp->mcan || mtmp->mspec_used || !ml) { ! cursetxt(mtmp, is_undirected_spell(mattk->adtyp, spellnum)); ! return(0); ! } ! ! if (mattk->adtyp == AD_SPEL || mattk->adtyp == AD_CLRC) { ! mtmp->mspec_used = 10 - mtmp->m_lev; ! if (mtmp->mspec_used < 2) mtmp->mspec_used = 2; ! } ! ! /* monster can cast spells, but is casting a directed spell at the ! wrong place? If so, give a message, and return. Do this *after* ! penalizing mspec_used. */ ! if (!foundyou && thinks_it_foundyou && ! !is_undirected_spell(mattk->adtyp, spellnum)) { ! pline("%s casts a spell at %s!", ! canseemon(mtmp) ? Monnam(mtmp) : "Something", ! levl[mtmp->mux][mtmp->muy].typ == WATER ! ? "empty water" : "thin air"); return(0); } + + nomul(0); + if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) { /* fumbled attack */ + if (canseemon(mtmp) && flags.soundok) + pline_The("air crackles around %s.", mon_nam(mtmp)); + return(0); + } + if (canspotmon(mtmp) || !is_undirected_spell(mattk->adtyp, spellnum)) { + pline("%s casts a spell%s!", + canspotmon(mtmp) ? Monnam(mtmp) : "Something", + is_undirected_spell(mattk->adtyp, spellnum) ? "" : + (Invisible && !perceives(mtmp->data) && + (mtmp->mux != u.ux || mtmp->muy != u.uy)) ? + " at a spot near you" : + (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) ? + " at your displaced image" : + " at you"); + } + /* * As these are spells, the damage is related to the level * of the monster casting the spell. */ ! if (!foundyou) { ! dmg = 0; ! if (mattk->adtyp != AD_SPEL && mattk->adtyp != AD_CLRC) { ! impossible( ! "%s casting non-hand-to-hand version of hand-to-hand spell %d?", ! Monnam(mtmp), mattk->adtyp); ! return(0); ! } ! } else if (mattk->damd) ! dmg = d((int)((ml/2) + mattk->damn), (int)mattk->damd); ! else dmg = d((int)((ml/2) + 1), 6); if (Half_spell_damage) dmg = (dmg+1) / 2; ! ret = 1; ! ! switch (mattk->adtyp) { case AD_FIRE: pline("You're enveloped in flames."); *************** *** 93,321 **** dmg = 0; } else dmg = d((int)mtmp->m_lev/2 + 1,6); break; ! case AD_SPEL: /* random spell */ ! mtmp->mspec_used = 10 - mtmp->m_lev; ! if (mtmp->mspec_used < 2) mtmp->mspec_used = 2; ! switch(rn2((int)mtmp->m_lev)) { ! case 22: ! case 21: ! case 20: ! pline("Oh no, %s's using the touch of death!", ! humanoid(mtmp->data) ! ? (mtmp->female ? "she" : "he") ! : "it" ! ); ! if (nonliving(youmonst.data) || is_demon(youmonst.data)) ! You("seem no deader than before."); ! else if (!Antimagic && rn2(ml) > 12) { ! ! if(Hallucination) ! You("have an out of body experience."); ! else { ! killer_format = KILLED_BY_AN; ! killer = "touch of death"; ! done(DIED); ! } ! } else { ! if(Antimagic) shieldeff(u.ux, u.uy); ! pline("Lucky for you, it didn't work!"); ! } ! dmg = 0; ! break; ! case 19: ! case 18: ! if(mtmp->iswiz && flags.no_of_wizards == 1) { ! pline("Double Trouble..."); ! clonewiz(); ! dmg = 0; ! break; ! } /* else fall into the next case */ ! case 17: ! case 16: ! case 15: ! if(mtmp->iswiz) ! verbalize("Destroy the thief, my pets!"); ! nasty(mtmp); /* summon something nasty */ ! /* fall into the next case */ ! case 14: /* aggravate all monsters */ ! case 13: ! aggravate(); ! dmg = 0; ! break; ! case 12: /* curse random items */ ! case 11: ! case 10: ! rndcurse(); ! dmg = 0; ! break; ! case 9: ! case 8: /* destroy armor */ ! if (Antimagic) { ! shieldeff(u.ux, u.uy); ! pline("A field of force surrounds you!"); ! } else if(!destroy_arm(some_armor(&youmonst))) ! Your("skin itches."); ! dmg = 0; ! break; ! case 7: ! case 6: /* drain strength */ ! if(Antimagic) { ! shieldeff(u.ux, u.uy); ! You_feel("momentarily weakened."); ! } else { ! You("suddenly feel weaker!"); ! dmg = ml - 6; ! if(Half_spell_damage) dmg = (dmg+1) / 2; ! losestr(rnd(dmg)); ! if(u.uhp < 1) ! done_in_by(mtmp); ! } ! dmg = 0; ! break; ! case 5: /* make invisible if not */ ! case 4: ! if (!mtmp->minvis && !mtmp->invis_blkd) { ! if(canseemon(mtmp) && !See_invisible) ! pline("%s suddenly disappears!", Monnam(mtmp)); ! mon_set_minvis(mtmp); ! dmg = 0; ! break; ! } /* else fall into the next case */ ! case 3: /* stun */ ! if (Antimagic || Free_action) { ! shieldeff(u.ux, u.uy); ! if(!Stunned) ! You_feel("momentarily disoriented."); ! make_stunned(1L, FALSE); ! } else { ! if (Stunned) ! You("struggle to keep your balance."); ! else ! You("reel..."); ! dmg = d(ACURR(A_DEX) < 12 ? 6 : 4, 4); ! if(Half_spell_damage) dmg = (dmg+1) / 2; ! make_stunned(HStun + dmg, FALSE); ! } ! dmg = 0; ! break; ! case 2: /* haste self */ ! mon_adjust_speed(mtmp, 1); ! dmg = 0; ! break; ! case 1: /* cure self */ ! if(mtmp->mhp < mtmp->mhpmax) { ! if((mtmp->mhp += rnd(8)) > mtmp->mhpmax) ! mtmp->mhp = mtmp->mhpmax; ! dmg = 0; ! break; ! } /* else fall through to default case */ ! default: /* psi bolt */ ! if(Antimagic) { ! shieldeff(u.ux, u.uy); ! You("get a slight %sache.",body_part(HEAD)); ! dmg = 1; ! } else { ! if (dmg <= 10) ! Your("brain is on fire!"); ! else Your("%s suddenly aches!", body_part(HEAD)); ! } ! break; ! } break; ! case AD_CLRC: /* clerical spell */ ! mtmp->mspec_used = 10 - mtmp->m_lev; ! if (mtmp->mspec_used < 2) mtmp->mspec_used = 2; ! switch(rn2((int)mtmp->m_lev)) { ! /* Other ideas: lightning bolts, towers of flame, ! gush of water -3. */ ! ! default: /* confuse */ ! if(Antimagic) { ! shieldeff(u.ux, u.uy); ! You_feel("momentarily dizzy."); ! } else { ! dmg = (int)mtmp->m_lev; ! if(Half_spell_damage) dmg = (dmg+1) / 2; ! make_confused(HConfusion + dmg, TRUE); ! } ! dmg = 0; ! break; ! case 12: /* curse random items */ ! case 11: ! case 10: ! rndcurse(); ! dmg = 0; ! break; ! case 9: ! case 8: /* insects */ ! /* Try for insects, and if there are none ! left, go for (sticks to) snakes. -3. */ ! { ! int i; ! struct permonst *pm = mkclass(S_ANT,0); ! struct monst *mtmp2; ! char let = (pm ? S_ANT : S_SNAKE); ! ! for (i = 0; i <= (int) mtmp->m_lev; i++) ! if ((pm = mkclass(let,0)) && ! (mtmp2 = makemon(pm, u.ux, u.uy, NO_MM_FLAGS))) { ! mtmp2->msleeping = mtmp2->mpeaceful = ! mtmp2->mtame = 0; ! set_malign(mtmp2); ! } ! } ! dmg = 0; ! break; ! case 6: ! case 7: /* blindness */ ! /* note: resists_blnd() doesn't apply here */ ! if (!Blinded) { ! pline("Scales cover your %s!", makeplural(body_part(EYE))); ! make_blinded(Half_spell_damage ? 100L:200L, FALSE); ! dmg = 0; ! break; ! } ! case 4: ! case 5: /* wound */ ! if(Antimagic) { ! shieldeff(u.ux, u.uy); ! Your("skin itches badly for a moment."); ! dmg = 0; ! } else { ! pline("Wounds appear on your body!"); ! dmg = d(2,8) + 1; ! if (Half_spell_damage) dmg = (dmg+1) / 2; ! } ! break; ! case 3: /* hold */ ! if (Antimagic || Free_action) { ! shieldeff(u.ux, u.uy); ! if(multi >= 0) ! You("stiffen briefly."); ! nomul(-1); ! } else { ! if (multi >= 0) ! You("are frozen in place!"); ! dmg = 4 + (int)mtmp->m_lev; ! if (Half_spell_damage) dmg = (dmg+1) / 2; ! nomul(-dmg); ! } ! dmg = 0; ! break; ! case 2: ! case 1: /* cure self */ ! if(mtmp->mhp < mtmp->mhpmax) { ! if((mtmp->mhp += rnd(8)) > mtmp->mhpmax) ! mtmp->mhp = mtmp->mhpmax; ! dmg = 0; ! break; ! } /* else fall through to default case */ ! } } ! if(dmg) mdamageu(mtmp, dmg); ! return(1); } #endif /* OVLB */ --- 292,750 ---- dmg = 0; } else dmg = d((int)mtmp->m_lev/2 + 1,6); break; ! case AD_SPEL: /* wizard spell */ ! case AD_CLRC: /* clerical spell */ ! { ! if (mattk->adtyp == AD_SPEL) ! cast_wizard_spell(mtmp, dmg, spellnum); ! else ! cast_cleric_spell(mtmp, dmg, spellnum); ! dmg = 0; /* done by the spell casting functions */ ! break; ! } ! } ! if(dmg) mdamageu(mtmp, dmg); ! return(ret); ! } ! /* monster wizard and cleric spellcasting functions */ ! /* ! If dmg is zero, then the monster is not casting at you. ! If the monster is intentionally not casting at you, we have previously ! called spell_would_be_useless() and spellnum should always be a valid ! undirected spell. ! If you modify either of these, be sure to change is_undirected_spell() ! and spell_would_be_useless(). ! */ ! STATIC_OVL ! void ! cast_wizard_spell(mtmp, dmg, spellnum) ! struct monst *mtmp; ! int dmg; ! int spellnum; ! { ! if (dmg == 0 && !is_undirected_spell(AD_SPEL, spellnum)) { ! impossible("cast directed wizard spell (%d) with dmg=0?", spellnum); ! return; ! } ! ! switch (spellnum) { ! case MGC_DEATH_TOUCH: ! pline("Oh no, %s's using the touch of death!", mhe(mtmp)); ! if (nonliving(youmonst.data) || is_demon(youmonst.data)) { ! You("seem no deader than before."); ! } else if (!Antimagic && rn2(mtmp->m_lev) > 12) { ! if (Hallucination) { ! You("have an out of body experience."); ! } else { ! killer_format = KILLED_BY_AN; ! killer = "touch of death"; ! done(DIED); ! } ! } else { ! if (Antimagic) shieldeff(u.ux, u.uy); ! pline("Lucky for you, it didn't work!"); ! } ! dmg = 0; ! break; ! case MGC_CLONE_WIZ: ! if (mtmp->iswiz && flags.no_of_wizards == 1) { ! pline("Double Trouble..."); ! clonewiz(); ! dmg = 0; ! } else ! impossible("bad wizard cloning?"); ! break; ! case MGC_SUMMON_MONS: /* also aggravates */ ! { ! int count; ! ! count = nasty(mtmp); /* summon something nasty */ ! if (mtmp->iswiz) ! verbalize("Destroy the thief, my pet%s!", plur(count)); ! else { ! const char *mappear = ! (count == 1) ? "A monster appears" : "Monsters appear"; ! ! /* messages not quite right if plural monsters created but ! only a single monster is seen */ ! if (Invisible && !perceives(mtmp->data) && ! (mtmp->mux != u.ux || mtmp->muy != u.uy)) ! pline("%s around a spot near you!", mappear); ! else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) ! pline("%s around your displaced image!", mappear); ! else ! pline("%s from nowhere!", mappear); ! } ! dmg = 0; ! break; ! } ! case MGC_AGGRAVATION: ! You_feel("that monsters are aware of your presence."); ! aggravate(); ! dmg = 0; ! break; ! case MGC_CURSE_ITEMS: ! You_feel("as if you need some help."); ! rndcurse(); ! dmg = 0; ! break; ! case MGC_DESTRY_ARMR: ! if (Antimagic) { ! shieldeff(u.ux, u.uy); ! pline("A field of force surrounds you!"); ! } else if (!destroy_arm(some_armor(&youmonst))) { ! Your("skin itches."); ! } ! dmg = 0; ! break; ! case MGC_WEAKEN_YOU: /* drain strength */ ! if (Antimagic) { ! shieldeff(u.ux, u.uy); ! You_feel("momentarily weakened."); ! } else { ! You("suddenly feel weaker!"); ! dmg = mtmp->m_lev - 6; ! if (Half_spell_damage) dmg = (dmg + 1) / 2; ! losestr(rnd(dmg)); ! if (u.uhp < 1) ! done_in_by(mtmp); ! } ! dmg = 0; ! break; ! case MGC_DISAPPEAR: /* makes self invisible */ ! if (!mtmp->minvis && !mtmp->invis_blkd) { ! if (canseemon(mtmp)) ! pline("%s suddenly %s!", Monnam(mtmp), ! !See_invisible ? "disappears" : "becomes transparent"); ! mon_set_minvis(mtmp); ! dmg = 0; ! } else ! impossible("no reason for monster to cast disappear spell?"); ! break; ! case MGC_STUN_YOU: ! if (Antimagic || Free_action) { ! shieldeff(u.ux, u.uy); ! if (!Stunned) ! You_feel("momentarily disoriented."); ! make_stunned(1L, FALSE); ! } else { ! You(Stunned ? "struggle to keep your balance." : "reel..."); ! dmg = d(ACURR(A_DEX) < 12 ? 6 : 4, 4); ! if (Half_spell_damage) dmg = (dmg + 1) / 2; ! make_stunned(HStun + dmg, FALSE); ! } ! dmg = 0; ! break; ! case MGC_HASTE_SELF: ! mon_adjust_speed(mtmp, 1, (struct obj *)0); ! dmg = 0; ! break; ! case MGC_CURE_SELF: ! if (mtmp->mhp < mtmp->mhpmax) { ! if (canseemon(mtmp)) ! pline("%s looks better.", Monnam(mtmp)); ! /* note: player healing does 6d4; this used to do 1d8 */ ! if ((mtmp->mhp += d(3,6)) > mtmp->mhpmax) ! mtmp->mhp = mtmp->mhpmax; ! dmg = 0; ! } ! break; ! case MGC_PSI_BOLT: ! /* prior to 3.4.0 Antimagic was setting the damage to 1--this ! made the spell virtually harmless to players with magic res. */ ! if (Antimagic) { ! shieldeff(u.ux, u.uy); ! dmg = (dmg + 1) / 2; ! } ! if (dmg <= 5) ! You("get a slight %sache.", body_part(HEAD)); ! else if (dmg <= 10) ! Your("brain is on fire!"); ! else if (dmg <= 20) ! Your("%s suddenly aches painfully!", body_part(HEAD)); ! else ! Your("%s suddenly aches very painfully!", body_part(HEAD)); ! break; ! default: ! impossible("mcastu: invalid magic spell (%d)", spellnum); ! dmg = 0; ! break; ! } ! ! if (dmg) mdamageu(mtmp, dmg); ! } ! ! STATIC_OVL ! void ! cast_cleric_spell(mtmp, dmg, spellnum) ! struct monst *mtmp; ! int dmg; ! int spellnum; ! { ! if (dmg == 0 && !is_undirected_spell(AD_CLRC, spellnum)) { ! impossible("cast directed cleric spell (%d) with dmg=0?", spellnum); ! return; ! } ! ! switch (spellnum) { ! case CLC_GEYSER: ! /* this is physical damage, not magical damage */ ! pline("A sudden geyser slams into you from nowhere!"); ! dmg = d(8, 6); ! if (Half_physical_damage) dmg = (dmg + 1) / 2; ! break; ! case CLC_FIRE_PILLAR: ! pline("A pillar of fire strikes all around you!"); ! if (Fire_resistance) { ! shieldeff(u.ux, u.uy); ! dmg = 0; ! } else ! dmg = d(8, 6); ! if (Half_spell_damage) dmg = (dmg + 1) / 2; ! burn_away_slime(); ! (void) burnarmor(&youmonst); ! destroy_item(SCROLL_CLASS, AD_FIRE); ! destroy_item(POTION_CLASS, AD_FIRE); ! destroy_item(SPBOOK_CLASS, AD_FIRE); ! (void) burn_floor_paper(u.ux, u.uy, TRUE, FALSE); ! break; ! case CLC_LIGHTNING: ! { ! boolean reflects; ! ! pline("A bolt of lightning strikes down at you from above!"); ! reflects = ureflects("It bounces off your %s%s.", ""); ! if (reflects || Shock_resistance) { ! shieldeff(u.ux, u.uy); ! dmg = 0; ! if (reflects) ! break; ! } else ! dmg = d(8, 6); ! if (Half_spell_damage) dmg = (dmg + 1) / 2; ! destroy_item(WAND_CLASS, AD_ELEC); ! destroy_item(RING_CLASS, AD_ELEC); ! break; ! } ! case CLC_CURSE_ITEMS: ! You_feel("as if you need some help."); ! rndcurse(); ! dmg = 0; ! break; ! case CLC_INSECTS: ! { ! /* Try for insects, and if there are none ! left, go for (sticks to) snakes. -3. */ ! struct permonst *pm = mkclass(S_ANT,0); ! struct monst *mtmp2 = (struct monst *)0; ! char let = (pm ? S_ANT : S_SNAKE); ! boolean success; ! int i; ! coord bypos; ! ! success = pm ? TRUE : FALSE; ! for (i = 0; i <= (int) mtmp->m_lev; i++) { ! if (!enexto(&bypos, mtmp->mux, mtmp->muy, mtmp->data)) break; + if ((pm = mkclass(let,0)) != 0 && + (mtmp2 = makemon(pm, bypos.x, bypos.y, NO_MM_FLAGS)) != 0) { + success = TRUE; + mtmp2->msleeping = mtmp2->mpeaceful = mtmp2->mtame = 0; + set_malign(mtmp2); + } + } + /* Not quite right: + * -- message doesn't always make sense for unseen caster (particularly + * the first message) + * -- message assumes plural monsters summoned (non-plural should be + * very rare, unlike in nasty()) + * -- message assumes plural monsters seen + */ + if (!success) + pline("%s casts at a clump of sticks, but nothing happens.", + Monnam(mtmp)); + else if (let == S_SNAKE) + pline("%s transforms a clump of sticks into snakes!", + Monnam(mtmp)); + else if (Invisible && !perceives(mtmp->data) && + (mtmp->mux != u.ux || mtmp->muy != u.uy)) + pline("%s summons insects around a spot near you!", + Monnam(mtmp)); + else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) + pline("%s summons insects around your displaced image!", + Monnam(mtmp)); + else + pline("%s summons insects!", Monnam(mtmp)); + dmg = 0; + break; + } + case CLC_BLIND_YOU: + /* note: resists_blnd() doesn't apply here */ + if (!Blinded) { + int num_eyes = eyecount(youmonst.data); + pline("Scales cover your %s!", + (num_eyes == 1) ? + body_part(EYE) : makeplural(body_part(EYE))); + make_blinded(Half_spell_damage ? 100L : 200L, FALSE); + if (!Blind) Your(vision_clears); + dmg = 0; + } else + impossible("no reason for monster to cast blindness spell?"); + break; + case CLC_PARALYZE: + if (Antimagic || Free_action) { + shieldeff(u.ux, u.uy); + if (multi >= 0) + You("stiffen briefly."); + nomul(-1); + } else { + if (multi >= 0) + You("are frozen in place!"); + dmg = 4 + (int)mtmp->m_lev; + if (Half_spell_damage) dmg = (dmg + 1) / 2; + nomul(-dmg); + } + dmg = 0; + break; + case CLC_CONFUSE_YOU: + if (Antimagic) { + shieldeff(u.ux, u.uy); + You_feel("momentarily dizzy."); + } else { + boolean oldprop = !!Confusion; ! dmg = (int)mtmp->m_lev; ! if (Half_spell_damage) dmg = (dmg + 1) / 2; ! make_confused(HConfusion + dmg, TRUE); ! if (Hallucination) ! You_feel("%s!", oldprop ? "trippier" : "trippy"); ! else ! You_feel("%sconfused!", oldprop ? "more " : ""); } ! dmg = 0; ! break; ! case CLC_CURE_SELF: ! if (mtmp->mhp < mtmp->mhpmax) { ! if (canseemon(mtmp)) ! pline("%s looks better.", Monnam(mtmp)); ! /* note: player healing does 6d4; this used to do 1d8 */ ! if ((mtmp->mhp += d(3,6)) > mtmp->mhpmax) ! mtmp->mhp = mtmp->mhpmax; ! dmg = 0; ! } ! break; ! case CLC_OPEN_WOUNDS: ! if (Antimagic) { ! shieldeff(u.ux, u.uy); ! dmg = (dmg + 1) / 2; ! } ! if (dmg <= 5) ! Your("skin itches badly for a moment."); ! else if (dmg <= 10) ! pline("Wounds appear on your body!"); ! else if (dmg <= 20) ! pline("Severe wounds appear on your body!"); ! else ! Your("body is covered with painful wounds!"); ! break; ! default: ! impossible("mcastu: invalid clerical spell (%d)", spellnum); ! dmg = 0; ! break; ! } ! ! if (dmg) mdamageu(mtmp, dmg); ! } ! ! STATIC_DCL ! boolean ! is_undirected_spell(adtyp, spellnum) ! unsigned int adtyp; ! int spellnum; ! { ! if (adtyp == AD_SPEL) { ! switch (spellnum) { ! case MGC_CLONE_WIZ: ! case MGC_SUMMON_MONS: ! case MGC_AGGRAVATION: ! case MGC_DISAPPEAR: ! case MGC_HASTE_SELF: ! case MGC_CURE_SELF: ! return TRUE; ! default: ! break; ! } ! } else if (adtyp == AD_CLRC) { ! switch (spellnum) { ! case CLC_INSECTS: ! case CLC_CURE_SELF: ! return TRUE; ! default: ! break; ! } ! } ! return FALSE; ! } ! ! /* Some spells are useless under some circumstances. */ ! STATIC_DCL ! boolean ! spell_would_be_useless(mtmp, adtyp, spellnum) ! struct monst *mtmp; ! unsigned int adtyp; ! int spellnum; ! { ! /* Some spells don't require the player to really be there and can be cast ! * by the monster when you're invisible, yet still shouldn't be cast when ! * the monster doesn't even think you're there. ! * This check isn't quite right because it always uses your real position. ! * We really want something like "if the monster could see mux, muy". ! */ ! boolean mcouldseeu = couldsee(mtmp->mx, mtmp->my); ! ! if (adtyp == AD_SPEL) { ! /* aggravate monsters, etc. won't be cast by peaceful monsters */ ! if (mtmp->mpeaceful && (spellnum == MGC_AGGRAVATION || ! spellnum == MGC_SUMMON_MONS || spellnum == MGC_CLONE_WIZ)) ! return TRUE; ! /* haste self when already fast */ ! if (mtmp->permspeed == MFAST && spellnum == MGC_HASTE_SELF) ! return TRUE; ! /* invisibility when already invisible */ ! if ((mtmp->minvis || mtmp->invis_blkd) && spellnum == MGC_DISAPPEAR) ! return TRUE; ! /* peaceful monster won't cast invisibility if you can't see invisible, ! same as when monsters drink potions of invisibility. This doesn't ! really make a lot of sense, but lets the player avoid hitting ! peaceful monsters by mistake */ ! if (mtmp->mpeaceful && !See_invisible && spellnum == MGC_DISAPPEAR) ! return TRUE; ! /* healing when already healed */ ! if (mtmp->mhp == mtmp->mhpmax && spellnum == MGC_CURE_SELF) ! return TRUE; ! /* don't summon monsters if it doesn't think you're around */ ! if (!mcouldseeu && (spellnum == MGC_SUMMON_MONS || ! (!mtmp->iswiz && spellnum == MGC_CLONE_WIZ))) ! return TRUE; ! if ((!mtmp->iswiz || flags.no_of_wizards > 1) ! && spellnum == MGC_CLONE_WIZ) ! return TRUE; ! } else if (adtyp == AD_CLRC) { ! /* summon insects/sticks to snakes won't be cast by peaceful monsters */ ! if (mtmp->mpeaceful && spellnum == CLC_INSECTS) ! return TRUE; ! /* healing when already healed */ ! if (mtmp->mhp == mtmp->mhpmax && spellnum == CLC_CURE_SELF) ! return TRUE; ! /* don't summon insects if it doesn't think you're around */ ! if (!mcouldseeu && spellnum == CLC_INSECTS) ! return TRUE; ! /* blindness spell on blinded player */ ! if (Blinded && spellnum == CLC_BLIND_YOU) ! return TRUE; ! } ! return FALSE; } #endif /* OVLB */ *************** *** 329,336 **** register struct monst *mtmp; register struct attack *mattk; { ! if(mtmp->mcan || mattk->adtyp > AD_SPC2) { ! cursetxt(mtmp); return(0); } if(lined_up(mtmp) && rn2(3)) { --- 758,770 ---- register struct monst *mtmp; register struct attack *mattk; { ! /* don't print constant stream of curse messages for 'normal' ! spellcasting monsters at range */ ! if (mattk->adtyp > AD_SPC2) ! return(0); ! ! if (mtmp->mcan) { ! cursetxt(mtmp, FALSE); return(0); } if(lined_up(mtmp) && rn2(3)) { *** nethack-3.3.1/src/mhitm.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mhitm.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mhitm.c 3.3 2000/07/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mhitm.c 3.4 2002/02/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 189,195 **** attk, /* attack attempted this time */ struck = 0, /* hit at least once */ res[NATTK]; /* results of all attacks */ ! struct attack *mattk; struct permonst *pa, *pd; if (!magr || !mdef) return(MM_MISS); /* mike@genat */ --- 189,195 ---- attk, /* attack attempted this time */ struck = 0, /* hit at least once */ res[NATTK]; /* results of all attacks */ ! struct attack *mattk, alt_attk; struct permonst *pa, *pd; if (!magr || !mdef) return(MM_MISS); /* mike@genat */ *************** *** 233,239 **** /* Now perform all attacks for the monster. */ for (i = 0; i < NATTK; i++) { res[i] = MM_MISS; ! mattk = &(pa->mattk[i]); otmp = (struct obj *)0; attk = 1; switch (mattk->aatyp) { --- 233,239 ---- /* Now perform all attacks for the monster. */ for (i = 0; i < NATTK; i++) { res[i] = MM_MISS; ! mattk = getmattk(pa, i, res, &alt_attk); otmp = (struct obj *)0; attk = 1; switch (mattk->aatyp) { *************** *** 274,282 **** /* KMH -- don't accumulate to-hit bonuses */ if (otmp) tmp -= hitval(otmp, mdef); ! if (strike) res[i] = hitmm(magr, mdef, mattk); ! else missmm(magr, mdef, mattk); break; --- 274,295 ---- /* KMH -- don't accumulate to-hit bonuses */ if (otmp) tmp -= hitval(otmp, mdef); ! if (strike) { res[i] = hitmm(magr, mdef, mattk); ! if((mdef->data == &mons[PM_BLACK_PUDDING] || mdef->data == &mons[PM_BROWN_PUDDING]) ! && otmp && objects[otmp->otyp].oc_material == IRON ! && mdef->mhp > 1 && !mdef->mcan) ! { ! if (clone_mon(mdef)) { ! if (vis) { ! char buf[BUFSZ]; ! ! Strcpy(buf, Monnam(mdef)); ! pline("%s divides as %s hits it!", buf, mon_nam(magr)); ! } ! } ! } ! } else missmm(magr, mdef, mattk); break; *************** *** 393,400 **** default: Sprintf(buf,"%s hits", magr_name); } } - pline("%s %s.", buf, mon_nam_too(mdef_name, mdef, magr)); } else noises(magr, mattk); return(mdamagem(magr, mdef, mattk)); } --- 406,413 ---- default: Sprintf(buf,"%s hits", magr_name); } + pline("%s %s.", buf, mon_nam_too(mdef_name, mdef, magr)); } } else noises(magr, mattk); return(mdamagem(magr, mdef, mattk)); } *************** *** 412,421 **** pline("%s %s...", buf, mon_nam(mdef)); } ! if (!mdef->mcansee || mdef->msleeping) { if(vis) pline("but nothing happens."); return(MM_MISS); } return(mdamagem(magr, mdef, mattk)); } --- 425,462 ---- pline("%s %s...", buf, mon_nam(mdef)); } ! if (magr->mcan || !magr->mcansee || ! (magr->minvis && !perceives(mdef->data)) || ! !mdef->mcansee || mdef->msleeping) { if(vis) pline("but nothing happens."); return(MM_MISS); } + /* call mon_reflects 2x, first test, then, if visible, print message */ + if (magr->data == &mons[PM_MEDUSA] && mon_reflects(mdef, (char *)0)) { + if (canseemon(mdef)) + (void) mon_reflects(mdef, + "The gaze is reflected away by %s %s."); + if (mdef->mcansee) { + if (mon_reflects(magr, (char *)0)) { + if (canseemon(magr)) + (void) mon_reflects(magr, + "The gaze is reflected away by %s %s."); + return (MM_MISS); + } + if (mdef->minvis && !perceives(magr->data)) { + if (canseemon(magr)) { + pline("%s doesn't seem to notice that %s gaze was reflected.", + Monnam(magr), mhis(magr)); + } + return (MM_MISS); + } + if (canseemon(magr)) + pline("%s is turned to stone!", Monnam(magr)); + monstone(magr); + if (magr->mhp > 0) return (MM_MISS); + return (MM_AGR_DIED); + } + } return(mdamagem(magr, mdef, mattk)); } *************** *** 526,536 **** int tmp = d((int)mattk->damn,(int)mattk->damd); struct obj *obj; char buf[BUFSZ]; if (touch_petrifies(pd) && !resists_ston(magr) && (mattk->aatyp != AT_WEAP || !otmp) && (mattk->aatyp != AT_GAZE && mattk->aatyp != AT_EXPL) && ! !(magr->misc_worn_check & W_ARMG)) { if (poly_when_stoned(pa)) { mon_to_stone(magr); return MM_HIT; /* no damage during the polymorph */ --- 567,581 ---- int tmp = d((int)mattk->damn,(int)mattk->damd); struct obj *obj; char buf[BUFSZ]; + int protector = + mattk->aatyp == AT_TENT ? 0 : + mattk->aatyp == AT_KICK ? W_ARMF : W_ARMG; + int num; if (touch_petrifies(pd) && !resists_ston(magr) && (mattk->aatyp != AT_WEAP || !otmp) && (mattk->aatyp != AT_GAZE && mattk->aatyp != AT_EXPL) && ! !(magr->misc_worn_check & protector)) { if (poly_when_stoned(pa)) { mon_to_stone(magr); return MM_HIT; /* no damage during the polymorph */ *************** *** 564,573 **** tmp = mdef->mhp; /* Use up amulet of life saving */ if (!!(obj = mlifesaver(mdef))) m_useup(mdef, obj); break; case AD_STUN: if (magr->mcan) break; ! if(vis) pline("%s staggers for a moment.", Monnam(mdef)); mdef->mstun = 1; /* fall through */ case AD_WERE: --- 609,645 ---- tmp = mdef->mhp; /* Use up amulet of life saving */ if (!!(obj = mlifesaver(mdef))) m_useup(mdef, obj); + + /* Is a corpse for nutrition possible? It may kill magr */ + if (!corpse_chance(mdef, magr, TRUE) || magr->mhp < 1) + break; + + /* Pets get nutrition from swallowing monster whole. + * No nutrition from G_NOCORPSE monster, eg, undead. + * DGST monsters don't die from undead corpses + */ + num = monsndx(mdef->data); + if (magr->mtame && !magr->isminion && + !(mvitals[num].mvflags & G_NOCORPSE)) { + struct obj *virtualcorpse = mksobj(CORPSE, FALSE, FALSE); + int nutrit; + + virtualcorpse->corpsenm = num; + virtualcorpse->owt = weight(virtualcorpse); + nutrit = dog_nutrition(magr, virtualcorpse); + dealloc_obj(virtualcorpse); + + /* only 50% nutrition, 25% of normal eating time */ + if (magr->meating > 1) magr->meating = (magr->meating+3)/4; + if (nutrit > 1) nutrit /= 2; + EDOG(magr)->hungrytime += nutrit; + } break; case AD_STUN: if (magr->mcan) break; ! if (canseemon(mdef)) ! pline("%s %s for a moment.", Monnam(mdef), ! makeplural(stagger(mdef->data, "stagger"))); mdef->mstun = 1; /* fall through */ case AD_WERE: *************** *** 607,612 **** --- 679,685 ---- } if (vis) pline("%s is %s!", Monnam(mdef), + mdef->data == &mons[PM_WATER_ELEMENTAL] ? "boiling" : mattk->aatyp == AT_HUGS ? "being roasted" : "on fire"); if (pd == &mons[PM_STRAW_GOLEM] || *************** *** 679,685 **** pline("It burns %s!", mon_nam(mdef)); } if (!rn2(30)) erode_armor(mdef, TRUE); ! if (!rn2(6)) erode_weapon(MON_WEP(mdef), TRUE); break; case AD_RUST: if (!magr->mcan && pd == &mons[PM_IRON_GOLEM]) { --- 752,758 ---- pline("It burns %s!", mon_nam(mdef)); } if (!rn2(30)) erode_armor(mdef, TRUE); ! if (!rn2(6)) erode_obj(MON_WEP(mdef), TRUE, TRUE); break; case AD_RUST: if (!magr->mcan && pd == &mons[PM_IRON_GOLEM]) { *************** *** 694,701 **** hurtmarmor(mdef, AD_RUST); tmp = 0; break; ! case AD_CORRODE: ! hurtmarmor(mdef, AD_CORRODE); tmp = 0; break; case AD_DCAY: --- 767,774 ---- hurtmarmor(mdef, AD_RUST); tmp = 0; break; ! case AD_CORR: ! hurtmarmor(mdef, AD_CORR); tmp = 0; break; case AD_DCAY: *************** *** 771,777 **** if (!magr->mcan && vis && mdef->mspeed != MSLOW) { unsigned int oldspeed = mdef->mspeed; ! mon_adjust_speed(mdef, -1); if (mdef->mspeed != oldspeed && vis) pline("%s slows down.", Monnam(mdef)); } --- 844,850 ---- if (!magr->mcan && vis && mdef->mspeed != MSLOW) { unsigned int oldspeed = mdef->mspeed; ! mon_adjust_speed(mdef, -1, (struct obj *)0); if (mdef->mspeed != oldspeed && vis) pline("%s slows down.", Monnam(mdef)); } *************** *** 834,845 **** --- 907,931 ---- break; case AD_SGLD: tmp = 0; + #ifndef GOLDOBJ if (magr->mcan || !mdef->mgold) break; /* technically incorrect; no check for stealing gold from * between mdef's feet... */ magr->mgold += mdef->mgold; mdef->mgold = 0; + #else + if (magr->mcan) break; + /* technically incorrect; no check for stealing gold from + * between mdef's feet... + */ + { + struct obj *gold = findgold(mdef->minvent); + if (!gold) break; + obj_extract_self(gold); + add_to_minv(magr, gold); + } + #endif if (vis) { Strcpy(buf, Monnam(magr)); pline("%s steals some gold from %s.", buf, mon_nam(mdef)); *************** *** 867,880 **** #endif case AD_SITM: /* for now these are the same */ case AD_SEDU: ! if (!magr->mcan && mdef->minvent) { char onambuf[BUFSZ], mdefnambuf[BUFSZ]; /* make a special x_monnam() call that never omits the saddle, and save it for later messages */ Strcpy(mdefnambuf, x_monnam(mdef, ARTICLE_THE, (char *)0, 0, FALSE)); ! otmp = mdef->minvent; #ifdef STEED if (u.usteed == mdef && otmp == which_armor(mdef, W_SADDLE)) --- 953,972 ---- #endif case AD_SITM: /* for now these are the same */ case AD_SEDU: ! /* find an object to steal, non-cursed if magr is tame */ ! for (obj = mdef->minvent; obj; obj = obj->nobj) { ! if (!magr->mtame || !obj->cursed) ! break; ! } ! ! if (!magr->mcan && obj) { char onambuf[BUFSZ], mdefnambuf[BUFSZ]; /* make a special x_monnam() call that never omits the saddle, and save it for later messages */ Strcpy(mdefnambuf, x_monnam(mdef, ARTICLE_THE, (char *)0, 0, FALSE)); ! otmp = obj; #ifdef STEED if (u.usteed == mdef && otmp == which_armor(mdef, W_SADDLE)) *************** *** 884,889 **** --- 976,983 ---- obj_extract_self(otmp); if (otmp->owornmask) { mdef->misc_worn_check &= ~otmp->owornmask; + if (otmp->owornmask & W_WEP) + setmnotwielded(mdef,otmp); otmp->owornmask = 0L; update_mon_intrinsics(mdef, otmp, FALSE); } *************** *** 933,938 **** --- 1027,1033 ---- case AD_DRIN: if (notonhead || !has_head(pd)) { if (vis) pline("%s doesn't seem harmed.", Monnam(mdef)); + /* Not clear what to do for green slimes */ tmp = 0; break; } *************** *** 941,947 **** Strcpy(buf, s_suffix(Monnam(mdef))); pline("%s helmet blocks %s attack to %s head.", buf, s_suffix(mon_nam(magr)), ! his[pronoun_gender(mdef)]); } break; } --- 1036,1042 ---- Strcpy(buf, s_suffix(Monnam(mdef))); pline("%s helmet blocks %s attack to %s head.", buf, s_suffix(mon_nam(magr)), ! mhis(mdef)); } break; } *************** *** 962,970 **** case AD_SLIM: if (!rn2(4) && mdef->data != &mons[PM_FIRE_VORTEX] && mdef->data != &mons[PM_FIRE_ELEMENTAL] && mdef->data != &mons[PM_GREEN_SLIME]) { if (vis) pline("%s turns into slime.", Monnam(mdef)); ! (void) newcham(mdef, &mons[PM_GREEN_SLIME]); tmp = 0; } break; --- 1057,1066 ---- case AD_SLIM: if (!rn2(4) && mdef->data != &mons[PM_FIRE_VORTEX] && mdef->data != &mons[PM_FIRE_ELEMENTAL] && + mdef->data != &mons[PM_SALAMANDER] && mdef->data != &mons[PM_GREEN_SLIME]) { if (vis) pline("%s turns into slime.", Monnam(mdef)); ! (void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE); tmp = 0; } break; *************** *** 1054,1060 **** if (!magr || !mdef || !obj) return; /* just in case */ ! if (dmgtype(mdef->data, AD_CORRODE)) is_acid = TRUE; else if (dmgtype(mdef->data, AD_RUST)) is_acid = FALSE; --- 1150,1156 ---- if (!magr || !mdef || !obj) return; /* just in case */ ! if (dmgtype(mdef->data, AD_CORR)) is_acid = TRUE; else if (dmgtype(mdef->data, AD_RUST)) is_acid = FALSE; *************** *** 1088,1098 **** register struct obj *otemp; { char buf[BUFSZ]; Strcpy(buf, mon_nam(mdef)); - if (!flags.verbose || Blind) return; pline("%s %s %s %s at %s.", Monnam(magr), (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings", ! his[pronoun_gender(magr)], xname(otemp), buf); } /* --- 1184,1194 ---- register struct obj *otemp; { char buf[BUFSZ]; + if (!flags.verbose || Blind || !mon_visible(magr)) return; Strcpy(buf, mon_nam(mdef)); pline("%s %s %s %s at %s.", Monnam(magr), (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings", ! mhis(magr), singular(otemp, xname), buf); } /* *************** *** 1198,1204 **** if (!magr->mstun) { magr->mstun = 1; if (canseemon(magr)) ! pline("%s staggers...", Monnam(magr)); } tmp = 0; break; --- 1294,1301 ---- if (!magr->mstun) { magr->mstun = 1; if (canseemon(magr)) ! pline("%s %s...", Monnam(magr), ! makeplural(stagger(magr->data, "stagger"))); } tmp = 0; break; *** nethack-3.3.1/src/mhitu.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mhitu.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mhitu.c 3.3 2000/04/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mhitu.c 3.4 2002/02/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 99,104 **** --- 99,105 ---- else pline("%s just misses!", Monnam(mtmp)); } + stop_occupation(); } STATIC_OVL void *************** *** 110,116 **** return; pline("%s %s %s %s.", Monnam(mtmp), (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings", ! his[pronoun_gender(mtmp)], xname(otemp)); } /* return how a poison attack was delivered */ --- 111,117 ---- return; pline("%s %s %s %s.", Monnam(mtmp), (objects[otemp->otyp].oc_dir & PIERCE) ? "thrusts" : "swings", ! mhis(mtmp), singular(otemp, xname)); } /* return how a poison attack was delivered */ *************** *** 265,270 **** --- 266,295 ---- #endif /* OVLB */ #ifdef OVL0 + /* select a monster's next attack, possibly substituting for its usual one */ + struct attack * + getmattk(mptr, indx, prev_result, alt_attk_buf) + struct permonst *mptr; + int indx, prev_result[]; + struct attack *alt_attk_buf; + { + struct attack *attk = &mptr->mattk[indx]; + + /* prevent a monster with two consecutive disease or hunger attacks + from hitting with both of them on the same turn; if the first has + already hit, switch to a stun attack for the second */ + if (indx > 0 && prev_result[indx - 1] > 0 && + (attk->adtyp == AD_DISE || + attk->adtyp == AD_PEST || + attk->adtyp == AD_FAMN) && + attk->adtyp == mptr->mattk[indx - 1].adtyp) { + *alt_attk_buf = *attk; + attk = alt_attk_buf; + attk->adtyp = AD_STUN; + } + return attk; + } + /* * mattacku: monster attacks you * returns 1 if monster dies (e.g. "yellow light"), 0 otherwise *************** *** 278,284 **** mattacku(mtmp) register struct monst *mtmp; { ! struct attack *mattk; int i, j, tmp, sum[NATTK]; struct permonst *mdat = mtmp->data; boolean ranged = (distu(mtmp->mx, mtmp->my) > 3); --- 303,309 ---- mattacku(mtmp) register struct monst *mtmp; { ! struct attack *mattk, alt_attk; int i, j, tmp, sum[NATTK]; struct permonst *mdat = mtmp->data; boolean ranged = (distu(mtmp->mx, mtmp->my) > 3); *************** *** 319,325 **** i = mattackm(mtmp, u.usteed); if ((i & MM_AGR_DIED)) return (1); ! if (i & MM_DEF_DIED || u.ux != u.ux0 || u.uy != u.uy0) return (0); /* Let your steed retaliate */ return (!!(mattackm(u.usteed, mtmp) & MM_DEF_DIED)); --- 344,350 ---- i = mattackm(mtmp, u.usteed); if ((i & MM_AGR_DIED)) return (1); ! if (i & MM_DEF_DIED || u.umoved) return (0); /* Let your steed retaliate */ return (!!(mattackm(u.usteed, mtmp) & MM_DEF_DIED)); *************** *** 343,349 **** newsym(u.ux,u.uy); } else { pline("%s is killed by a falling %s (you)!", ! Monnam(mtmp), youmonst.data->mname); killed(mtmp); newsym(u.ux,u.uy); if (mtmp->mhp > 0) return 0; --- 368,374 ---- newsym(u.ux,u.uy); } else { pline("%s is killed by a falling %s (you)!", ! Monnam(mtmp), youmonst.data->mname); killed(mtmp); newsym(u.ux,u.uy); if (mtmp->mhp > 0) return 0; *************** *** 399,405 **** } return(0); } ! if (youmonst.data->mlet == S_MIMIC && youmonst.m_ap_type && !range2 && foundyou && !u.uswallow) { if (!youseeit) pline("It gets stuck on you."); else pline("Wait, %s! That's a %s named %s!", m_monnam(mtmp), youmonst.data->mname, plname); --- 424,431 ---- } return(0); } ! if (youmonst.data->mlet == S_MIMIC && youmonst.m_ap_type && ! !range2 && foundyou && !u.uswallow) { if (!youseeit) pline("It gets stuck on you."); else pline("Wait, %s! That's a %s named %s!", m_monnam(mtmp), youmonst.data->mname, plname); *************** *** 475,485 **** } if(u.uinvulnerable) { ! /* monster's won't attack you */ if(mtmp == u.ustuck) pline("%s loosens its grip slightly.", Monnam(mtmp)); else if(!range2) { ! if(youseeit) pline("%s starts to attack you, but pulls back.", Monnam(mtmp)); else --- 501,511 ---- } if(u.uinvulnerable) { ! /* monsters won't attack you */ if(mtmp == u.ustuck) pline("%s loosens its grip slightly.", Monnam(mtmp)); else if(!range2) { ! if (youseeit || sensemon(mtmp)) pline("%s starts to attack you, but pulls back.", Monnam(mtmp)); else *************** *** 498,504 **** for(i = 0; i < NATTK; i++) { sum[i] = 0; ! mattk = &(mdat->mattk[i]); if (u.uswallow && (mattk->aatyp != AT_ENGL)) continue; switch(mattk->aatyp) { --- 524,530 ---- for(i = 0; i < NATTK; i++) { sum[i] = 0; ! mattk = getmattk(mdat, i, sum, &alt_attk); if (u.uswallow && (mattk->aatyp != AT_ENGL)) continue; switch(mattk->aatyp) { *************** *** 554,571 **** } else { missmu(mtmp, (tmp == j), mattk); } ! } else if (is_animal(mtmp->data)) ! pline("%s gulps some air!", youseeit ? ! Monnam(mtmp) : "It"); ! else ! if (youseeit) ! pline("%s lunges forward and recoils!", ! Monnam(mtmp)); ! else ! You_hear("a %s nearby.", ! is_whirly(mtmp->data)? ! "rushing noise" : ! "splat"); } break; case AT_BREA: --- 580,596 ---- } else { missmu(mtmp, (tmp == j), mattk); } ! } else if (is_animal(mtmp->data)) { ! pline("%s gulps some air!", Monnam(mtmp)); ! } else { ! if (youseeit) ! pline("%s lunges forward and recoils!", ! Monnam(mtmp)); ! else ! You_hear("a %s nearby.", ! is_whirly(mtmp->data) ? ! "rushing noise" : "splat"); ! } } break; case AT_BREA: *************** *** 597,603 **** if (mon_wield_item(mtmp) != 0) break; } if (foundyou) { - possibly_unwield(mtmp); otmp = MON_WEP(mtmp); if(otmp) { hittmp = hitval(otmp, &youmonst); --- 622,627 ---- *************** *** 618,637 **** case AT_MAGC: if (range2) sum[i] = buzzmu(mtmp, mattk); ! else if (foundyou) ! sum[i] = castmu(mtmp, mattk); else ! pline("%s casts a spell at %s!", ! youseeit ? Monnam(mtmp) : "It", ! levl[mtmp->mux][mtmp->muy].typ == WATER ! ? "empty water" : "thin air"); ! /* FIXME: castmu includes spells that are not ! * cast at the player and thus should be ! * possible whether the monster knows your ! * location or not. ! * --KAA ! */ break; default: /* no attack */ --- 642,653 ---- case AT_MAGC: if (range2) sum[i] = buzzmu(mtmp, mattk); ! else { if (foundyou) ! sum[i] = castmu(mtmp, mattk, TRUE, TRUE); else ! sum[i] = castmu(mtmp, mattk, TRUE, FALSE); ! } break; default: /* no attack */ *************** *** 668,674 **** switch(attk) { /* 0 is burning, which we should never be called with */ case AD_RUST: hurt = 1; break; ! case AD_CORRODE: hurt = 3; break; default: hurt = 2; break; } --- 684,690 ---- switch(attk) { /* 0 is burning, which we should never be called with */ case AD_RUST: hurt = 1; break; ! case AD_CORR: hurt = 3; break; default: hurt = 2; break; } *************** *** 760,766 **** /* avoid "slippery slippery cloak" for undiscovered oilskin cloak */ (obj->greased || objects[obj->otyp].oc_name_known) ? ! xname(obj) : "cloak"); if (obj->greased && !rn2(2)) { pline_The("grease wears off."); --- 776,782 ---- /* avoid "slippery slippery cloak" for undiscovered oilskin cloak */ (obj->greased || objects[obj->otyp].oc_name_known) ? ! xname(obj) : cloak_simple_name(obj)); if (obj->greased && !rn2(2)) { pline_The("grease wears off."); *************** *** 784,790 **** { register struct permonst *mdat = mtmp->data; register int uncancelled, ptmp; ! int dmg, armpro; char buf[BUFSZ]; struct permonst *olduasmon = youmonst.data; int res; --- 800,806 ---- { register struct permonst *mdat = mtmp->data; register int uncancelled, ptmp; ! int dmg, armpro, permdmg; char buf[BUFSZ]; struct permonst *olduasmon = youmonst.data; int res; *************** *** 833,838 **** --- 849,855 ---- armpro = objects[uarmh->otyp].a_can; uncancelled = !mtmp->mcan && ((rn2(3) >= armpro) || !rn2(50)); + permdmg = 0; /* Now, adjust damages via resistances or specific attacks */ switch(mattk->adtyp) { case AD_PHYS: *************** *** 867,872 **** --- 884,890 ---- hitmsg(mtmp, mattk); if (!dmg) break; if (u.mh > 1 && u.mh > ((u.uac>0) ? dmg : dmg+u.uac) && + objects[otmp->otyp].oc_material == IRON && (u.umonnum==PM_BLACK_PUDDING || u.umonnum==PM_BROWN_PUDDING)) { /* This redundancy necessary because you have to *************** *** 895,900 **** --- 913,920 ---- hitmsg(mtmp, mattk); if (uncancelled) { pline("You're %s!", + youmonst.data == &mons[PM_WATER_ELEMENTAL] ? + "boiling" : mattk->aatyp == AT_HUGS ? "being roasted" : "on fire"); if (youmonst.data == &mons[PM_STRAW_GOLEM] || *************** *** 955,960 **** --- 975,981 ---- if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj*)0)) { if (!Blind) pline("%s blinds you!", Monnam(mtmp)); make_blinded(Blinded+(long)dmg,FALSE); + if (!Blind) Your(vision_clears); } dmg = 0; break; *************** *** 981,986 **** --- 1002,1008 ---- hitmsg(mtmp, mattk); if (defends(AD_DRIN, uwep) || !has_head(youmonst.data)) { You("don't seem harmed."); + /* Not clear what to do for green slimes */ break; } if (u_slip_free(mtmp,mattk)) break; *************** *** 1094,1100 **** } case AD_STON: /* cockatrice */ hitmsg(mtmp, mattk); ! if(!rn2(3) && !Stoned) { if (mtmp->mcan) { if (flags.soundok) You_hear("a cough from %s!", mon_nam(mtmp)); --- 1116,1122 ---- } case AD_STON: /* cockatrice */ hitmsg(mtmp, mattk); ! if(!rn2(3)) { if (mtmp->mcan) { if (flags.soundok) You_hear("a cough from %s!", mon_nam(mtmp)); *************** *** 1104,1110 **** if(!rn2(10) || (flags.moonphase == NEW_MOON && !have_lizard())) { do_stone: ! if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { Stoned = 5; --- 1126,1132 ---- if(!rn2(10) || (flags.moonphase == NEW_MOON && !have_lizard())) { do_stone: ! if (!Stoned && !Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { Stoned = 5; *************** *** 1203,1209 **** } break; } ! switch (steal(mtmp)) { case -1: return 2; case 0: --- 1225,1232 ---- } break; } ! buf[0] = '\0'; ! switch (steal(mtmp, buf)) { case -1: return 2; case 0: *************** *** 1211,1217 **** default: if (!is_animal(mtmp->data) && !tele_restrict(mtmp)) rloc(mtmp); ! mtmp->mflee = 1; return 3; } break; --- 1234,1252 ---- default: if (!is_animal(mtmp->data) && !tele_restrict(mtmp)) rloc(mtmp); ! if (is_animal(mtmp->data) && *buf) { ! /* set mavenge bit for animals so knights won't ! suffer an alignment penalty during retaliation; ! note that only happens when the thief succeeds ! in getting something (*buf != 0) */ ! mtmp->mavenge = 1; ! if (canseemon(mtmp)) ! pline("%s tries to %s away with %s.", ! Monnam(mtmp), ! locomotion(mtmp->data, "run"), ! buf); ! } ! monflee(mtmp, 0, FALSE, FALSE); return 3; } break; *************** *** 1251,1260 **** } hurtarmor(AD_RUST); break; ! case AD_CORRODE: hitmsg(mtmp, mattk); if (mtmp->mcan) break; ! hurtarmor(AD_CORRODE); break; case AD_DCAY: hitmsg(mtmp, mattk); --- 1286,1295 ---- } hurtarmor(AD_RUST); break; ! case AD_CORR: hitmsg(mtmp, mattk); if (mtmp->mcan) break; ! hurtarmor(AD_CORR); break; case AD_DCAY: hitmsg(mtmp, mattk); *************** *** 1303,1312 **** return 2; } else if (!rn2(33)) { if (!tele_restrict(mtmp)) rloc(mtmp); ! if (!mtmp->mflee) { ! mtmp->mflee = 1; ! mtmp->mfleetim = d(3,6); ! } return 3; } dmg = 0; --- 1338,1344 ---- return 2; } else if (!rn2(33)) { if (!tele_restrict(mtmp)) rloc(mtmp); ! monflee(mtmp, d(3, 6), TRUE, FALSE); return 3; } dmg = 0; *************** *** 1375,1381 **** else You("are getting confused."); make_confused(HConfusion + dmg, FALSE); } ! /* fall through to next case */ case AD_DETH: pline("%s reaches out with its deadly touch.", Monnam(mtmp)); if (is_undead(youmonst.data)) { --- 1407,1414 ---- else You("are getting confused."); make_confused(HConfusion + dmg, FALSE); } ! dmg = 0; ! break; case AD_DETH: pline("%s reaches out with its deadly touch.", Monnam(mtmp)); if (is_undead(youmonst.data)) { *************** *** 1383,1398 **** pline("Was that the touch of death?"); break; } ! if(!Antimagic && rn2(20) > 16) { ! killer_format = KILLED_BY_AN; ! killer = "touch of death"; ! done(DIED); ! } else { ! if(!rn2(5)) { ! if(Antimagic) shieldeff(u.ux, u.uy); ! pline("Lucky for you, it didn't work!"); dmg = 0; ! } else You_feel("your life force draining away..."); } break; case AD_PEST: --- 1416,1439 ---- pline("Was that the touch of death?"); break; } ! switch (rn2(20)) { ! case 19: case 18: case 17: ! if (!Antimagic) { ! killer_format = KILLED_BY_AN; ! killer = "touch of death"; ! done(DIED); dmg = 0; ! break; ! } /* else FALLTHRU */ ! default: /* case 16: ... case 5: */ ! You_feel("your life force draining away..."); ! permdmg = 1; /* actual damage done below */ ! break; ! case 4: case 3: case 2: case 1: case 0: ! if (Antimagic) shieldeff(u.ux, u.uy); ! pline("Lucky for you, it didn't work!"); ! dmg = 0; ! break; } break; case AD_PEST: *************** *** 1408,1443 **** /* plus the normal damage */ break; case AD_SLIM: ! hitmsg(mtmp, mattk); ! if (!uncancelled) break; ! if (youmonst.data == &mons[PM_FIRE_VORTEX] || ! youmonst.data == &mons[PM_FIRE_ELEMENTAL]) { ! pline_The("slime burns away!"); ! dmg = 0; ! } else if (Unchanging || ! youmonst.data == &mons[PM_GREEN_SLIME]) { ! You("are unaffected."); ! dmg = 0; ! } else if (!Slimed) { ! You("don't feel very well."); ! Slimed = 10L; killer_format = KILLED_BY_AN; delayed_killer = mtmp->data->mname; ! } else ! pline("Yuck!"); ! break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ ! hitmsg(mtmp, mattk); ! /* uncancelled is sufficient enough; please ! don't make this attack less frequent */ ! if (uncancelled) { ! struct obj *obj = some_armor(&youmonst); ! ! if (drain_item(obj)) { ! Your("%s less effective.", aobjnam(obj, "seem")); ! } ! } ! break; default: dmg = 0; break; } --- 1449,1486 ---- /* plus the normal damage */ break; case AD_SLIM: ! hitmsg(mtmp, mattk); ! if (!uncancelled) break; ! if (youmonst.data == &mons[PM_FIRE_VORTEX] || ! youmonst.data == &mons[PM_SALAMANDER] || ! youmonst.data == &mons[PM_FIRE_ELEMENTAL]) { ! pline_The("slime burns away!"); ! dmg = 0; ! } else if (Unchanging || ! youmonst.data == &mons[PM_GREEN_SLIME]) { ! You("are unaffected."); ! dmg = 0; ! } else if (!Slimed) { ! You("don't feel very well."); ! Slimed = 10L; ! flags.botl = 1; killer_format = KILLED_BY_AN; delayed_killer = mtmp->data->mname; ! } else ! pline("Yuck!"); ! break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ ! hitmsg(mtmp, mattk); ! /* uncancelled is sufficient enough; please ! don't make this attack less frequent */ ! if (uncancelled) { ! struct obj *obj = some_armor(&youmonst); ! ! if (drain_item(obj)) { ! Your("%s less effective.", aobjnam(obj, "seem")); ! } ! } ! break; default: dmg = 0; break; } *************** *** 1457,1471 **** || (Role_if(PM_PRIEST) && uarmh && is_quest_artifact(uarmh) && (is_undead(mtmp->data) || is_demon(mtmp->data)))) dmg = (dmg+1) / 2; mdamageu(mtmp, dmg); } ! if (dmg) { res = passiveum(olduasmon, mtmp, mattk); ! stop_occupation(); ! return res; ! } else ! return 1; } #endif /* OVL1 */ --- 1500,1548 ---- || (Role_if(PM_PRIEST) && uarmh && is_quest_artifact(uarmh) && (is_undead(mtmp->data) || is_demon(mtmp->data)))) dmg = (dmg+1) / 2; + + if (permdmg) { /* Death's life force drain */ + int lowerlimit, *hpmax_p; + /* + * Apply some of the damage to permanent hit points: + * polymorphed 100% against poly'd hpmax + * hpmax > 25*lvl 100% against normal hpmax + * hpmax > 10*lvl 50..100% + * hpmax > 5*lvl 25..75% + * otherwise 0..50% + * Never reduces hpmax below 1 hit point per level. + */ + permdmg = rn2(dmg / 2 + 1); + if (Upolyd || u.uhpmax > 25 * u.ulevel) permdmg = dmg; + else if (u.uhpmax > 10 * u.ulevel) permdmg += dmg / 2; + else if (u.uhpmax > 5 * u.ulevel) permdmg += dmg / 4; + + if (Upolyd) { + hpmax_p = &u.mhmax; + /* [can't use youmonst.m_lev] */ + lowerlimit = min((int)youmonst.data->mlevel, u.ulevel); + } else { + hpmax_p = &u.uhpmax; + lowerlimit = u.ulevel; + } + if (*hpmax_p - permdmg > lowerlimit) + *hpmax_p -= permdmg; + else if (*hpmax_p > lowerlimit) + *hpmax_p = lowerlimit; + else /* unlikely... */ + ; /* already at or below minimum threshold; do nothing */ + flags.botl = 1; + } + mdamageu(mtmp, dmg); } ! if (dmg) res = passiveum(olduasmon, mtmp, mattk); ! else ! res = 1; ! stop_occupation(); ! return res; } #endif /* OVL1 */ *************** *** 1519,1528 **** i = number_leashed(); if (i > 0) { ! pline_The("leash%s snap%s loose.", ! (i > 1) ? "es" : "", ! (i > 1) ? "" : "s"); ! unleash_all(); } if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) { --- 1596,1604 ---- i = number_leashed(); if (i > 0) { ! char *s = (i > 1) ? "leashes" : "leash"; ! pline_The("%s %s loose.", s, vtense(s, "snap")); ! unleash_all(); } if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) { *************** *** 1585,1590 **** --- 1661,1667 ---- if(!Blind) { You_cant("see in here!"); make_blinded((long)tmp,FALSE); + if (!Blind) Your(vision_clears); } else /* keep him blind until disgorged */ make_blinded(Blinded+1,FALSE); *************** *** 1700,1705 **** --- 1777,1783 ---- if (mon_visible(mtmp) || (rnd(tmp /= 2) > u.ulevel)) { You("are blinded by a blast of light!"); make_blinded((long)tmp, FALSE); + if (!Blind) Your(vision_clears); } else if (flags.verbose) You("get the impression it was not terribly bright."); } *************** *** 1726,1731 **** --- 1804,1810 ---- } } mondead(mtmp); + wake_nearto(mtmp->mx, mtmp->my, 7*7); if (mtmp->mhp > 0) return(0); return(2); /* it dies */ } *************** *** 1737,1749 **** { switch(mattk->adtyp) { case AD_STON: ! if (mtmp->mcan) { ! if (mtmp->data == &mons[PM_MEDUSA] && canseemon(mtmp)) ! pline("%s doesn't look all that ugly.", Monnam(mtmp)); break; } ! if(Reflecting && mtmp->mcansee && ! !mtmp->mcan && mtmp->data == &mons[PM_MEDUSA]) { if(!Blind) { (void) ureflects("%s gaze is reflected by your %s.", s_suffix(Monnam(mtmp))); --- 1816,1835 ---- { switch(mattk->adtyp) { case AD_STON: ! if (mtmp->mcan || !mtmp->mcansee) { ! if (mtmp->data == &mons[PM_MEDUSA] && canseemon(mtmp)) { ! if (mtmp->mcan) { ! pline("%s doesn't look all that ugly.", ! Monnam(mtmp)); ! break; ! } ! } ! if (canseemon(mtmp)) ! pline("%s gazes ineffectually.", Monnam(mtmp)); break; } ! if (Reflecting && canspotmon(mtmp) && ! mtmp->data == &mons[PM_MEDUSA]) { if(!Blind) { (void) ureflects("%s gaze is reflected by your %s.", s_suffix(Monnam(mtmp))); *************** *** 1753,1759 **** if (!m_canseeu(mtmp)) { /* probably you're invisible */ pline("%s doesn't seem to notice that %s gaze was reflected.", Monnam(mtmp), ! his[pronoun_gender(mtmp)]); break; } pline("%s is turned to stone!", Monnam(mtmp)); --- 1839,1845 ---- if (!m_canseeu(mtmp)) { /* probably you're invisible */ pline("%s doesn't seem to notice that %s gaze was reflected.", Monnam(mtmp), ! mhis(mtmp)); break; } pline("%s is turned to stone!", Monnam(mtmp)); *************** *** 1764,1782 **** if (mtmp->mhp > 0) break; return 2; } ! if (canseemon(mtmp) && !Stone_resistance) { You("meet %s gaze.", s_suffix(mon_nam(mtmp))); if(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) break; You("turn to stone..."); killer_format = KILLED_BY; ! killer = mons[PM_MEDUSA].mname; done(STONING); } break; case AD_CONF: ! if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && ! !mtmp->mspec_used && rn2(5)) { int conf = d(3,4); mtmp->mspec_used = mtmp->mspec_used + (conf + rn2(6)); --- 1850,1871 ---- if (mtmp->mhp > 0) break; return 2; } ! if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my) && ! !Stone_resistance) { You("meet %s gaze.", s_suffix(mon_nam(mtmp))); + stop_occupation(); if(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) break; You("turn to stone..."); killer_format = KILLED_BY; ! killer = mtmp->data->mname; done(STONING); } break; case AD_CONF: ! if(!mtmp->mcan && canseemon(mtmp) && ! couldsee(mtmp->mx, mtmp->my) && ! mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { int conf = d(3,4); mtmp->mspec_used = mtmp->mspec_used + (conf + rn2(6)); *************** *** 1786,1837 **** else You("are getting more and more confused."); make_confused(HConfusion + conf, FALSE); } break; case AD_STUN: ! if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && ! !mtmp->mspec_used && rn2(5)) { int stun = d(2,6); mtmp->mspec_used = mtmp->mspec_used + (stun + rn2(6)); make_stunned(HStun + stun, TRUE); pline("%s stares piercingly at you!", Monnam(mtmp)); } break; case AD_BLND: if (!mtmp->mcan && canseemon(mtmp) && !resists_blnd(&youmonst) && distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) { int blnd = d((int)mattk->damn, (int)mattk->damd); ! make_blinded((long)blnd,FALSE); ! make_stunned((long)d(1,3),TRUE); You("are blinded by %s radiance!", s_suffix(mon_nam(mtmp))); } break; case AD_FIRE: ! if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && ! !mtmp->mspec_used && rn2(5)) { ! int dmg = d(2,6); ! pline("%s attacks you with a fiery gaze!", ! Monnam(mtmp)); ! if (Fire_resistance) { ! pline_The("fire doesn't feel hot!"); ! dmg = 0; ! } ! burn_away_slime(); ! if((int) mtmp->m_lev > rn2(20)) ! destroy_item(SCROLL_CLASS, AD_FIRE); ! if((int) mtmp->m_lev > rn2(20)) ! destroy_item(POTION_CLASS, AD_FIRE); ! if((int) mtmp->m_lev > rn2(25)) ! destroy_item(SPBOOK_CLASS, AD_FIRE); ! if (dmg) mdamageu(mtmp, dmg); ! } break; #ifdef PM_BEHOLDER /* work in progress */ case AD_SLEE: ! if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && multi >= 0 && !rn2(5) && !Sleep_resistance) { fall_asleep(-rnd(10), TRUE); pline("%s gaze makes you very sleepy...", s_suffix(Monnam(mtmp))); --- 1875,1939 ---- else You("are getting more and more confused."); make_confused(HConfusion + conf, FALSE); + stop_occupation(); } break; case AD_STUN: ! if(!mtmp->mcan && canseemon(mtmp) && ! couldsee(mtmp->mx, mtmp->my) && ! mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { int stun = d(2,6); mtmp->mspec_used = mtmp->mspec_used + (stun + rn2(6)); make_stunned(HStun + stun, TRUE); pline("%s stares piercingly at you!", Monnam(mtmp)); + stop_occupation(); } break; case AD_BLND: if (!mtmp->mcan && canseemon(mtmp) && !resists_blnd(&youmonst) && distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) { int blnd = d((int)mattk->damn, (int)mattk->damd); ! You("are blinded by %s radiance!", s_suffix(mon_nam(mtmp))); + make_blinded((long)blnd,FALSE); + stop_occupation(); + /* not blind at this point implies you're wearing + the Eyes of the Overworld; make them block this + particular stun attack too */ + if (!Blind) Your(vision_clears); + else make_stunned((long)d(1,3),TRUE); } break; case AD_FIRE: ! if (!mtmp->mcan && canseemon(mtmp) && ! couldsee(mtmp->mx, mtmp->my) && ! mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { ! int dmg = d(2,6); ! ! pline("%s attacks you with a fiery gaze!", Monnam(mtmp)); ! stop_occupation(); ! if (Fire_resistance) { ! pline_The("fire doesn't feel hot!"); ! dmg = 0; ! } ! burn_away_slime(); ! if ((int) mtmp->m_lev > rn2(20)) ! destroy_item(SCROLL_CLASS, AD_FIRE); ! if ((int) mtmp->m_lev > rn2(20)) ! destroy_item(POTION_CLASS, AD_FIRE); ! if ((int) mtmp->m_lev > rn2(25)) ! destroy_item(SPBOOK_CLASS, AD_FIRE); ! if (dmg) mdamageu(mtmp, dmg); ! } break; #ifdef PM_BEHOLDER /* work in progress */ case AD_SLEE: ! if(!mtmp->mcan && canseemon(mtmp) && ! couldsee(mtmp->mx, mtmp->my) && mtmp->mcansee && multi >= 0 && !rn2(5) && !Sleep_resistance) { + fall_asleep(-rnd(10), TRUE); pline("%s gaze makes you very sleepy...", s_suffix(Monnam(mtmp))); *************** *** 1841,1847 **** --- 1943,1951 ---- if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && (HFast & (INTRINSIC|TIMEOUT)) && !defends(AD_SLOW, uwep) && !rn2(4)) + u_slow_down(); + stop_occupation(); break; #endif default: impossible("Gaze attack %d?", mattk->adtyp); *************** *** 1880,1886 **** boolean is_acid; if (!mon || !obj) return; /* just in case */ ! if (dmgtype(youmonst.data, AD_CORRODE)) is_acid = TRUE; else if (dmgtype(youmonst.data, AD_RUST)) is_acid = FALSE; --- 1984,1990 ---- boolean is_acid; if (!mon || !obj) return; /* just in case */ ! if (dmgtype(youmonst.data, AD_CORR)) is_acid = TRUE; else if (dmgtype(youmonst.data, AD_RUST)) is_acid = FALSE; *************** *** 1978,1984 **** if (mon->mcan || mon->mspec_used) { pline("%s acts as though %s has got a %sheadache.", ! Monnam(mon), he[pronoun_gender(mon)], mon->mcan ? "severe " : ""); return 0; } --- 2082,2088 ---- if (mon->mcan || mon->mspec_used) { pline("%s acts as though %s has got a %sheadache.", ! Monnam(mon), mhe(mon), mon->mcan ? "severe " : ""); return 0; } *************** *** 2064,2070 **** else pline("%s murmurs in your ear, while helping you undress.", Blind ? (fem ? "She" : "He") : Monnam(mon)); ! mayberem(uarmc, "cloak"); if(!uarmc) mayberem(uarm, "suit"); mayberem(uarmf, "boots"); --- 2168,2174 ---- else pline("%s murmurs in your ear, while helping you undress.", Blind ? (fem ? "She" : "He") : Monnam(mon)); ! mayberem(uarmc, cloak_simple_name(uarmc)); if(!uarmc) mayberem(uarm, "suit"); mayberem(uarmf, "boots"); *************** *** 2088,2098 **** /* by this point you have discovered mon's identity, blind or not... */ pline("Time stands still while you and %s lie in each other's arms...", ! mon_nam(mon)); if (rn2(35) > ACURR(A_CHA) + ACURR(A_INT)) { /* Don't bother with mspec_used here... it didn't get tired! */ pline("%s seems to have enjoyed it more than you...", ! Monnam(mon)); switch (rn2(5)) { case 0: You_feel("drained of energy."); u.uen = 0; --- 2192,2202 ---- /* by this point you have discovered mon's identity, blind or not... */ pline("Time stands still while you and %s lie in each other's arms...", ! noit_mon_nam(mon)); if (rn2(35) > ACURR(A_CHA) + ACURR(A_INT)) { /* Don't bother with mspec_used here... it didn't get tired! */ pline("%s seems to have enjoyed it more than you...", ! noit_Monnam(mon)); switch (rn2(5)) { case 0: You_feel("drained of energy."); u.uen = 0; *************** *** 2130,2172 **** } } else { mon->mspec_used = rnd(100); /* monster is worn out */ ! You("seem to have enjoyed it more than %s...", mon_nam(mon)); switch (rn2(5)) { ! case 0: You_feel("raised to your full potential."); ! exercise(A_CON, TRUE); ! u.uen = (u.uenmax += rnd(5)); ! break; ! case 1: You_feel("good enough to do it again."); ! (void) adjattrib(A_CON, 1, TRUE); ! exercise(A_CON, TRUE); ! flags.botl = 1; ! break; ! case 2: You("will always remember %s...", mon_nam(mon)); ! (void) adjattrib(A_WIS, 1, TRUE); ! exercise(A_WIS, TRUE); ! flags.botl = 1; ! break; ! case 3: pline("That was a very educational experience."); ! pluslvl(FALSE); ! exercise(A_WIS, TRUE); ! break; ! case 4: You_feel("restored to health!"); ! u.uhp = u.uhpmax; ! if (Upolyd) u.mh = u.mhmax; ! exercise(A_STR, TRUE); ! flags.botl = 1; ! break; } } if (mon->mtame) /* don't charge */ ; else if (rn2(20) < ACURR(A_CHA)) { pline("%s demands that you pay %s, but you refuse...", ! Monnam(mon), him[fem]); } else if (u.umonnum == PM_LEPRECHAUN) pline("%s tries to take your money, but fails...", ! Monnam(mon)); else { long cost; if (u.ugold > (long)LARGEST_INT - 10L) --- 2234,2279 ---- } } else { mon->mspec_used = rnd(100); /* monster is worn out */ ! You("seem to have enjoyed it more than %s...", ! noit_mon_nam(mon)); switch (rn2(5)) { ! case 0: You_feel("raised to your full potential."); ! exercise(A_CON, TRUE); ! u.uen = (u.uenmax += rnd(5)); ! break; ! case 1: You_feel("good enough to do it again."); ! (void) adjattrib(A_CON, 1, TRUE); ! exercise(A_CON, TRUE); ! flags.botl = 1; ! break; ! case 2: You("will always remember %s...", noit_mon_nam(mon)); ! (void) adjattrib(A_WIS, 1, TRUE); ! exercise(A_WIS, TRUE); ! flags.botl = 1; ! break; ! case 3: pline("That was a very educational experience."); ! pluslvl(FALSE); ! exercise(A_WIS, TRUE); ! break; ! case 4: You_feel("restored to health!"); ! u.uhp = u.uhpmax; ! if (Upolyd) u.mh = u.mhmax; ! exercise(A_STR, TRUE); ! flags.botl = 1; ! break; } } if (mon->mtame) /* don't charge */ ; else if (rn2(20) < ACURR(A_CHA)) { pline("%s demands that you pay %s, but you refuse...", ! noit_Monnam(mon), ! Blind ? (fem ? "her" : "him") : mhim(mon)); } else if (u.umonnum == PM_LEPRECHAUN) pline("%s tries to take your money, but fails...", ! noit_Monnam(mon)); else { + #ifndef GOLDOBJ long cost; if (u.ugold > (long)LARGEST_INT - 10L) *************** *** 2180,2191 **** if (cost > u.ugold) cost = u.ugold; if (!cost) verbalize("It's on the house!"); else { ! pline("%s takes %ld zorkmid%s for services rendered!", ! Monnam(mon), cost, plur(cost)); u.ugold -= cost; mon->mgold += cost; flags.botl = 1; } } if (!rn2(25)) mon->mcan = 1; /* monster is worn out */ if (!tele_restrict(mon)) rloc(mon); --- 2287,2319 ---- if (cost > u.ugold) cost = u.ugold; if (!cost) verbalize("It's on the house!"); else { ! pline("%s takes %ld %s for services rendered!", ! noit_Monnam(mon), cost, currency(cost)); u.ugold -= cost; mon->mgold += cost; flags.botl = 1; } + #else + long cost; + long umoney = money_cnt(invent); + + if (umoney > (long)LARGEST_INT - 10L) + cost = (long) rnd(LARGEST_INT) + 500L; + else + cost = (long) rnd((int)umoney + 10) + 500L; + if (mon->mpeaceful) { + cost /= 5L; + if (!cost) cost = 1L; + } + if (cost > umoney) cost = umoney; + if (!cost) verbalize("It's on the house!"); + else { + pline("%s takes %ld %s for services rendered!", + noit_Monnam(mon), cost, currency(cost)); + money2mon(mon, cost); + flags.botl = 1; + } + #endif } if (!rn2(25)) mon->mcan = 1; /* monster is worn out */ if (!tele_restrict(mon)) rloc(mon); *************** *** 2262,2275 **** } } else tmp = 0; if (!rn2(30)) erode_armor(mtmp, TRUE); ! if (!rn2(6)) erode_weapon(MON_WEP(mtmp), TRUE); goto assess_dmg; case AD_STON: /* cockatrice */ if (!resists_ston(mtmp) && (mattk->aatyp != AT_WEAP || !MON_WEP(mtmp)) && mattk->aatyp != AT_GAZE && mattk->aatyp != AT_EXPL && mattk->aatyp != AT_MAGC && ! !(mtmp->misc_worn_check & W_ARMG)) { if(poly_when_stoned(mtmp->data)) { mon_to_stone(mtmp); return (1); --- 2390,2407 ---- } } else tmp = 0; if (!rn2(30)) erode_armor(mtmp, TRUE); ! if (!rn2(6)) erode_obj(MON_WEP(mtmp), TRUE, TRUE); goto assess_dmg; case AD_STON: /* cockatrice */ + { + int protector = + mattk->aatyp == AT_TENT ? 0 : + mattk->aatyp == AT_KICK ? W_ARMF : W_ARMG; if (!resists_ston(mtmp) && (mattk->aatyp != AT_WEAP || !MON_WEP(mtmp)) && mattk->aatyp != AT_GAZE && mattk->aatyp != AT_EXPL && mattk->aatyp != AT_MAGC && ! !(mtmp->misc_worn_check & protector)) { if(poly_when_stoned(mtmp->data)) { mon_to_stone(mtmp); return (1); *************** *** 2281,2286 **** --- 2413,2419 ---- return 2; } return 1; + } case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ if (otmp) { (void) drain_item(otmp); *************** *** 2345,2351 **** case AD_STUN: /* Yellow mold */ if (!mtmp->mstun) { mtmp->mstun = 1; ! pline("%s staggers.", Monnam(mtmp)); } tmp = 0; break; --- 2478,2485 ---- case AD_STUN: /* Yellow mold */ if (!mtmp->mstun) { mtmp->mstun = 1; ! pline("%s %s.", Monnam(mtmp), ! makeplural(stagger(mtmp->data, "stagger"))); } tmp = 0; break; *** nethack-3.3.1/src/minion.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/minion.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)minion.c 3.3 2000/06/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)minion.c 3.4 2002/01/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 11,17 **** register struct permonst *ptr; { register int dtype = NON_PM, cnt = 0; ! aligntyp atyp = sgn(ptr->maligntyp); if (is_dprince(ptr) || (ptr == &mons[PM_WIZARD_OF_YENDOR])) { dtype = (!rn2(20)) ? dprince(atyp) : --- 11,17 ---- register struct permonst *ptr; { register int dtype = NON_PM, cnt = 0; ! aligntyp atyp = (ptr->maligntyp==A_NONE) ? A_NONE : sgn(ptr->maligntyp); if (is_dprince(ptr) || (ptr == &mons[PM_WIZARD_OF_YENDOR])) { dtype = (!rn2(20)) ? dprince(atyp) : *************** *** 131,143 **** if (!tele_restrict(mtmp)) rloc(mtmp); return(1); } demand = (u.ugold * (rnd(80) + 20 * Athome)) / ! 100 * (1 + (sgn(u.ualign.type) == sgn(mtmp->data->maligntyp))); if (!demand) /* you have no gold */ return mtmp->mpeaceful = 0; else { ! pline("%s demands %ld zorkmid%s for safe passage.", ! Amonnam(mtmp), demand, plur(demand)); if ((offer = bribe(mtmp)) >= demand) { pline("%s vanishes, laughing about cowardly mortals.", --- 131,147 ---- if (!tele_restrict(mtmp)) rloc(mtmp); return(1); } + #ifndef GOLDOBJ demand = (u.ugold * (rnd(80) + 20 * Athome)) / ! #else ! demand = (money_cnt(invent) * (rnd(80) + 20 * Athome)) / ! #endif ! (100 * (1 + (sgn(u.ualign.type) == sgn(mtmp->data->maligntyp)))); if (!demand) /* you have no gold */ return mtmp->mpeaceful = 0; else { ! pline("%s demands %ld %s for safe passage.", ! Amonnam(mtmp), demand, currency(demand)); if ((offer = bribe(mtmp)) >= demand) { pline("%s vanishes, laughing about cowardly mortals.", *************** *** 162,187 **** { char buf[BUFSZ]; long offer; getlin("How much will you offer?", buf); ! (void) sscanf(buf, "%ld", &offer); /*Michael Paddon -- fix for negative offer to monster*/ /*JAR880815 - */ if (offer < 0L) { You("try to shortchange %s, but fumble.", mon_nam(mtmp)); ! offer = 0L; } else if (offer == 0L) { You("refuse."); } else if (offer >= u.ugold) { You("give %s all your gold.", mon_nam(mtmp)); offer = u.ugold; ! } else You("give %s %ld zorkmid%s.", mon_nam(mtmp), offer, ! plur(offer)); ! u.ugold -= offer; mtmp->mgold += offer; flags.botl = 1; return(offer); } --- 166,205 ---- { char buf[BUFSZ]; long offer; + #ifdef GOLDOBJ + long umoney = money_cnt(invent); + #endif getlin("How much will you offer?", buf); ! if (sscanf(buf, "%ld", &offer) != 1) offer = 0L; /*Michael Paddon -- fix for negative offer to monster*/ /*JAR880815 - */ if (offer < 0L) { You("try to shortchange %s, but fumble.", mon_nam(mtmp)); ! return 0L; } else if (offer == 0L) { You("refuse."); + return 0L; + #ifndef GOLDOBJ } else if (offer >= u.ugold) { You("give %s all your gold.", mon_nam(mtmp)); offer = u.ugold; ! } else { ! You("give %s %ld %s.", mon_nam(mtmp), offer, currency(offer)); ! } u.ugold -= offer; mtmp->mgold += offer; + #else + } else if (offer >= umoney) { + You("give %s all your gold.", mon_nam(mtmp)); + offer = umoney; + } else { + You("give %s %ld %s.", mon_nam(mtmp), offer, currency(offer)); + } + (void) money2mon(mtmp, offer); + #endif flags.botl = 1; return(offer); } *** nethack-3.3.1/src/mklev.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mklev.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mklev.c 3.3 99/04/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mklev.c 3.4 2001/11/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 34,40 **** --- 34,42 ---- STATIC_DCL boolean FDECL(place_niche,(struct mkroom *,int*,int*,int*)); STATIC_DCL void FDECL(makeniche,(int)); STATIC_DCL void NDECL(make_niches); + STATIC_PTR int FDECL(do_comp,(const genericptr,const genericptr)); + STATIC_DCL void FDECL(dosdoor,(XCHAR_P,XCHAR_P,struct mkroom *,int)); STATIC_DCL void FDECL(join,(int,int,BOOLEAN_P)); STATIC_DCL void FDECL(do_room_or_subroom, (struct mkroom *,int,int,int,int, *************** *** 498,505 **** dosdoor(xx, yy, aroom, rn2(5) ? SDOOR : DOOR); else { if (!level.flags.noteleport) ! (void) mksobj_at(SCR_TELEPORTATION, xx, yy+dy, TRUE); ! if(!rn2(3)) (void) mkobj_at(0, xx, yy+dy, TRUE); } } return; --- 500,508 ---- dosdoor(xx, yy, aroom, rn2(5) ? SDOOR : DOOR); else { if (!level.flags.noteleport) ! (void) mksobj_at(SCR_TELEPORTATION, ! xx, yy+dy, TRUE, FALSE); ! if (!rn2(3)) (void) mkobj_at(0, xx, yy+dy, TRUE); } } return; *************** *** 761,768 **** x = somex(croom); y = somey(croom); tmonst = makemon((struct permonst *) 0, x,y,NO_MM_FLAGS); if (tmonst && tmonst->data == &mons[PM_GIANT_SPIDER] && ! !is_pool(x,y)) ! (void) maketrap (x,y,WEB); } /* put traps and mimics inside */ goldseen = FALSE; --- 764,771 ---- x = somex(croom); y = somey(croom); tmonst = makemon((struct permonst *) 0, x,y,NO_MM_FLAGS); if (tmonst && tmonst->data == &mons[PM_GIANT_SPIDER] && ! !occupied(x, y)) ! (void) maketrap(x, y, WEB); } /* put traps and mimics inside */ goldseen = FALSE; *************** *** 796,802 **** */ if(!rn2(nroom * 5 / 2)) (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, ! somex(croom), somey(croom), TRUE); /* maybe make some graffiti */ if(!rn2(27 + 3 * abs(depth(&u.uz)))) { --- 799,805 ---- */ if(!rn2(nroom * 5 / 2)) (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, ! somex(croom), somey(croom), TRUE, FALSE); /* maybe make some graffiti */ if(!rn2(27 + 3 * abs(depth(&u.uz)))) { *************** *** 848,854 **** for (y = 1; y < (ROWNO - 1); y++) if ((levl[x][y].typ == POOL && !rn2(10)) || (levl[x][y].typ == MOAT && !rn2(30))) ! (void)mksobj_at(KELP_FROND, x, y, TRUE); /* determine if it is even allowed; almost all special levels are excluded */ --- 851,857 ---- for (y = 1; y < (ROWNO - 1); y++) if ((levl[x][y].typ == POOL && !rn2(10)) || (levl[x][y].typ == MOAT && !rn2(30))) ! (void) mksobj_at(KELP_FROND, x, y, TRUE, FALSE); /* determine if it is even allowed; almost all special levels are excluded */ *************** *** 1403,1409 **** } /* Leave a bell, in case we accidentally buried someone alive */ ! if (dobell) (void) mksobj_at(BELL, m.x, m.y, TRUE); return; } --- 1406,1412 ---- } /* Leave a bell, in case we accidentally buried someone alive */ ! if (dobell) (void) mksobj_at(BELL, m.x, m.y, TRUE, FALSE); return; } *** nethack-3.3.1/src/mkmap.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mkmap.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mkmap.c 3.3 96/05/23 */ /* Copyright (c) J. C. Collet, M. Stephenson and D. Cohrs, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mkmap.c 3.4 1996/05/23 */ /* Copyright (c) J. C. Collet, M. Stephenson and D. Cohrs, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 348,353 **** --- 348,354 ---- for(j=0; jrndlevs) { + char *ep = getenv("SPLEVTYPE"); /* not nh_getenv */ + if (ep) { + /* rindex always succeeds due to code in prior block */ + int len = (rindex(protofile, '-') - protofile) + 1; + + while (ep && *ep) { + if (!strncmp(ep, protofile, len)) { + int pick = atoi(ep + len); + /* use choice only if valid */ + if (pick > 0 && pick <= (int) sp->rndlevs) + Sprintf(protofile + len, "%d", pick); + break; + } else { + ep = index(ep, ','); + if (ep) ++ep; + } + } + } + } + #endif + if(*protofile) { Strcat(protofile, LEV_EXT); if(load_special(protofile)) { fixup_special(); /* some levels can end up with monsters ! on dead mon list, including light source monsters */ dmonsfree(); return; /* no mazification right now */ } *************** *** 540,546 **** maze0xy(&mm); walkfrom((int) mm.x, (int) mm.y); /* put a boulder at the maze center */ ! (void) mksobj_at(BOULDER, (int) mm.x, (int) mm.y, TRUE); #ifdef WALLIFIED_MAZE wallification(2, 2, x_maze_max, y_maze_max); --- 566,572 ---- maze0xy(&mm); walkfrom((int) mm.x, (int) mm.y); /* put a boulder at the maze center */ ! (void) mksobj_at(BOULDER, (int) mm.x, (int) mm.y, TRUE, FALSE); #ifdef WALLIFIED_MAZE wallification(2, 2, x_maze_max, y_maze_max); *************** *** 603,609 **** } for(x = rn1(10,2); x; x--) { mazexy(&mm); ! (void) mksobj_at(BOULDER, mm.x, mm.y, TRUE); } for (x = rn2(3); x; x--) { mazexy(&mm); --- 629,635 ---- } for(x = rn1(10,2); x; x--) { mazexy(&mm); ! (void) mksobj_at(BOULDER, mm.x, mm.y, TRUE, FALSE); } for (x = rn2(3); x; x--) { mazexy(&mm); *************** *** 880,903 **** /* to ease the work of debuggers at this stage */ #define register - struct container { - struct container *next; - xchar x, y; - short what; - genericptr_t list; - }; #define CONS_OBJ 0 #define CONS_MON 1 #define CONS_HERO 2 #define CONS_TRAP 3 ! static struct bubble { ! xchar x, y; /* coordinates of the upper left corner */ ! schar dx, dy; /* the general direction of the bubble's movement */ ! uchar *bm; /* pointer to the bubble bit mask */ ! struct bubble *prev, *next; /* need to traverse the list up and down */ ! struct container *cons; ! } *bbubbles, *ebubbles; static struct trap *wportal; static int xmin, ymin, xmax, ymax; /* level boundaries */ --- 906,917 ---- /* to ease the work of debuggers at this stage */ #define register #define CONS_OBJ 0 #define CONS_MON 1 #define CONS_HERO 2 #define CONS_TRAP 3 ! static struct bubble *bbubbles, *ebubbles; static struct trap *wportal; static int xmin, ymin, xmax, ymax; /* level boundaries */ *** nethack-3.3.1/src/mkobj.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mkobj.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mkobj.c 3.3 2000/02/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mkobj.c 3.4 2001/12/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 78,103 **** }; struct obj * ! mkobj_at(let,x,y, artif) char let; ! int x,y; boolean artif; { ! register struct obj *otmp; ! otmp = mkobj(let,artif); place_object(otmp, x, y); return(otmp); } struct obj * ! mksobj_at(otyp,x,y,init) ! int otyp,x,y; ! boolean init; { ! register struct obj *otmp; ! otmp = mksobj(otyp,init,TRUE); place_object(otmp, x, y); return(otmp); } --- 78,103 ---- }; struct obj * ! mkobj_at(let, x, y, artif) char let; ! int x, y; boolean artif; { ! struct obj *otmp; ! otmp = mkobj(let, artif); place_object(otmp, x, y); return(otmp); } struct obj * ! mksobj_at(otyp, x, y, init, artif) ! int otyp, x, y; ! boolean init, artif; { ! struct obj *otmp; ! otmp = mksobj(otyp, init, artif); place_object(otmp, x, y); return(otmp); } *************** *** 107,113 **** char oclass; boolean artif; { ! register int tprob, i, prob = rnd(1000); if(oclass == RANDOM_CLASS) { const struct icp *iprobs = --- 107,113 ---- char oclass; boolean artif; { ! int tprob, i, prob = rnd(1000); if(oclass == RANDOM_CLASS) { const struct icp *iprobs = *************** *** 138,158 **** struct obj *box; { register int n; ! register struct obj *otmp, *gold = 0; box->cobj = (struct obj *) 0; ! switch(box->otyp) { ! case ICE_BOX: n = 20; break; ! case CHEST: n = 5; break; ! case LARGE_BOX: n = 3; break; ! case SACK: ! case OILSKIN_SACK: /* initial inventory: sack starts out empty */ if (moves <= 1 && !in_mklev) { n = 0; break; } /*else FALLTHRU*/ ! case BAG_OF_HOLDING: n = 1; break; ! default: n = 0; break; } for (n = rn2(n+1); n > 0; n--) { --- 138,158 ---- struct obj *box; { register int n; ! register struct obj *otmp; box->cobj = (struct obj *) 0; ! switch (box->otyp) { ! case ICE_BOX: n = 20; break; ! case CHEST: n = 5; break; ! case LARGE_BOX: n = 3; break; ! case SACK: ! case OILSKIN_SACK: /* initial inventory: sack starts out empty */ if (moves <= 1 && !in_mklev) { n = 0; break; } /*else FALLTHRU*/ ! case BAG_OF_HOLDING: n = 1; break; ! default: n = 0; break; } for (n = rn2(n+1); n > 0; n--) { *************** *** 178,190 **** if (otmp->oclass == GOLD_CLASS) { /* 2.5 x level's usual amount; weight adjusted below */ otmp->quan = (long)(rnd(level_difficulty()+2) * rnd(75)); ! if (gold) { /* gold already in this box */ ! gold->quan += otmp->quan; /* merge */ ! dealloc_obj(otmp); /* note: not yet in any chain */ ! continue; ! } else { ! gold = otmp; /* remember this object */ ! } } else while (otmp->otyp == ROCK) { otmp->otyp = rnd_class(DILITHIUM_CRYSTAL, LOADSTONE); if (otmp->quan > 2L) otmp->quan = 1L; --- 178,184 ---- if (otmp->oclass == GOLD_CLASS) { /* 2.5 x level's usual amount; weight adjusted below */ otmp->quan = (long)(rnd(level_difficulty()+2) * rnd(75)); ! otmp->owt = weight(otmp); } else while (otmp->otyp == ROCK) { otmp->otyp = rnd_class(DILITHIUM_CRYSTAL, LOADSTONE); if (otmp->quan > 2L) otmp->quan = 1L; *************** *** 199,208 **** otmp->otyp = rnd_class(WAN_LIGHT, WAN_LIGHTNING); } } ! add_to_container(box, otmp); } - if (gold) gold->owt = weight(gold); /* quantity was diddled */ - return; } int --- 193,200 ---- otmp->otyp = rnd_class(WAN_LIGHT, WAN_LIGHTNING); } } ! (void) add_to_container(box, otmp); } } int *************** *** 225,234 **** } /* ! * Split obj so that it gets size num. The remainder is put in the object ! * structure delivered by this call. The object is positioned just ! * following the original in the nobj chain (and nexthere chain when on ! * the floor). */ struct obj * splitobj(obj, num) --- 217,226 ---- } /* ! * Split obj so that it gets size gets reduced by num. The quantity num is ! * put in the object structure delivered by this call. The returned object ! * has its wornmask cleared and is positioned just following the original ! * in the nobj chain (and nexthere chain when on the floor). */ struct obj * splitobj(obj, num) *************** *** 237,243 **** { struct obj *otmp; ! if (obj->cobj || num <= 0L || obj->quan < num) panic("splitobj"); /* can't split containers */ otmp = newobj(obj->oxlth + obj->onamelth); *otmp = *obj; /* copies whole structure */ --- 229,235 ---- { struct obj *otmp; ! if (obj->cobj || num <= 0L || obj->quan <= num) panic("splitobj"); /* can't split containers */ otmp = newobj(obj->oxlth + obj->onamelth); *otmp = *obj; /* copies whole structure */ *************** *** 245,253 **** if (!otmp->o_id) otmp->o_id = flags.ident++; /* ident overflowed */ otmp->timed = 0; /* not timed, yet */ otmp->lamplit = 0; /* ditto */ ! obj->quan = num; obj->owt = weight(obj); ! otmp->quan -= num; otmp->owt = weight(otmp); /* -= obj->owt ? */ obj->nobj = otmp; /* Only set nexthere when on the floor, nexthere is also used */ --- 237,246 ---- if (!otmp->o_id) otmp->o_id = flags.ident++; /* ident overflowed */ otmp->timed = 0; /* not timed, yet */ otmp->lamplit = 0; /* ditto */ ! otmp->owornmask = 0L; /* new object isn't worn */ ! obj->quan -= num; obj->owt = weight(obj); ! otmp->quan = num; otmp->owt = weight(otmp); /* -= obj->owt ? */ obj->nobj = otmp; /* Only set nexthere when on the floor, nexthere is also used */ *************** *** 452,465 **** case SLIME_MOLD: otmp->spe = current_fruit; break; } ! if (otmp->otyp == CORPSE || otmp->otyp == MEAT_RING) break; /* fall into next case */ case GEM_CLASS: if (otmp->otyp == LOADSTONE) curse(otmp); else if (otmp->otyp == ROCK) otmp->quan = (long) rn1(6,6); - else if (otmp->otyp == KELP_FROND) otmp->quan = (long) rnd(2); else if (otmp->otyp != LUCKSTONE && !rn2(6)) otmp->quan = 2L; else otmp->quan = 1L; break; --- 445,461 ---- case SLIME_MOLD: otmp->spe = current_fruit; break; + case KELP_FROND: + otmp->quan = (long) rnd(2); + break; } ! if (otmp->otyp == CORPSE || otmp->otyp == MEAT_RING || ! otmp->otyp == KELP_FROND) break; /* fall into next case */ case GEM_CLASS: if (otmp->otyp == LOADSTONE) curse(otmp); else if (otmp->otyp == ROCK) otmp->quan = (long) rn1(6,6); else if (otmp->otyp != LUCKSTONE && !rn2(6)) otmp->quan = 2L; else otmp->quan = 1L; break; *************** *** 609,615 **** otmp->corpsenm = rndmonnum(); if (!verysmall(&mons[otmp->corpsenm]) && rn2(level_difficulty()/2 + 10) > 10) ! add_to_container(otmp, mkobj(SPBOOK_CLASS,FALSE)); } break; case GOLD_CLASS: --- 605,612 ---- otmp->corpsenm = rndmonnum(); if (!verysmall(&mons[otmp->corpsenm]) && rn2(level_difficulty()/2 + 10) > 10) ! (void) add_to_container(otmp, ! mkobj(SPBOOK_CLASS,FALSE)); } break; case GOLD_CLASS: *************** *** 627,653 **** } /* ! * Start a corpse decay or revive timer. This assumes that the corpse ! * was just dropped and its age is 0. */ void start_corpse_timeout(body) struct obj *body; { ! long when; int rot_adjust; short action; #define TAINT_AGE (50L) /* age when corpses go bad */ #define TROLL_REVIVE_CHANCE 37 /* 1/37 chance for 50 turns ~ 75% chance */ ! #define ROT_AGE (250L) /* age when corpses rot away */ /* lizards and lichen don't rot or revive */ if (body->corpsenm == PM_LIZARD || body->corpsenm == PM_LICHEN) return; action = ROT_CORPSE; /* default action: rot away */ - when = ROT_AGE; /* rot away when this old */ rot_adjust = in_mklev ? 25 : 10; /* give some variation */ when += (long)(rnz(rot_adjust) - rot_adjust); if (is_rider(&mons[body->corpsenm])) { --- 624,655 ---- } /* ! * Start a corpse decay or revive timer. ! * This takes the age of the corpse into consideration as of 3.4.0. */ void start_corpse_timeout(body) struct obj *body; { ! long when; /* rot away when this old */ ! long corpse_age; /* age of corpse */ int rot_adjust; short action; #define TAINT_AGE (50L) /* age when corpses go bad */ #define TROLL_REVIVE_CHANCE 37 /* 1/37 chance for 50 turns ~ 75% chance */ ! #define ROT_AGE (250L) /* age when corpses rot away */ /* lizards and lichen don't rot or revive */ if (body->corpsenm == PM_LIZARD || body->corpsenm == PM_LICHEN) return; action = ROT_CORPSE; /* default action: rot away */ rot_adjust = in_mklev ? 25 : 10; /* give some variation */ + corpse_age = monstermoves - body->age; + if (corpse_age > ROT_AGE) + when = rot_adjust; + else + when = ROT_AGE - corpse_age; when += (long)(rnz(rot_adjust) - rot_adjust); if (is_rider(&mons[body->corpsenm])) { *************** *** 659,665 **** for (when = 12L; when < 500L; when++) if (!rn2(3)) break; ! } else if (mons[body->corpsenm].mlet == S_TROLL) { long age; for (age = 2; age <= TAINT_AGE; age++) if (!rn2(TROLL_REVIVE_CHANCE)) { /* troll revives */ --- 661,667 ---- for (when = 12L; when < 500L; when++) if (!rn2(3)) break; ! } else if (mons[body->corpsenm].mlet == S_TROLL && !body->norevive) { long age; for (age = 2; age <= TAINT_AGE; age++) if (!rn2(TROLL_REVIVE_CHANCE)) { /* troll revives */ *************** *** 668,674 **** break; } } ! (void) start_timer(when, TIMER_OBJECT, action, (genericptr_t)body); } --- 670,677 ---- break; } } ! ! if (body->norevive) body->norevive = 0; (void) start_timer(when, TIMER_OBJECT, action, (genericptr_t)body); } *************** *** 819,827 **** return wt + cwt; } ! if (obj->otyp == CORPSE && obj->corpsenm >= LOW_PM) ! return (int)obj->quan * mons[obj->corpsenm].cwt; ! else if (obj->oclass == GOLD_CLASS) return (int)((obj->quan + 50L) / 100L); else if (obj->otyp == HEAVY_IRON_BALL && obj->owt != 0) return((int)(obj->owt)); /* kludge for "very" heavy iron ball */ --- 822,836 ---- return wt + cwt; } ! if (obj->otyp == CORPSE && obj->corpsenm >= LOW_PM) { ! long long_wt = obj->quan * (long) mons[obj->corpsenm].cwt; ! ! wt = (long_wt > LARGEST_INT) ? LARGEST_INT : (int)long_wt; ! if (obj->oeaten) wt = eaten_stat(wt, obj); ! return wt; ! } else if (obj->oclass == FOOD_CLASS && obj->oeaten) { ! return eaten_stat((int)obj->quan * wt, obj); ! } else if (obj->oclass == GOLD_CLASS) return (int)((obj->quan + 50L) / 100L); else if (obj->otyp == HEAVY_IRON_BALL && obj->owt != 0) return((int)(obj->owt)); /* kludge for "very" heavy iron ball */ *************** *** 832,839 **** struct obj * rnd_treefruit_at(x,y) { ! return mksobj_at(treefruits[rn2(SIZE(treefruits)-1)],x,y,TRUE); } #endif /* OVL0 */ #ifdef OVLB --- 841,849 ---- struct obj * rnd_treefruit_at(x,y) + int x, y; { ! return mksobj_at(treefruits[rn2(SIZE(treefruits))], x, y, TRUE, FALSE); } #endif /* OVL0 */ #ifdef OVLB *************** *** 845,855 **** { register struct obj *gold = g_at(x,y); ! if (amount <= 0L) amount = (long)(1 + rnd(level_difficulty()+2) * rnd(30)); if (gold) { gold->quan += amount; } else { ! gold = mksobj_at(GOLD_PIECE,x,y,TRUE); gold->quan = amount; } gold->owt = weight(gold); --- 855,866 ---- { register struct obj *gold = g_at(x,y); ! if (amount <= 0L) ! amount = (long)(1 + rnd(level_difficulty()+2) * rnd(30)); if (gold) { gold->quan += amount; } else { ! gold = mksobj_at(GOLD_PIECE, x, y, TRUE, FALSE); gold->quan = amount; } gold->owt = weight(gold); *************** *** 886,892 **** if (objtype != CORPSE && objtype != STATUE) impossible("making corpstat type %d", objtype); ! otmp = mksobj_at(objtype, x, y, init); if (otmp) { if (mtmp) { struct obj *otmp2; --- 897,903 ---- if (objtype != CORPSE && objtype != STATUE) impossible("making corpstat type %d", objtype); ! otmp = mksobj_at(objtype, x, y, init, FALSE); if (otmp) { if (mtmp) { struct obj *otmp2; *************** *** 955,962 **** if (otmp && otmp->oxlth) { struct monst *mtmp2 = (struct monst *)otmp->oextra; if (mtmp->data) mtmp2->mnum = monsndx(mtmp->data); ! /* invalidate pointers and m_id */ ! mtmp2->m_id = 0; mtmp2->nmon = (struct monst *)0; mtmp2->data = (struct permonst *)0; mtmp2->minvent = (struct obj *)0; --- 966,974 ---- if (otmp && otmp->oxlth) { struct monst *mtmp2 = (struct monst *)otmp->oextra; if (mtmp->data) mtmp2->mnum = monsndx(mtmp->data); ! /* invalidate pointers */ ! /* m_id is needed to know if this is a revived quest leader */ ! /* but m_id must be cleared when loading bones */ mtmp2->nmon = (struct monst *)0; mtmp2->data = (struct permonst *)0; mtmp2->minvent = (struct obj *)0; *************** *** 1007,1013 **** /* player statues never contain books */ initialize_it = (objtype != STATUE); ! if ((otmp = mksobj_at(objtype, x, y, initialize_it)) != 0) { /* tt_oname will return null if the scoreboard is empty */ if ((otmp2 = tt_oname(otmp)) != 0) otmp = otmp2; } --- 1019,1025 ---- /* player statues never contain books */ initialize_it = (objtype != STATUE); ! if ((otmp = mksobj_at(objtype, x, y, initialize_it, FALSE)) != 0) { /* tt_oname will return null if the scoreboard is empty */ if ((otmp2 = tt_oname(otmp)) != 0) otmp = otmp2; } *************** *** 1036,1043 **** register struct obj *otmp; { int otyp = otmp->otyp; ! if (objects[otyp].oc_oprop == FIRE_RES) return FALSE; return((boolean)(objects[otyp].oc_material <= WOOD && objects[otyp].oc_material != LIQUID)); --- 1048,1066 ---- register struct obj *otmp; { int otyp = otmp->otyp; + int omat = objects[otyp].oc_material; ! if (objects[otyp].oc_oprop == FIRE_RES || otyp == WAN_FIRE) ! return FALSE; ! ! return((boolean)((omat <= WOOD && omat != LIQUID) || omat == PLASTIC)); ! } ! ! boolean ! is_rottable(otmp) ! register struct obj *otmp; ! { ! int otyp = otmp->otyp; return((boolean)(objects[otyp].oc_material <= WOOD && objects[otyp].oc_material != LIQUID)); *************** *** 1062,1067 **** --- 1085,1091 ---- if (otmp->where != OBJ_FREE) panic("place_object: obj not free"); + obj_no_longer_held(otmp); if (otmp->otyp == BOULDER) block_point(x,y); /* vision */ /* obj goes under boulders */ *************** *** 1361,1377 **** return 0; /* obj on mon's inventory chain */ } ! void add_to_container(container, obj) struct obj *container, *obj; { if (obj->where != OBJ_FREE) panic("add_to_container: obj not free"); obj->where = OBJ_CONTAINED; obj->ocontainer = container; obj->nobj = container->cobj; container->cobj = obj; } void --- 1385,1414 ---- return 0; /* obj on mon's inventory chain */ } ! /* ! * Add obj to container, make sure obj is "free". Returns (merged) obj. ! * The input obj may be deleted in the process. ! */ ! struct obj * add_to_container(container, obj) struct obj *container, *obj; { + struct obj *otmp; + if (obj->where != OBJ_FREE) panic("add_to_container: obj not free"); + if (container->where != OBJ_INVENT && container->where != OBJ_MINVENT) + obj_no_longer_held(obj); + + /* merge if possible */ + for (otmp = container->cobj; otmp; otmp = otmp->nobj) + if (merged(&otmp, &obj)) return (otmp); obj->where = OBJ_CONTAINED; obj->ocontainer = container; obj->nobj = container->cobj; container->cobj = obj; + return (obj); } void *** nethack-3.3.1/src/mkroom.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mkroom.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mkroom.c 3.3 97/05/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mkroom.c 3.4 2001/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 325,355 **** (void) mk_tt_object(CORPSE, sx, sy); if(!rn2(10)) /* lots of treasure buried with dead */ (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, ! sx, sy, TRUE); if (!rn2(5)) make_grave(sx, sy, (char *)0); break; case BEEHIVE: if(!rn2(3)) ! (void) mksobj_at(LUMP_OF_ROYAL_JELLY, sx, sy, TRUE); break; case BARRACKS: if(!rn2(20)) /* the payroll and some loot */ (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, ! sx, sy, TRUE); break; case COCKNEST: if(!rn2(3)) { struct obj *sobj = mk_tt_object(STATUE, sx, sy); ! if (sobj) ! for (i = rn2(5); i; i--) ! add_to_container(sobj, mkobj(RANDOM_CLASS, FALSE)); } break; case ANTHOLE: if(!rn2(3)) ! (void) mkobj_at(FOOD_CLASS, sx, sy, TRUE); break; } } --- 325,359 ---- (void) mk_tt_object(CORPSE, sx, sy); if(!rn2(10)) /* lots of treasure buried with dead */ (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, ! sx, sy, TRUE, FALSE); if (!rn2(5)) make_grave(sx, sy, (char *)0); break; case BEEHIVE: if(!rn2(3)) ! (void) mksobj_at(LUMP_OF_ROYAL_JELLY, ! sx, sy, TRUE, FALSE); break; case BARRACKS: if(!rn2(20)) /* the payroll and some loot */ (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, ! sx, sy, TRUE, FALSE); break; case COCKNEST: if(!rn2(3)) { struct obj *sobj = mk_tt_object(STATUE, sx, sy); ! if (sobj) { ! for (i = rn2(5); i; i--) ! (void) add_to_container(sobj, ! mkobj(RANDOM_CLASS, FALSE)); ! sobj->owt = weight(sobj); ! } } break; case ANTHOLE: if(!rn2(3)) ! (void) mkobj_at(FOOD_CLASS, sx, sy, FALSE); break; } } *************** *** 360,366 **** levl[tx][ty].typ = THRONE; (void) somexy(sroom, &mm); (void) mkgold((long) rn1(50 * level_difficulty(),10), mm.x, mm.y); ! chest = mksobj_at(CHEST, mm.x, mm.y, TRUE); /* the royal coffers */ chest->spe = 2; /* so it can be found later */ level.flags.has_court = 1; break; --- 364,371 ---- levl[tx][ty].typ = THRONE; (void) somexy(sroom, &mm); (void) mkgold((long) rn1(50 * level_difficulty(),10), mm.x, mm.y); ! /* the royal coffers */ ! chest = mksobj_at(CHEST, mm.x, mm.y, TRUE, FALSE); chest->spe = 2; /* so it can be found later */ level.flags.has_court = 1; break; *** nethack-3.3.1/src/mon.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mon.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mon.c 3.3 2000/07/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mon.c 3.4 2002/03/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,18 **** #include "edog.h" #include - STATIC_DCL boolean FDECL(corpse_chance,(struct monst *)); STATIC_DCL boolean FDECL(restrap,(struct monst *)); STATIC_DCL long FDECL(mm_aggression, (struct monst *,struct monst *)); #ifdef OVL2 --- 12,17 ---- *************** *** 21,26 **** --- 20,35 ---- STATIC_DCL void FDECL(kill_eggs, (struct obj *)); #endif + #ifdef REINCARNATION + #define LEVEL_SPECIFIC_NOCORPSE(mdat) \ + (Is_rogue_level(&u.uz) || \ + (level.flags.graveyard && is_undead(mdat) && rn2(3))) + #else + #define LEVEL_SPECIFIC_NOCORPSE(mdat) \ + (level.flags.graveyard && is_undead(mdat) && rn2(3)) + #endif + + #if 0 /* part of the original warning code which was replaced in 3.3.1 */ #ifdef OVL1 *************** *** 99,109 **** PM_SANDESTIN, }; - /* return TRUE if the monster tends to revive */ - #define REVIVER(ptr) (is_rider(ptr) || ptr->mlet == S_TROLL) - #define KEEPTRAITS(mon) (mon->isshk || mon->mtame || \ ! (mon->data->geno & G_UNIQ) || REVIVER(mon->data)) /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't * leave corpses. Monsters which leave "special" corpses should have --- 108,116 ---- PM_SANDESTIN, }; #define KEEPTRAITS(mon) (mon->isshk || mon->mtame || \ ! (mon->data->geno & G_UNIQ) || is_reviver(mon->data) || \ ! (mon->m_id == quest_status.leader_m_id)) /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't * leave corpses. Monsters which leave "special" corpses should have *************** *** 136,143 **** /* Make dragon scales. This assumes that the order of the */ /* dragons is the same as the order of the scales. */ if (!rn2(mtmp->mrevived ? 20 : 3)) { ! obj = mksobj_at(GRAY_DRAGON_SCALES + ! monsndx(mdat)-PM_GRAY_DRAGON, x, y, FALSE); obj->spe = 0; obj->cursed = obj->blessed = FALSE; } --- 143,150 ---- /* Make dragon scales. This assumes that the order of the */ /* dragons is the same as the order of the scales. */ if (!rn2(mtmp->mrevived ? 20 : 3)) { ! num = GRAY_DRAGON_SCALES + monsndx(mdat) - PM_GRAY_DRAGON; ! obj = mksobj_at(num, x, y, FALSE, FALSE); obj->spe = 0; obj->cursed = obj->blessed = FALSE; } *************** *** 146,155 **** case PM_WHITE_UNICORN: case PM_GRAY_UNICORN: case PM_BLACK_UNICORN: ! (void) mksobj_at(UNICORN_HORN, x, y, TRUE); goto default_1; case PM_LONG_WORM: ! (void) mksobj_at(WORM_TOOTH, x, y, TRUE); goto default_1; case PM_VAMPIRE: case PM_VAMPIRE_LORD: --- 153,167 ---- case PM_WHITE_UNICORN: case PM_GRAY_UNICORN: case PM_BLACK_UNICORN: ! if (mtmp->mrevived && rn2(20)) { ! if (canseemon(mtmp)) ! pline("%s recently regrown horn crumbles to dust.", ! s_suffix(Monnam(mtmp))); ! } else ! (void) mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE); goto default_1; case PM_LONG_WORM: ! (void) mksobj_at(WORM_TOOTH, x, y, TRUE, FALSE); goto default_1; case PM_VAMPIRE: case PM_VAMPIRE_LORD: *************** *** 181,197 **** case PM_IRON_GOLEM: num = d(2,6); while (num--) ! obj = mksobj_at(IRON_CHAIN, x, y, TRUE); mtmp->mnamelth = 0; break; case PM_GLASS_GOLEM: num = d(2,4); /* very low chance of creating all glass gems */ while (num--) ! obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE); mtmp->mnamelth = 0; break; case PM_CLAY_GOLEM: ! obj = mksobj_at(ROCK, x, y, FALSE); obj->quan = (long)(rn2(20) + 50); obj->owt = weight(obj); mtmp->mnamelth = 0; --- 193,209 ---- case PM_IRON_GOLEM: num = d(2,6); while (num--) ! obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_GLASS_GOLEM: num = d(2,4); /* very low chance of creating all glass gems */ while (num--) ! obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_CLAY_GOLEM: ! obj = mksobj_at(ROCK, x, y, FALSE, FALSE); obj->quan = (long)(rn2(20) + 50); obj->owt = weight(obj); mtmp->mnamelth = 0; *************** *** 203,220 **** case PM_WOOD_GOLEM: num = d(2,4); while(num--) { ! obj = mksobj_at(QUARTERSTAFF, x, y, TRUE); ! if (obj && obj->oartifact) { /* don't allow this */ ! artifact_exists(obj, ONAME(obj), FALSE); ! Strcpy(ONAME(obj), ""); obj->onamelth = 0; ! } } mtmp->mnamelth = 0; break; case PM_LEATHER_GOLEM: num = d(2,4); while(num--) ! obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE); mtmp->mnamelth = 0; break; case PM_GOLD_GOLEM: --- 215,228 ---- case PM_WOOD_GOLEM: num = d(2,4); while(num--) { ! obj = mksobj_at(QUARTERSTAFF, x, y, TRUE, FALSE); } mtmp->mnamelth = 0; break; case PM_LEATHER_GOLEM: num = d(2,4); while(num--) ! obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_GOLD_GOLEM: *************** *** 223,231 **** mtmp->mnamelth = 0; break; case PM_PAPER_GOLEM: ! num = d(2,3); while (num--) ! obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE); mtmp->mnamelth = 0; break; default_1: --- 231,239 ---- mtmp->mnamelth = 0; break; case PM_PAPER_GOLEM: ! num = rnd(4); while (num--) ! obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; default_1: *************** *** 239,244 **** --- 247,256 ---- } /* All special cases should precede the G_NOCORPSE check */ + /* if polymorph or undead turning has killed this monster, + prevent the same attack beam from hitting its corpse */ + if (flags.bypasses) bypass_obj(obj); + if (mtmp->mnamelth) obj = oname(obj, NAME(mtmp)); *************** *** 306,324 **** } #endif /* 0 */ ! /* check mtmp and water for compatibility, 0 (survived), 1 (drowned) */ int ! minwater(mtmp) register struct monst *mtmp; { ! boolean inpool, infountain; inpool = is_pool(mtmp->mx,mtmp->my) && !is_flyer(mtmp->data) && !is_floater(mtmp->data); infountain = IS_FOUNTAIN(levl[mtmp->mx][mtmp->my].typ); #ifdef STEED ! /* Flying and levitation keeps our steed out of the water */ /* (but not water-walking or swimming) */ if (mtmp == u.usteed && (Flying || Levitation)) return (0); --- 318,338 ---- } #endif /* 0 */ ! /* check mtmp and water/lava for compatibility, 0 (survived), 1 (died) */ int ! minliquid(mtmp) register struct monst *mtmp; { ! boolean inpool, inlava, infountain; inpool = is_pool(mtmp->mx,mtmp->my) && !is_flyer(mtmp->data) && !is_floater(mtmp->data); + inlava = is_lava(mtmp->mx,mtmp->my) && + !is_flyer(mtmp->data) && !is_floater(mtmp->data); infountain = IS_FOUNTAIN(levl[mtmp->mx][mtmp->my].typ); #ifdef STEED ! /* Flying and levitation keeps our steed out of the liquid */ /* (but not water-walking or swimming) */ if (mtmp == u.usteed && (Flying || Levitation)) return (0); *************** *** 347,353 **** return (0); } ! if (inpool) { /* Most monsters drown in pools. flooreffects() will take care of * water damage to dead monsters' inventory, but survivors need to * be handled here. Swimmers are able to protect their stuff... --- 361,396 ---- return (0); } ! if (inlava) { ! /* ! * Lava effects much as water effects. Lava likers are able to ! * protect their stuff. Fire resistant monsters can only protect ! * themselves --ALI ! */ ! if (!is_clinger(mtmp->data) && !likes_lava(mtmp->data)) { ! if (!resists_fire(mtmp)) { ! if (cansee(mtmp->mx,mtmp->my)) ! pline("%s burns to a crisp.", Monnam(mtmp)); ! mondead(mtmp); ! } ! else { ! if (--mtmp->mhp < 1) { ! if (cansee(mtmp->mx,mtmp->my)) ! pline("%s surrenders to the fire.", Monnam(mtmp)); ! mondead(mtmp); ! } ! else if (cansee(mtmp->mx,mtmp->my)) ! pline("%s burns slightly.", Monnam(mtmp)); ! } ! if (mtmp->mhp > 0) { ! (void) fire_damage(mtmp->minvent, FALSE, FALSE, ! mtmp->mx, mtmp->my); ! rloc(mtmp); ! return 0; ! } ! return (1); ! } ! } else if (inpool) { /* Most monsters drown in pools. flooreffects() will take care of * water damage to dead monsters' inventory, but survivors need to * be handled here. Swimmers are able to protect their stuff... *************** *** 369,376 **** /* but eels have a difficult time outside */ if (mtmp->data->mlet == S_EEL && !Is_waterlevel(&u.uz)) { if(mtmp->mhp > 1) mtmp->mhp--; ! mtmp->mflee = 1; ! mtmp->mfleetim += 2; } } return (0); --- 412,418 ---- /* but eels have a difficult time outside */ if (mtmp->data->mlet == S_EEL && !Is_waterlevel(&u.uz)) { if(mtmp->mhp > 1) mtmp->mhp--; ! monflee(mtmp, 2, FALSE, FALSE); } } return (0); *************** *** 420,426 **** /* possibly polymorph shapechangers and lycanthropes */ if (mtmp->cham && !rn2(6)) ! (void) newcham(mtmp, (struct permonst *)0); were_change(mtmp); /* gradually time out temporary problems */ --- 462,468 ---- /* possibly polymorph shapechangers and lycanthropes */ if (mtmp->cham && !rn2(6)) ! (void) newcham(mtmp, (struct permonst *)0, FALSE); were_change(mtmp); /* gradually time out temporary problems */ *************** *** 477,483 **** if (mtmp->movement >= NORMAL_SPEED) somebody_can_move = TRUE; ! if (minwater(mtmp)) continue; if (is_hider(mtmp->data)) { /* unwatched mimics and piercers may hide again [MRS] */ --- 519,527 ---- if (mtmp->movement >= NORMAL_SPEED) somebody_can_move = TRUE; ! if (vision_full_recalc) vision_recalc(0); /* vision! */ ! ! if (minliquid(mtmp)) continue; if (is_hider(mtmp->data)) { /* unwatched mimics and piercers may hide again [MRS] */ *************** *** 541,547 **** * has young and old forms). */ int ! meatgold(mtmp) register struct monst *mtmp; { register struct obj *otmp; --- 585,591 ---- * has young and old forms). */ int ! meatmetal(mtmp) register struct monst *mtmp; { register struct obj *otmp; *************** *** 553,559 **** /* Eats topmost metal object if it is there */ for (otmp = level.objects[mtmp->mx][mtmp->my]; ! otmp; otmp = otmp->nexthere) if (is_metallic(otmp) && !obj_resists(otmp, 5, 95) && touch_artifact(otmp,mtmp)) { if (mtmp->data == &mons[PM_RUST_MONSTER] && otmp->oerodeproof) { --- 597,605 ---- /* Eats topmost metal object if it is there */ for (otmp = level.objects[mtmp->mx][mtmp->my]; ! otmp; otmp = otmp->nexthere) { ! if (mtmp->data == &mons[PM_RUST_MONSTER] && !is_rustprone(otmp)) ! continue; if (is_metallic(otmp) && !obj_resists(otmp, 5, 95) && touch_artifact(otmp,mtmp)) { if (mtmp->data == &mons[PM_RUST_MONSTER] && otmp->oerodeproof) { *************** *** 596,602 **** delobj(otmp); ptr = mtmp->data; if (poly) { ! if (newcham(mtmp, (struct permonst *)0)) ptr = mtmp->data; } else if (grow) { ptr = grow_up(mtmp, (struct monst *)0); --- 642,648 ---- delobj(otmp); ptr = mtmp->data; if (poly) { ! if (newcham(mtmp, (struct permonst *)0, FALSE)) ptr = mtmp->data; } else if (grow) { ptr = grow_up(mtmp, (struct monst *)0); *************** *** 616,626 **** if (!ptr) return 2; /* it died */ } /* Left behind a pile? */ ! if(rnd(25) < 3) (void) mksobj_at(ROCK, mtmp->mx, mtmp->my, TRUE); newsym(mtmp->mx, mtmp->my); return 1; } } return 0; } --- 662,674 ---- if (!ptr) return 2; /* it died */ } /* Left behind a pile? */ ! if (rnd(25) < 3) ! (void)mksobj_at(ROCK, mtmp->mx, mtmp->my, TRUE, FALSE); newsym(mtmp->mx, mtmp->my); return 1; } } + } return 0; } *************** *** 679,685 **** delobj(otmp); /* munch */ ptr = mtmp->data; if (poly) { ! if (newcham(mtmp, (struct permonst *)0)) ptr = mtmp->data; } else if (grow) { ptr = grow_up(mtmp, (struct monst *)0); } else if (heal) { --- 727,733 ---- delobj(otmp); /* munch */ ptr = mtmp->data; if (poly) { ! if (newcham(mtmp, (struct permonst *)0, FALSE)) ptr = mtmp->data; } else if (grow) { ptr = grow_up(mtmp, (struct monst *)0); } else if (heal) { *************** *** 720,730 **** --- 768,786 ---- register struct obj *gold; if ((gold = g_at(mtmp->mx, mtmp->my)) != 0) { + #ifndef GOLDOBJ mtmp->mgold += gold->quan; delobj(gold); if (cansee(mtmp->mx, mtmp->my) ) { if (flags.verbose && !mtmp->isgd) pline("%s picks up some gold.", Monnam(mtmp)); + #else + obj_extract_self(gold); + add_to_minv(mtmp, gold); + if (cansee(mtmp->mx, mtmp->my) ) { + if (flags.verbose && !mtmp->isgd) + pline("%s picks up some money.", Monnam(mtmp)); + #endif newsym(mtmp->mx, mtmp->my); } } *************** *** 747,762 **** /* Nymphs take everything. Most monsters don't pick up corpses. */ if (!str ? searches_for_item(mtmp,otmp) : !!(index(str, otmp->oclass))) { ! if (otmp->otyp == CORPSE && ( ! is_rider(&mons[otmp->corpsenm]) || ! (touch_petrifies(&mons[otmp->corpsenm]) ! && !(mtmp->misc_worn_check & W_ARMG)) || ! (mtmp->data->mlet != S_NYMPH ! && !touch_petrifies(&mons[otmp->corpsenm]) ! && otmp->corpsenm != PM_LIZARD ! && !acidic(&mons[otmp->corpsenm])) ! )) ! continue; if (!touch_artifact(otmp,mtmp)) continue; if (!can_carry(mtmp,otmp)) continue; if (is_pool(mtmp->mx,mtmp->my)) continue; --- 803,813 ---- /* Nymphs take everything. Most monsters don't pick up corpses. */ if (!str ? searches_for_item(mtmp,otmp) : !!(index(str, otmp->oclass))) { ! if (otmp->otyp == CORPSE && mtmp->data->mlet != S_NYMPH && ! /* let a handful of corpse types thru to can_carry() */ ! !touch_petrifies(&mons[otmp->corpsenm]) && ! otmp->corpsenm != PM_LIZARD && ! !acidic(&mons[otmp->corpsenm])) continue; if (!touch_artifact(otmp,mtmp)) continue; if (!can_carry(mtmp,otmp)) continue; if (is_pool(mtmp->mx,mtmp->my)) continue; *************** *** 840,845 **** --- 891,898 ---- if (otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !(mtmp->misc_worn_check & W_ARMG) && !resists_ston(mtmp)) return FALSE; + if (otyp == CORPSE && is_rider(&mons[otmp->corpsenm])) + return FALSE; if (objects[otyp].oc_material == SILVER && hates_silver(mdat) && (otyp != BELL_OF_OPENING || !is_covetous(mdat))) return FALSE; *************** *** 1188,1194 **** struct monst *mtmp; struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ { ! if(mtmp->mleashed) m_unleash(mtmp); /* to prevent an infinite relobj-flooreffects-hmon-killed loop */ mtmp->mtrapped = 0; mtmp->mhp = 0; /* simplify some tests: force mhp to 0 */ --- 1241,1247 ---- struct monst *mtmp; struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ { ! if (mtmp->mleashed) m_unleash(mtmp, FALSE); /* to prevent an infinite relobj-flooreffects-hmon-killed loop */ mtmp->mtrapped = 0; mtmp->mhp = 0; /* simplify some tests: force mhp to 0 */ *************** *** 1310,1315 **** --- 1363,1372 ---- */ tmp = monsndx(mtmp->data); if (mvitals[tmp].died < 255) mvitals[tmp].died++; + + /* if it's a (possibly polymorphed) quest leader, mark him as dead */ + if (mtmp->m_id == quest_status.leader_m_id) + quest_status.leader_is_dead = TRUE; #ifdef MAIL /* if the mail daemon dies, no more mail delivery. -3. */ if (tmp == PM_MAIL_DAEMON) mvitals[tmp].mvflags |= G_GENOD; *************** *** 1337,1355 **** m_detach(mtmp, mptr); } ! STATIC_OVL boolean ! corpse_chance(mon) struct monst *mon; { struct permonst *mdat = mon->data; int i, tmp; - if (mdat == &mons[PM_VLAD_THE_IMPALER] || mdat->mlet == S_LICH) { ! if (cansee(mon->mx, mon->my)) ! pline("%s body crumbles into dust.", ! s_suffix(Monnam(mon))); ! return FALSE; } /* Gas spores always explode upon death */ --- 1394,1413 ---- m_detach(mtmp, mptr); } ! /* TRUE if corpse might be dropped, magr may die if mon was swallowed */ ! boolean ! corpse_chance(mon, magr, was_swallowed) struct monst *mon; + struct monst *magr; /* killer, if swallowed */ + boolean was_swallowed; /* digestion */ { struct permonst *mdat = mon->data; int i, tmp; if (mdat == &mons[PM_VLAD_THE_IMPALER] || mdat->mlet == S_LICH) { ! if (cansee(mon->mx, mon->my) && !was_swallowed) ! pline("%s body crumbles into dust.", s_suffix(Monnam(mon))); ! return FALSE; } /* Gas spores always explode upon death */ *************** *** 1361,1370 **** else if(mdat->mattk[i].damd) tmp = d((int)mdat->mlevel+1, (int)mdat->mattk[i].damd); else tmp = 0; Sprintf(killer_buf, "%s explosion", s_suffix(mdat->mname)); killer = killer_buf; killer_format = KILLED_BY_AN; ! explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE); return (FALSE); } } --- 1419,1451 ---- else if(mdat->mattk[i].damd) tmp = d((int)mdat->mlevel+1, (int)mdat->mattk[i].damd); else tmp = 0; + if (Half_physical_damage) tmp = (tmp+1) / 2; + if (was_swallowed && magr) { + if (magr == &youmonst) { + There("is an explosion in your %s!", + body_part(STOMACH)); + Sprintf(killer_buf, "%s explosion", + s_suffix(mdat->mname)); + losehp(tmp, killer_buf, KILLED_BY_AN); + } else { + if (flags.soundok) You_hear("an explosion."); + magr->mhp -= tmp; + if (magr->mhp < 1) mondied(magr); + if (magr->mhp < 1) { /* maybe lifesaved */ + if (canspotmon(magr)) + pline("%s rips open!", Monnam(magr)); + } else if (canseemon(magr)) + pline("%s seems to have indigestion.", + Monnam(magr)); + } + + return FALSE; + } + Sprintf(killer_buf, "%s explosion", s_suffix(mdat->mname)); killer = killer_buf; killer_format = KILLED_BY_AN; ! explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS); return (FALSE); } } *************** *** 1372,1382 **** /* must duplicate this below check in xkilled() since it results in * creating no objects as well as no corpse */ ! if ( ! #ifdef REINCARNATION ! Is_rogue_level(&u.uz) || ! #endif ! (level.flags.graveyard && is_undead(mdat) && rn2(3))) return FALSE; if (bigmonst(mdat) || mdat == &mons[PM_LIZARD] --- 1453,1459 ---- /* must duplicate this below check in xkilled() since it results in * creating no objects as well as no corpse */ ! if (LEVEL_SPECIFIC_NOCORPSE(mdat)) return FALSE; if (bigmonst(mdat) || mdat == &mons[PM_LIZARD] *************** *** 1396,1402 **** mondead(mdef); if (mdef->mhp > 0) return; /* lifesaved */ ! if (corpse_chance(mdef)) (void) make_corpse(mdef); } --- 1473,1479 ---- mondead(mdef); if (mdef->mhp > 0) return; /* lifesaved */ ! if (corpse_chance(mdef, (struct monst *)0, FALSE)) (void) make_corpse(mdef); } *************** *** 1412,1418 **** --- 1489,1497 ---- #endif discard_minvent(mdef); /* release monster's inventory */ + #ifndef GOLDOBJ mdef->mgold = 0L; + #endif m_detach(mdef, mdef->data); } *************** *** 1423,1428 **** --- 1502,1508 ---- { struct obj *otmp, *obj; xchar x = mdef->mx, y = mdef->my; + boolean wasinside = FALSE; /* we have to make the statue before calling mondead, to be able to * put inventory in it, and we have to check for lifesaving before *************** *** 1441,1446 **** --- 1521,1529 ---- /* some objects may end up outside the statue */ while ((obj = mdef->minvent) != 0) { obj_extract_self(obj); + obj_no_longer_held(obj); + if (obj->owornmask & W_WEP) + setmnotwielded(mdef,obj); obj->owornmask = 0L; if (obj->otyp == BOULDER || #if 0 /* monsters don't carry statues */ *************** *** 1451,1480 **** place_object(obj, x, y); } else { if (obj->lamplit) end_burn(obj, TRUE); ! add_to_container(otmp, obj); } } if (mdef->mgold) { struct obj *au; au = mksobj(GOLD_PIECE, FALSE, FALSE); au->quan = mdef->mgold; au->owt = weight(au); ! add_to_container(otmp, au); mdef->mgold = 0; } /* Archeologists should not break unique statues */ if (mdef->data->geno & G_UNIQ) otmp->spe = 1; otmp->owt = weight(otmp); } else ! otmp = mksobj_at(ROCK, x, y, TRUE); stackobj(otmp); /* mondead() already does this, but we must do it before the newsym */ if(glyph_is_invisible(levl[x][y].glyph)) unmap_object(x, y); if (cansee(x, y)) newsym(x,y); mondead(mdef); } /* another monster has killed the monster mdef */ --- 1534,1573 ---- place_object(obj, x, y); } else { if (obj->lamplit) end_burn(obj, TRUE); ! (void) add_to_container(otmp, obj); } } + #ifndef GOLDOBJ if (mdef->mgold) { struct obj *au; au = mksobj(GOLD_PIECE, FALSE, FALSE); au->quan = mdef->mgold; au->owt = weight(au); ! (void) add_to_container(otmp, au); mdef->mgold = 0; } + #endif /* Archeologists should not break unique statues */ if (mdef->data->geno & G_UNIQ) otmp->spe = 1; otmp->owt = weight(otmp); } else ! otmp = mksobj_at(ROCK, x, y, TRUE, FALSE); stackobj(otmp); /* mondead() already does this, but we must do it before the newsym */ if(glyph_is_invisible(levl[x][y].glyph)) unmap_object(x, y); if (cansee(x, y)) newsym(x,y); + /* We don't currently trap the hero in the statue in this case but we could */ + if (u.uswallow && u.ustuck == mdef) wasinside = TRUE; mondead(mdef); + if (wasinside) { + if (is_animal(mdef->data)) + You("%s through an opening in the new %s.", + locomotion(youmonst.data, "jump"), + xname(otmp)); + } } /* another monster has killed the monster mdef */ *************** *** 1554,1574 **** u.uconduct.killer++; if (dest & 1) { ! if(!wasinside && !canspotmon(mtmp)) ! You("destroy it!"); else { ! You("destroy %s!", ! mtmp->mtame ! ? x_monnam(mtmp, ARTICLE_THE, "poor", ! mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE) ! : mon_nam(mtmp)); } } ! if (mtmp->mtrapped && ! ((t = t_at(x, y)) && (t->ttyp == PIT || t->ttyp == SPIKED_PIT)) && ! sobj_at(BOULDER, x, y)) ! dest ^= 2; /* * Prevent corpses/treasure being created "on top" * of the boulder that is about to fall in. This is * out of order, but cannot be helped unless this --- 1647,1671 ---- u.uconduct.killer++; if (dest & 1) { ! const char *verb = nonliving(mtmp->data) ? "destroy" : "kill"; ! ! if (!wasinside && !canspotmon(mtmp)) ! You("%s it!", verb); else { ! You("%s %s!", verb, ! !mtmp->mtame ? mon_nam(mtmp) : ! x_monnam(mtmp, ! mtmp->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! "poor", ! mtmp->mnamelth ? SUPPRESS_SADDLE : 0, ! FALSE)); } } ! if (mtmp->mtrapped && (t = t_at(x, y)) != 0 && ! (t->ttyp == PIT || t->ttyp == SPIKED_PIT) && ! sobj_at(BOULDER, x, y)) ! dest |= 2; /* * Prevent corpses/treasure being created "on top" * of the boulder that is about to fall in. This is * out of order, but cannot be helped unless this *************** *** 1601,1616 **** goto cleanup; } ! if((dest & 2) ! #ifdef REINCARNATION ! || Is_rogue_level(&u.uz) ! #endif ! || (level.flags.graveyard && is_undead(mdat) && rn2(3))) goto cleanup; #ifdef MAIL if(mdat == &mons[PM_MAIL_DAEMON]) { ! stackobj(mksobj_at(SCR_MAIL, x, y, FALSE)); redisp = TRUE; } #endif --- 1698,1709 ---- goto cleanup; } ! if((dest & 2) || LEVEL_SPECIFIC_NOCORPSE(mdat)) goto cleanup; #ifdef MAIL if(mdat == &mons[PM_MAIL_DAEMON]) { ! stackobj(mksobj_at(SCR_MAIL, x, y, FALSE, FALSE)); redisp = TRUE; } #endif *************** *** 1644,1650 **** * different from whether or not the corpse is "special"; * if we want both, we have to specify it explicitly. */ ! if (corpse_chance(mtmp)) (void) make_corpse(mtmp); } if(redisp) newsym(x,y); --- 1737,1743 ---- * different from whether or not the corpse is "special"; * if we want both, we have to specify it explicitly. */ ! if (corpse_chance(mtmp, (struct monst *)0, FALSE)) (void) make_corpse(mtmp); } if(redisp) newsym(x,y); *************** *** 1672,1678 **** newexplevel(); /* will decide if you go up */ /* adjust alignment points */ ! if (mdat->msound == MS_LEADER) { /* REAL BAD! */ adjalign(-(u.ualign.record+(int)ALIGNLIM/2)); pline("That was %sa bad idea...", u.uevent.qcompleted ? "probably " : ""); --- 1765,1771 ---- newexplevel(); /* will decide if you go up */ /* adjust alignment points */ ! if (mtmp->m_id == quest_status.leader_m_id) { /* REAL BAD! */ adjalign(-(u.ualign.record+(int)ALIGNLIM/2)); pline("That was %sa bad idea...", u.uevent.qcompleted ? "probably " : ""); *************** *** 1710,1716 **** /* it's a golem, and not a stone golem */ if(canseemon(mtmp)) pline("%s solidifies...", Monnam(mtmp)); ! if (newcham(mtmp, &mons[PM_STONE_GOLEM])) { if(canseemon(mtmp)) pline("Now it's %s.", an(mtmp->data->mname)); } else { --- 1803,1809 ---- /* it's a golem, and not a stone golem */ if(canseemon(mtmp)) pline("%s solidifies...", Monnam(mtmp)); ! if (newcham(mtmp, &mons[PM_STONE_GOLEM], FALSE)) { if(canseemon(mtmp)) pline("Now it's %s.", an(mtmp->data->mname)); } else { *************** *** 1871,1877 **** } aggravate(); } ! if(mtmp->data == &mons[PM_MEDUSA] && !mtmp->mcan) { register int i; for(i = 0; i < NATTK; i++) if(mtmp->data->mattk[i].aatyp == AT_GAZE) { --- 1964,1970 ---- } aggravate(); } ! if(mtmp->data == &mons[PM_MEDUSA]) { register int i; for(i = 0; i < NATTK; i++) if(mtmp->data->mattk[i].aatyp == AT_GAZE) { *************** *** 1993,1999 **** mcham = (int) mtmp->cham; if (mcham) { mtmp->cham = CHAM_ORDINARY; ! (void) newcham(mtmp, &mons[cham_to_pm[mcham]]); } if(is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN) new_were(mtmp); --- 2086,2092 ---- mcham = (int) mtmp->cham; if (mcham) { mtmp->cham = CHAM_ORDINARY; ! (void) newcham(mtmp, &mons[cham_to_pm[mcham]], FALSE); } if(is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN) new_were(mtmp); *************** *** 2036,2046 **** mcham = (int) mon->cham; if (mcham) { mon->cham = CHAM_ORDINARY; ! (void) newcham(mon, &mons[cham_to_pm[mcham]]); } else if (is_were(mon->data) && !is_human(mon->data)) { new_were(mon); } ! } else { mon->cham = pm_to_cham(monsndx(mon->data)); } } --- 2129,2139 ---- mcham = (int) mon->cham; if (mcham) { mon->cham = CHAM_ORDINARY; ! (void) newcham(mon, &mons[cham_to_pm[mcham]], FALSE); } else if (is_were(mon->data) && !is_human(mon->data)) { new_were(mon); } ! } else if (mon->cham == CHAM_ORDINARY) { mon->cham = pm_to_cham(monsndx(mon->data)); } } *************** *** 2051,2057 **** register struct monst *mtmp; { if(mtmp->cham || mtmp->mcan || mtmp->m_ap_type || ! cansee(mtmp->mx, mtmp->my) || rn2(3) || (mtmp == u.ustuck)) return(FALSE); if(mtmp->data->mlet == S_MIMIC) { --- 2144,2151 ---- register struct monst *mtmp; { if(mtmp->cham || mtmp->mcan || mtmp->m_ap_type || ! cansee(mtmp->mx, mtmp->my) || rn2(3) || (mtmp == u.ustuck) || ! (sensemon(mtmp) && distu(mtmp->mx, mtmp->my) <= 2)) return(FALSE); if(mtmp->data->mlet == S_MIMIC) { *************** *** 2121,2137 **** if (!rn2(3)) mndx = pick_animal(); break; case CHAM_ORDINARY: break; } if (mndx == NON_PM) mndx = rn1(SPECIAL_PM - LOW_PM, LOW_PM); return mndx; } /* make a chameleon look like a new monster; returns 1 if it actually changed */ int ! newcham(mtmp, mdat) struct monst *mtmp; struct permonst *mdat; { int mhp, hpn, hpd; int mndx, tryct; --- 2215,2258 ---- if (!rn2(3)) mndx = pick_animal(); break; case CHAM_ORDINARY: + { + struct obj *m_armr = which_armor(mon, W_ARM); + + if (m_armr && Is_dragon_scales(m_armr)) + mndx = Dragon_scales_to_pm(m_armr) - mons; + else if (m_armr && Is_dragon_mail(m_armr)) + mndx = Dragon_mail_to_pm(m_armr) - mons; + } break; } + #ifdef WIZARD + /* For debugging only: allow control of polymorphed monster; not saved */ + if (wizard && iflags.mon_polycontrol) { + char pprompt[BUFSZ], buf[BUFSZ]; + int tries = 0; + do { + Sprintf(pprompt, + "Change %s into what kind of monster? [type the name]", + mon_nam(mon)); + getlin(pprompt,buf); + mndx = name_to_mon(buf); + if (mndx < LOW_PM) + You("cannot polymorph %s into that.", mon_nam(mon)); + else break; + } while(++tries < 5); + if (tries==5) pline(thats_enough_tries); + } + #endif /*WIZARD*/ if (mndx == NON_PM) mndx = rn1(SPECIAL_PM - LOW_PM, LOW_PM); return mndx; } /* make a chameleon look like a new monster; returns 1 if it actually changed */ int ! newcham(mtmp, mdat, polyspot) struct monst *mtmp; struct permonst *mdat; + boolean polyspot; /* change is the result of wand or spell of polymorph */ { int mhp, hpn, hpd; int mndx, tryct; *************** *** 2223,2229 **** new_light_source(mtmp->mx, mtmp->my, emits_light(mtmp->data), LS_MONSTER, (genericptr_t)mtmp); } ! mtmp->perminvis = pm_invisible(mdat); mtmp->minvis = mtmp->invis_blkd ? 0 : mtmp->perminvis; if (!(hides_under(mdat) && OBJ_AT(mtmp->mx, mtmp->my)) && !(mdat->mlet == S_EEL && is_pool(mtmp->mx, mtmp->my))) --- 2344,2351 ---- new_light_source(mtmp->mx, mtmp->my, emits_light(mtmp->data), LS_MONSTER, (genericptr_t)mtmp); } ! if (!mtmp->perminvis || pm_invisible(olddata)) ! mtmp->perminvis = pm_invisible(mdat); mtmp->minvis = mtmp->invis_blkd ? 0 : mtmp->perminvis; if (!(hides_under(mdat) && OBJ_AT(mtmp->mx, mtmp->my)) && !(mdat->mlet == S_EEL && is_pool(mtmp->mx, mtmp->my))) *************** *** 2263,2269 **** newsym(mtmp->mx,mtmp->my); ! mon_break_armor(mtmp); if (!(mtmp->misc_worn_check & W_ARMG)) mselftouch(mtmp, "No longer petrify-resistant, ", !flags.mon_moving); --- 2385,2391 ---- newsym(mtmp->mx,mtmp->my); ! mon_break_armor(mtmp, polyspot); if (!(mtmp->misc_worn_check & W_ARMG)) mselftouch(mtmp, "No longer petrify-resistant, ", !flags.mon_moving); *************** *** 2282,2287 **** --- 2404,2412 ---- for (otmp = mtmp->minvent; otmp; otmp = otmp2) { otmp2 = otmp->nobj; if (otmp->otyp == BOULDER) { + /* this keeps otmp from being polymorphed in the + same zap that the monster that held it is polymorphed */ + if (polyspot) bypass_obj(otmp); obj_extract_self(otmp); /* probably ought to give some "drop" message here */ if (flooreffects(otmp, mtmp->mx, mtmp->my, "")) continue; *************** *** 2410,2416 **** mndx = monsndx(mtmp->data); if ((mvitals[mndx].mvflags & G_GENOD) || kill_cham[mtmp->cham]) { if (mtmp->cham && !kill_cham[mtmp->cham]) ! (void) newcham(mtmp, (struct permonst *)0); else mondead(mtmp); } --- 2535,2541 ---- mndx = monsndx(mtmp->data); if ((mvitals[mndx].mvflags & G_GENOD) || kill_cham[mtmp->cham]) { if (mtmp->cham && !kill_cham[mtmp->cham]) ! (void) newcham(mtmp, (struct permonst *)0, FALSE); else mondead(mtmp); } *************** *** 2442,2454 **** return; } if (slow) { ! if (mon->mspeed != MSLOW) { ! unsigned int oldspeed = mon->mspeed; ! ! mon_adjust_speed(mon, -1); ! if (mon->mspeed != oldspeed && cansee(mon->mx, mon->my)) ! pline("%s seems to be moving slower.", Monnam(mon)); ! } } if (heal) { if (mon->mhp < mon->mhpmax) { --- 2567,2574 ---- return; } if (slow) { ! if (mon->mspeed != MSLOW) ! mon_adjust_speed(mon, -1, (struct obj *)0); } if (heal) { if (mon->mhp < mon->mhpmax) { *** nethack-3.3.1/src/mondata.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mondata.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mondata.c 3.3 2000/07/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mondata.c 3.4 2001/12/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 6,11 **** --- 6,15 ---- #include "eshk.h" #include "epri.h" + /* fake attack and damage types */ + #define AT_ANY (-1) + #define AD_ANY (-1) + /* These routines provide basic data for any type of monster. */ #ifdef OVLB *************** *** 29,45 **** #endif /* OVLB */ #ifdef OVL0 ! boolean ! attacktype(ptr, atyp) ! register struct permonst *ptr; ! register int atyp; { ! int i; ! for(i = 0; i < NATTK; i++) ! if(ptr->mattk[i].aatyp == atyp) return(TRUE); ! return(FALSE); } #endif /* OVL0 */ --- 33,58 ---- #endif /* OVLB */ #ifdef OVL0 ! struct attack * ! attacktype_fordmg(ptr, atyp, dtyp) ! struct permonst *ptr; ! int atyp, dtyp; { ! struct attack *a; ! for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++) ! if (a->aatyp == atyp && (dtyp == AD_ANY || a->adtyp == dtyp)) ! return a; ! return (struct attack *)0; ! } ! ! boolean ! attacktype(ptr, atyp) ! struct permonst *ptr; ! int atyp; ! { ! return attacktype_fordmg(ptr, atyp, AD_ANY) ? TRUE : FALSE; } #endif /* OVL0 */ *************** *** 105,113 **** paralysis does too, we can't check it */ mon->msleeping)) return TRUE; ! /* AD_BLND => yellow light, Archon, !cobra, !raven */ ! if (dmgtype(ptr, AD_BLND) && ! !attacktype(ptr, AT_SPIT) && !attacktype(ptr, AT_CLAW)) return TRUE; o = is_you ? uwep : MON_WEP(mon); if (o && o->oartifact && defends(AD_BLND, o)) --- 118,126 ---- paralysis does too, we can't check it */ mon->msleeping)) return TRUE; ! /* yellow light, Archon; !dust vortex, !cobra, !raven */ ! if (dmgtype_fromattack(ptr, AD_BLND, AT_EXPL) || ! dmgtype_fromattack(ptr, AD_BLND, AT_GAZE)) return TRUE; o = is_you ? uwep : MON_WEP(mon); if (o && o->oartifact && defends(AD_BLND, o)) *************** *** 282,298 **** attacktype(ptr,AT_HUGS))); } ! boolean ! dmgtype(ptr, dtyp) ! register struct permonst *ptr; ! register int dtyp; { ! int i; ! for(i = 0; i < NATTK; i++) ! if(ptr->mattk[i].adtyp == dtyp) return TRUE; ! return FALSE; } /* returns the maximum damage a defender can do to the attacker via --- 295,320 ---- attacktype(ptr,AT_HUGS))); } ! struct attack * ! dmgtype_fromattack(ptr, dtyp, atyp) ! struct permonst *ptr; ! int dtyp, atyp; { ! struct attack *a; ! for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++) ! if (a->adtyp == dtyp && (atyp == AT_ANY || a->aatyp == atyp)) ! return a; ! return (struct attack *)0; ! } ! ! boolean ! dmgtype(ptr, dtyp) ! struct permonst *ptr; ! int dtyp; ! { ! return dmgtype_fromattack(ptr, dtyp, AT_ANY) ? TRUE : FALSE; } /* returns the maximum damage a defender can do to the attacker via *************** *** 583,593 **** return montype; } ! static const char *levitate[2] = { "float", "Float" }; ! static const char *fly[2] = { "fly", "Fly" }; ! static const char *slither[2] = { "slither", "Slither" }; ! static const char *ooze[2] = { "ooze", "Ooze" }; ! static const char *crawl[2] = { "crawl", "Crawl" }; const char * locomotion(ptr, def) --- 605,617 ---- return montype; } ! static const char *levitate[4] = { "float", "Float", "wobble", "Wobble" }; ! static const char *flys[4] = { "fly", "Fly", "flutter", "Flutter" }; ! static const char *flyl[4] = { "fly", "Fly", "stagger", "Stagger" }; ! static const char *slither[4] = { "slither", "Slither", "falter", "Falter" }; ! static const char *ooze[4] = { "ooze", "Ooze", "tremble", "Tremble" }; ! static const char *immobile[4] = { "wiggle", "Wiggle", "pulsate", "Pulsate" }; ! static const char *crawl[4] = { "crawl", "Crawl", "falter", "Falter" }; const char * locomotion(ptr, def) *************** *** 598,606 **** return ( is_floater(ptr) ? levitate[capitalize] : ! is_flyer(ptr) ? fly[capitalize] : slithy(ptr) ? slither[capitalize] : amorphous(ptr) ? ooze[capitalize] : nolimbs(ptr) ? crawl[capitalize] : def ); --- 622,652 ---- return ( is_floater(ptr) ? levitate[capitalize] : ! (is_flyer(ptr) && ptr->msize <= MZ_SMALL) ? flys[capitalize] : ! (is_flyer(ptr) && ptr->msize > MZ_SMALL) ? flyl[capitalize] : ! slithy(ptr) ? slither[capitalize] : ! amorphous(ptr) ? ooze[capitalize] : ! !ptr->mmove ? immobile[capitalize] : ! nolimbs(ptr) ? crawl[capitalize] : ! def ! ); ! ! } ! ! const char * ! stagger(ptr, def) ! const struct permonst *ptr; ! const char *def; ! { ! int capitalize = 2 + (*def == highc(*def)); ! ! return ( ! is_floater(ptr) ? levitate[capitalize] : ! (is_flyer(ptr) && ptr->msize <= MZ_SMALL) ? flys[capitalize] : ! (is_flyer(ptr) && ptr->msize > MZ_SMALL) ? flyl[capitalize] : slithy(ptr) ? slither[capitalize] : amorphous(ptr) ? ooze[capitalize] : + !ptr->mmove ? immobile[capitalize] : nolimbs(ptr) ? crawl[capitalize] : def ); *** nethack-3.3.1/src/monmove.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/monmove.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)monmove.c 3.3 2000/07/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)monmove.c 3.4 2000/08/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 69,74 **** --- 69,77 ---- } stop_occupation(); } + } else if (is_digging()) { + /* chewing, wand/spell of digging are checked elsewhere */ + watch_dig(mtmp, digging.pos.x, digging.pos.y, FALSE); } } } *************** *** 198,203 **** --- 201,241 ---- return(0); } + /* monster begins fleeing for the specified time, 0 means untimed flee + * if first, only adds fleetime if monster isn't already fleeing + * if fleemsg, prints a message about new flight, otherwise, caller should */ + void + monflee(mtmp, fleetime, first, fleemsg) + struct monst *mtmp; + int fleetime; + boolean first; + boolean fleemsg; + { + if (u.ustuck == mtmp) { + if (u.uswallow) + expels(mtmp, mtmp->data, TRUE); + else if (!sticks(youmonst.data)) { + unstuck(mtmp); /* monster lets go when fleeing */ + You("get released!"); + } + } + + if (!first || !mtmp->mflee) { + /* don't lose untimed scare */ + if (!fleetime) + mtmp->mfleetim = 0; + else if (!mtmp->mflee || mtmp->mfleetim) { + fleetime += mtmp->mfleetim; + /* ensure monster flees long enough to visibly stop fighting */ + if (fleetime == 1) fleetime++; + mtmp->mfleetim = min(fleetime, 127); + } + if (!mtmp->mflee && fleemsg && canseemon(mtmp)) + pline("%s turns to flee!", (Monnam(mtmp))); + mtmp->mflee = 1; + } + } + STATIC_OVL void distfleeck(mtmp,inrange,nearby,scared) register struct monst *mtmp; *************** *** 227,244 **** (!mtmp->mpeaceful && in_your_sanctuary(mtmp, 0, 0)))); ! if(*scared && !mtmp->mflee) { ! if (!sticks(youmonst.data)) ! unstuck(mtmp); /* monster lets go when fleeing */ ! mtmp->mflee = 1; ! #ifdef STUPID if (rn2(7)) ! mtmp->mfleetim = rnd(10); else ! mtmp->mfleetim = rnd(100); ! #else ! mtmp->mfleetim = rnd(rn2(7) ? 10 : 100); ! #endif } } --- 265,275 ---- (!mtmp->mpeaceful && in_your_sanctuary(mtmp, 0, 0)))); ! if(*scared) { if (rn2(7)) ! monflee(mtmp, rnd(10), TRUE, TRUE); else ! monflee(mtmp, rnd(100), TRUE, TRUE); } } *************** *** 265,270 **** --- 296,304 ---- register struct permonst *mdat; register int tmp=0; int inrange, nearby, scared; + #ifdef GOLDOBJ + struct obj *ygold = 0, *lepgold = 0; + #endif /* Pre-movement adjustments */ *************** *** 314,320 **** } if (mdat->msound == MS_SHRIEK && !um_dist(mtmp->mx, mtmp->my, 1)) m_respond(mtmp); ! if (mdat == &mons[PM_MEDUSA] && cansee(mtmp->mx, mtmp->my)) m_respond(mtmp); if (mtmp->mhp <= 0) return(1); /* m_respond gaze can kill medusa */ --- 348,354 ---- } if (mdat->msound == MS_SHRIEK && !um_dist(mtmp->mx, mtmp->my, 1)) m_respond(mtmp); ! if (mdat == &mons[PM_MEDUSA] && couldsee(mtmp->mx, mtmp->my)) m_respond(mtmp); if (mtmp->mhp <= 0) return(1); /* m_respond gaze can kill medusa */ *************** *** 406,415 **** --- 440,452 ---- m2->mhp -= rnd(15); if (m2->mhp <= 0) monkilled(m2, "", AD_DRIN); + else + m2->msleeping = 0; } } } toofar: + /* If monster is nearby you, and has to wield a weapon, do so. This * costs the monster a move, of course. */ *************** *** 432,442 **** --- 469,508 ---- /* Now the actual movement phase */ + #ifndef GOLDOBJ if(!nearby || mtmp->mflee || scared || mtmp->mconf || mtmp->mstun || (mtmp->minvis && !rn2(3)) || (mdat->mlet == S_LEPRECHAUN && !u.ugold && (mtmp->mgold || rn2(2))) || + #else + if (mdat->mlet == S_LEPRECHAUN) { + ygold = findgold(invent); + lepgold = findgold(mtmp->minvent); + } + + if(!nearby || mtmp->mflee || scared || + mtmp->mconf || mtmp->mstun || (mtmp->minvis && !rn2(3)) || + (mdat->mlet == S_LEPRECHAUN && !ygold && (lepgold || rn2(2))) || + #endif (is_wanderer(mdat) && !rn2(4)) || (Conflict && !mtmp->iswiz) || (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful) { + /* Possibly cast an undirected spell if not attacking you */ + /* note that most of the time castmu() will pick a directed + spell and do nothing, so the monster moves normally */ + /* arbitrary distance restriction to keep monster far away + from you from having cast dozens of sticks-to-snakes + or similar spells by the time you reach it */ + if (dist2(mtmp->mx, mtmp->my, u.ux, u.uy) <= 64 && !mtmp->mspec_used) { + struct attack *a; + + for (a = &mdat->mattk[0]; a < &mdat->mattk[NATTK]; a++) { + if (a->aatyp == AT_MAGC && (a->adtyp == AD_SPEL || a->adtyp == AD_CLRC)) { + if (castmu(mtmp, a, FALSE, FALSE)) { + tmp = 3; + break; + } + } + } + } tmp = m_move(mtmp, 0); distfleeck(mtmp,&inrange,&nearby,&scared); /* recalc */ *************** *** 445,450 **** --- 511,520 ---- case 0: /* no movement, but it can still attack you */ case 3: /* absolutely no movement */ /* for pets, case 0 and 3 are equivalent */ + /* vault guard might have vanished */ + if (mtmp->isgd && (mtmp->mhp < 1 || + (mtmp->mx == 0 && mtmp->my == 0))) + return 1; /* behave as if it died */ /* During hallucination, monster appearance should * still change - even if it doesn't move. */ *************** *** 526,532 **** boolean likegold=0, likegems=0, likeobjs=0, likemagic=0, conceals=0; boolean likerock=0, can_tunnel=0; boolean can_open=0, can_unlock=0, doorbuster=0; ! boolean uses_items=0; struct permonst *ptr; struct monst *mtoo; schar mmoved = 0; /* not strictly nec.: chi >= 0 will do */ --- 596,603 ---- boolean likegold=0, likegems=0, likeobjs=0, likemagic=0, conceals=0; boolean likerock=0, can_tunnel=0; boolean can_open=0, can_unlock=0, doorbuster=0; ! boolean uses_items=0, setlikes=0; ! boolean avoid=FALSE; struct permonst *ptr; struct monst *mtoo; schar mmoved = 0; /* not strictly nec.: chi >= 0 will do */ *************** *** 643,648 **** --- 714,722 ---- if (mtmp->mconf || (u.uswallow && mtmp == u.ustuck)) appr = 0; else { + #ifdef GOLDOBJ + struct obj *lepgold, *ygold; + #endif boolean should_see = (couldsee(omx, omy) && (levl[gx][gy].lit || !levl[omx][omy].lit) && *************** *** 658,664 **** --- 732,743 ---- appr = 0; if(monsndx(ptr) == PM_LEPRECHAUN && (appr == 1) && + #ifndef GOLDOBJ (mtmp->mgold > u.ugold)) + #else + ( (lepgold = findgold(mtmp->minvent)) && + (lepgold->quan > ((ygold = findgold(invent)) ? ygold->quan : 0L)) )) + #endif appr = -1; if (!should_see && can_track(ptr)) { *************** *** 699,704 **** --- 778,784 ---- likemagic = (likes_magic(ptr) && pctload < 85); likerock = (throws_rocks(ptr) && pctload < 50 && !In_sokoban(&u.uz)); conceals = hides_under(ptr); + setlikes = TRUE; } } *************** *** 807,813 **** flag |= (ALLOW_SANCT | ALLOW_SSM); else flag |= ALLOW_U; if (is_minion(ptr) || is_rider(ptr)) flag |= ALLOW_SANCT; ! if (is_unicorn(ptr)) flag |= NOTONL; if (passes_walls(ptr)) flag |= (ALLOW_WALL | ALLOW_ROCK); if (can_tunnel) flag |= ALLOW_DIG; if (is_human(ptr) || ptr == &mons[PM_MINOTAUR]) flag |= ALLOW_SSM; --- 887,894 ---- flag |= (ALLOW_SANCT | ALLOW_SSM); else flag |= ALLOW_U; if (is_minion(ptr) || is_rider(ptr)) flag |= ALLOW_SANCT; ! /* unicorn may not be able to avoid hero on a noteleport level */ ! if (is_unicorn(ptr) && !level.flags.noteleport) flag |= NOTONL; if (passes_walls(ptr)) flag |= (ALLOW_WALL | ALLOW_ROCK); if (can_tunnel) flag |= ALLOW_DIG; if (is_human(ptr) || ptr == &mons[PM_MINOTAUR]) flag |= ALLOW_SSM; *************** *** 831,838 **** --- 912,925 ---- /* allow monsters be shortsighted on some levels for balance */ if(!mtmp->mpeaceful && level.flags.shortsighted && nidist > (couldsee(nix,niy) ? 144 : 36) && appr == 1) appr = 0; + if (is_unicorn(ptr) && level.flags.noteleport) { + /* on noteleport levels, perhaps we cannot avoid hero */ + for(i = 0; i < cnt; i++) + if(!(info[i] & NOTONL)) avoid=TRUE; + } for(i=0; i < cnt; i++) { + if (avoid && (info[i] & NOTONL)) continue; nx = poss[i].x; ny = poss[i].y; *************** *** 1042,1050 **** newsym(mtmp->mx,mtmp->my); } if(OBJ_AT(mtmp->mx, mtmp->my) && mtmp->mcanmove) { /* Maybe a rock mole just ate some metal object */ if (metallivorous(ptr)) { ! if (meatgold(mtmp) == 2) return 2; /* it died */ } if(g_at(mtmp->mx,mtmp->my) && likegold) mpickgold(mtmp); --- 1129,1155 ---- newsym(mtmp->mx,mtmp->my); } if(OBJ_AT(mtmp->mx, mtmp->my) && mtmp->mcanmove) { + /* recompute the likes tests, in case we polymorphed + * or if the "likegold" case got taken above */ + if (setlikes) { + register int pctload = (curr_mon_load(mtmp) * 100) / + max_mon_load(mtmp); + + /* look for gold or jewels nearby */ + likegold = (likes_gold(ptr) && pctload < 95); + likegems = (likes_gems(ptr) && pctload < 85); + uses_items = (!mindless(ptr) && !is_animal(ptr) + && pctload < 75); + likeobjs = (likes_objs(ptr) && pctload < 75); + likemagic = (likes_magic(ptr) && pctload < 85); + likerock = (throws_rocks(ptr) && pctload < 50 && + !In_sokoban(&u.uz)); + conceals = hides_under(ptr); + } + /* Maybe a rock mole just ate some metal object */ if (metallivorous(ptr)) { ! if (meatmetal(mtmp) == 2) return 2; /* it died */ } if(g_at(mtmp->mx,mtmp->my) && likegold) mpickgold(mtmp); *************** *** 1114,1119 **** --- 1219,1227 ---- { boolean notseen, gotu; register int disp, mx = mtmp->mux, my = mtmp->muy; + #ifdef GOLDOBJ + long umoney = money_cnt(invent); + #endif /* * do cheapest and/or most likely tests first *************** *** 1128,1135 **** notseen = (!mtmp->mcansee || (Invis && !perceives(mtmp->data))); /* add cases as required. eg. Displacement ... */ ! disp = ((notseen || Underwater) ? 1 : ! Displaced ? (couldsee(mx, my) ? 2 : 1) : 0); if (!disp) goto found_you; /* without something like the following, invis. and displ. --- 1236,1256 ---- notseen = (!mtmp->mcansee || (Invis && !perceives(mtmp->data))); /* add cases as required. eg. Displacement ... */ ! if (notseen || Underwater) { ! /* Xorns can smell valuable metal like gold, treat as seen */ ! if ((mtmp->data == &mons[PM_XORN]) && ! #ifndef GOLDOBJ ! u.ugold ! #else ! umoney ! #endif ! && !Underwater) ! disp = 0; ! else ! disp = 1; ! } else if (Displaced) { ! disp = couldsee(mx, my) ? 2 : 1; ! } else disp = 0; if (!disp) goto found_you; /* without something like the following, invis. and displ. *************** *** 1152,1158 **** || ((mx != u.ux || my != u.uy) && !passes_walls(mtmp->data) && (!ACCESSIBLE(levl[mx][my].typ) || ! (closed_door(mx, my) && !can_ooze(mtmp))))); } else { found_you: mx = u.ux; --- 1273,1280 ---- || ((mx != u.ux || my != u.uy) && !passes_walls(mtmp->data) && (!ACCESSIBLE(levl[mx][my].typ) || ! (closed_door(mx, my) && !can_ooze(mtmp)))) ! || !couldsee(mx, my)); } else { found_you: mx = u.ux; *************** *** 1171,1185 **** --- 1293,1314 ---- if (!amorphous(mtmp->data)) return FALSE; if (mtmp == &youmonst) { + #ifndef GOLDOBJ if (u.ugold > 100L) return FALSE; + #endif chain = invent; } else { + #ifndef GOLDOBJ if (mtmp->mgold > 100L) return FALSE; + #endif chain = mtmp->minvent; } for (obj = chain; obj; obj = obj->nobj) { int typ = obj->otyp; + #ifdef GOLDOBJ + if (typ == GOLD_CLASS && obj->quan > 100L) return FALSE; + #endif if (obj->oclass != GEM_CLASS && !(typ >= ARROW && typ <= BOOMERANG) && !(typ >= DAGGER && typ <= CRYSKNIFE) && *** nethack-3.3.1/src/monst.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/monst.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)monst.c 3.3 2000/07/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)monst.c 3.4 2000/07/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 174,196 **** ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_HISS, MZ_TINY), MR_POISON|MR_STONE, MR_POISON|MR_STONE, ! M1_ANIMAL|M1_NOHANDS, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO|5), A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0), ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_HISS, MZ_SMALL), MR_POISON|MR_STONE, MR_POISON|MR_STONE, ! M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS, M2_HOSTILE, M3_INFRAVISIBLE, ! CLR_YELLOW), MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO|1), A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_HISS, MZ_SMALL), MR_POISON|MR_FIRE, MR_POISON|MR_FIRE, ! M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS, M2_HOSTILE, M3_INFRAVISIBLE, ! CLR_RED), /* * dogs & other canines */ --- 174,197 ---- ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_HISS, MZ_TINY), MR_POISON|MR_STONE, MR_POISON|MR_STONE, ! M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE, ! M3_INFRAVISIBLE, CLR_BROWN), MON("cockatrice", S_COCKATRICE, LVL(5, 6, 6, 30, 0), (G_GENO|5), A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_STON, 0, 0), ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_HISS, MZ_SMALL), MR_POISON|MR_STONE, MR_POISON|MR_STONE, ! M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE|M1_OVIPAROUS, M2_HOSTILE, ! M3_INFRAVISIBLE, CLR_YELLOW), MON("pyrolisk", S_COCKATRICE, LVL(6, 6, 6, 30, 0), (G_GENO|1), A(ATTK(AT_GAZE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_HISS, MZ_SMALL), MR_POISON|MR_FIRE, MR_POISON|MR_FIRE, ! M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE|M1_OVIPAROUS, M2_HOSTILE, ! M3_INFRAVISIBLE, CLR_RED), /* * dogs & other canines */ *************** *** 254,260 **** LVL(5, 12, 4, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), ! SIZ(500, 250, 0, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("werewolf", S_DOG, --- 255,261 ---- LVL(5, 12, 4, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), ! SIZ(500, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("werewolf", S_DOG, *************** *** 316,322 **** A(ATTK(AT_BOOM, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, ! M1_FLY|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY), MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO|5), --- 317,323 ---- A(ATTK(AT_BOOM, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, ! M1_FLY|M1_BREATHLESS|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY), MON("floating eye", S_EYE, LVL(2, 1, 9, 10, 0), (G_GENO|5), *************** *** 330,350 **** A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD, ! M1_FLY|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_WHITE), MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE|G_GENO|2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE, ! M1_FLY|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_RED), MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE|G_GENO|2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC, ! M1_FLY|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, HI_ZAP), #if 0 /* not yet implemented */ MON("beholder", S_EYE, --- 331,351 ---- A(ATTK(AT_EXPL, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), MR_COLD, MR_COLD, ! M1_FLY|M1_BREATHLESS|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_WHITE), MON("flaming sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE|G_GENO|2), A(ATTK(AT_EXPL, AD_FIRE, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), MR_FIRE, MR_FIRE, ! M1_FLY|M1_BREATHLESS|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_RED), MON("shocking sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE|G_GENO|2), A(ATTK(AT_EXPL, AD_ELEC, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), MR_ELEC, MR_ELEC, ! M1_FLY|M1_BREATHLESS|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, HI_ZAP), #if 0 /* not yet implemented */ MON("beholder", S_EYE, *************** *** 384,390 **** LVL(5, 15, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), ! SIZ(600, 300, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, CLR_CYAN), MON("panther", S_FELINE, --- 385,391 ---- LVL(5, 15, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), ! SIZ(600, 300, 0, MS_GROWL, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, CLR_CYAN), MON("panther", S_FELINE, *************** *** 477,483 **** LVL(9, 12, 5, 90, -8), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ! ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK), SIZ(1450, 400, 0, MS_HISS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_FLY|M1_SEE_INVIS|M1_OMNIVORE, M2_HOSTILE|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_COLLECT, --- 478,484 ---- LVL(9, 12, 5, 90, -8), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ! NO_ATTK, NO_ATTK), SIZ(1450, 400, 0, MS_HISS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_FLY|M1_SEE_INVIS|M1_OMNIVORE, M2_HOSTILE|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_COLLECT, *************** *** 486,492 **** LVL(13, 12, 0, 90, -8), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ! ATTK(AT_TENT, AD_DRIN, 2, 1), NO_ATTK), SIZ(1450, 400, 0, MS_HISS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_FLY|M1_SEE_INVIS|M1_OMNIVORE, M2_HOSTILE|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_COLLECT, --- 487,493 ---- LVL(13, 12, 0, 90, -8), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1), ! ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_TENT, AD_DRIN, 2, 1)), SIZ(1450, 400, 0, MS_HISS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_FLY|M1_SEE_INVIS|M1_OMNIVORE, M2_HOSTILE|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_COLLECT, *************** *** 834,840 **** A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_SMALL), 0, 0, ! M1_TUNNEL/*LOGGING*/|M1_ANIMAL|M1_NOHANDS|M1_SWIM, /* In reality, they tunnel instead of cutting lumber. Oh, well. */ M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), /* --- 835,841 ---- A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_SMALL), 0, 0, ! M1_TUNNEL/*LOGGING*/|M1_ANIMAL|M1_NOHANDS|M1_SWIM|M1_HERBIVORE, /* In reality, they tunnel instead of cutting lumber. Oh, well. */ M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), /* *************** *** 1085,1096 **** CLR_YELLOW), MON("Angel", S_ANGEL, LVL(14, 10, -4, 55, 12), (G_NOHELL|G_NOCORPSE|1), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 4), ! ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct epri), MS_CUSS, MZ_HUMAN), MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, ! M1_HUMANOID|M1_SEE_INVIS, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_WHITE), MON("ki-rin", S_ANGEL, --- 1086,1097 ---- CLR_YELLOW), MON("Angel", S_ANGEL, LVL(14, 10, -4, 55, 12), (G_NOHELL|G_NOCORPSE|1), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct epri), MS_CUSS, MZ_HUMAN), MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, ! M1_FLY|M1_HUMANOID|M1_SEE_INVIS, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_WHITE), MON("ki-rin", S_ANGEL, *************** *** 1104,1111 **** M3_INFRAVISIBLE|M3_INFRAVISION, HI_GOLD), MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15), (G_NOHELL|G_NOCORPSE|1), ! A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_GAZE, AD_BLND, 2, 6), ! ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, --- 1105,1112 ---- M3_INFRAVISIBLE|M3_INFRAVISION, HI_GOLD), MON("Archon", S_ANGEL, LVL(19, 16, -6, 80, 15), (G_NOHELL|G_NOCORPSE|1), ! A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), ! ATTK(AT_GAZE, AD_BLND, 2, 6), ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, *************** *** 1142,1149 **** A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 20, 0, MS_SQEEK, MZ_SMALL), MR_SLEEP|MR_POISON, 0, ! M1_FLY|M1_BREATHLESS|M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_REGEN, ! M2_UNDEAD|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), /* * Centaurs */ --- 1143,1150 ---- A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 20, 0, MS_SQEEK, MZ_SMALL), MR_SLEEP|MR_POISON, 0, ! M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_REGEN|M1_OMNIVORE, ! M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), /* * Centaurs */ *************** *** 1362,1368 **** M2_WANDER|M2_STALK|M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_WHITE), MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE|1), ! A(ATTK(AT_ENGL, AD_PHYS, 2,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID|M1_FLY, --- 1363,1369 ---- M2_WANDER|M2_STALK|M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_WHITE), MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOCORPSE|1), ! A(ATTK(AT_ENGL, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID|M1_FLY, *************** *** 1832,1838 **** M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0), (G_GENO|1), ! A(ATTK(AT_BITE, AD_CORRODE, 3, 8), ATTK(AT_NONE, AD_CORRODE, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 250, 0, MS_SILENT, MZ_LARGE), MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON, --- 1833,1839 ---- M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0), (G_GENO|1), ! A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 250, 0, MS_SILENT, MZ_LARGE), MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON, *************** *** 1934,1940 **** */ MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_GENO|2), ! A(ATTK(AT_CLAW, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 350, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, --- 1935,1941 ---- */ MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_GENO|2), ! A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 4, 2), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 350, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, *************** *** 1942,1948 **** CLR_BROWN), MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL|G_GENO|1), ! A(ATTK(AT_CLAW, AD_COLD, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 300, 0, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, --- 1943,1949 ---- CLR_BROWN), MON("ice troll", S_TROLL, LVL(9, 10, 2, 20, -3), (G_NOHELL|G_GENO|1), ! A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_COLD, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 300, 0, MS_GRUNT, MZ_LARGE), MR_COLD, MR_COLD, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, *************** *** 1950,1956 **** CLR_WHITE), MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO|1), ! A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 300, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, --- 1951,1957 ---- CLR_WHITE), MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_GENO|1), ! A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 300, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, *************** *** 1958,1964 **** M3_INFRAVISIBLE|M3_INFRAVISION, CLR_CYAN), MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN|G_GENO), ! A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 350, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE|M1_SWIM, --- 1959,1965 ---- M3_INFRAVISIBLE|M3_INFRAVISION, CLR_CYAN), MON("water troll", S_TROLL, LVL(11, 14, 4, 40, -3), (G_NOGEN|G_GENO), ! A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 350, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE|M1_SWIM, *************** *** 1966,1972 **** CLR_BLUE), MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO|1), ! A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, --- 1967,1973 ---- CLR_BLUE), MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_GENO|1), ! A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, *************** *** 1986,1992 **** * Vampires */ MON("vampire", S_VAMPIRE, ! LVL(10, 12, 1, 25, -8), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, --- 1987,1993 ---- * Vampires */ MON("vampire", S_VAMPIRE, ! LVL(10, 12, 1, 25, -8), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, *************** *** 1994,2000 **** M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE, CLR_RED), MON("vampire lord", S_VAMPIRE, ! LVL(12, 14, 0, 50, -9), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, --- 1995,2001 ---- M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE, CLR_RED), MON("vampire lord", S_VAMPIRE, ! LVL(12, 14, 0, 50, -9), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, *************** *** 2003,2009 **** M3_INFRAVISIBLE, CLR_BLUE), #if 0 /* DEFERRED */ MON("vampire mage", S_VAMPIRE, ! LVL(20, 14, -4, 50, -9), (G_GENO|1), A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, --- 2004,2010 ---- M3_INFRAVISIBLE, CLR_BLUE), #if 0 /* DEFERRED */ MON("vampire mage", S_VAMPIRE, ! LVL(20, 14, -4, 50, -9), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON, 0, *************** *** 2019,2032 **** M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG| M2_NASTY|M2_PRINCE|M2_MALE, ! M3_WAITFORU|M3_WANTSBOOK|M3_INFRAVISIBLE, HI_LORD), /* * Wraiths */ MON("barrow wight", S_WRAITH, LVL(3, 12, 5, 5, -3), (G_GENO|G_NOCORPSE|1), ! A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), ! ATTK(AT_WEAP, AD_DRLI, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 0, 0, MS_SPELL, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_COLLECT, 0, CLR_GRAY), --- 2020,2033 ---- M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG| M2_NASTY|M2_PRINCE|M2_MALE, ! M3_WAITFORU|M3_WANTSCAND|M3_INFRAVISIBLE, HI_LORD), /* * Wraiths */ MON("barrow wight", S_WRAITH, LVL(3, 12, 5, 5, -3), (G_GENO|G_NOCORPSE|1), ! A(ATTK(AT_WEAP, AD_DRLI, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), ! ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 0, 0, MS_SPELL, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_COLLECT, 0, CLR_GRAY), *************** *** 2044,2050 **** NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 0, 0, MS_SPELL, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_HUMANOID, ! M2_UNDEAD|M2_STALK|M2_STRONG|M2_HOSTILE|M2_MALE|M2_COLLECT, 0, HI_LORD), /* * Xorn --- 2045,2051 ---- NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 0, 0, MS_SPELL, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_HUMANOID, ! M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_STRONG|M2_HOSTILE|M2_MALE|M2_COLLECT, 0, HI_LORD), /* * Xorn *************** *** 2054,2060 **** A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK), ! SIZ(1200, 700, 0, MS_SILENT, MZ_MEDIUM), MR_FIRE|MR_COLD|MR_STONE, MR_STONE, M1_BREATHLESS|M1_WALLWALK|M1_THICK_HIDE|M1_METALLIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_BROWN), --- 2055,2061 ---- A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK), ! SIZ(1200, 700, 0, MS_ROAR, MZ_MEDIUM), MR_FIRE|MR_COLD|MR_STONE, MR_STONE, M1_BREATHLESS|M1_WALLWALK|M1_THICK_HIDE|M1_METALLIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_BROWN), *************** *** 2465,2472 **** */ MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_GAZE, AD_STON, 0, 0), ! ATTK(AT_BITE, AD_DRST, 1, 6), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HISS, MZ_LARGE), MR_POISON|MR_STONE, MR_POISON|MR_STONE, --- 2466,2473 ---- */ MON("Medusa", S_HUMAN, LVL(20, 12, 2, 50, -15), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8), ! ATTK(AT_GAZE, AD_STON, 0, 0), ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HISS, MZ_LARGE), MR_POISON|MR_STONE, MR_POISON|MR_STONE, *************** *** 2578,2584 **** NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_POIS, ! M2_DEMON|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8), (G_HELL|G_NOCORPSE|G_SGROUP|2), --- 2579,2586 ---- NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_POIS, ! M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_FEMALE| ! M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("barbed devil", S_DEMON, LVL(8, 12, 0, 35, 8), (G_HELL|G_NOCORPSE|G_SGROUP|2), *************** *** 2590,2597 **** MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), ! ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), ! ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4)), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_SLITHY|M1_SEE_INVIS|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_FEMALE|M2_COLLECT, --- 2592,2599 ---- MON("marilith", S_DEMON, LVL(7, 12, -6, 80, -12), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), ! ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ! ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4)), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_SLITHY|M1_SEE_INVIS|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_FEMALE|M2_COLLECT, *************** *** 2668,2674 **** MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8), ! ATTK(AT_WEAP, AD_PLYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, NO_ATTK), SIZ(900, 500, 0, MS_ORC, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, --- 2670,2676 ---- MON("Yeenoghu", S_DEMON, LVL(56, 18, -5, 80, -15), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_CONF, 2, 8), ! ATTK(AT_CLAW, AD_PLYS, 1, 6), ATTK(AT_MAGC, AD_MAGM, 2, 6), NO_ATTK, NO_ATTK), SIZ(900, 500, 0, MS_ORC, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, *************** *** 2677,2684 **** M3_WANTSAMUL|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), ! A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_WEAP, AD_PHYS, 3, 6), ! ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK), SIZ(1500, 500, 0, MS_ORC, MZ_HUGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, --- 2679,2686 ---- M3_WANTSAMUL|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Orcus", S_DEMON, LVL(66, 9, -6, 85, -20), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 4), ! ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK), SIZ(1500, 500, 0, MS_ORC, MZ_HUGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, *************** *** 2811,2817 **** NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 350, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_SLITHY|M1_NOLIMBS| ! M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, 0, CLR_GRAY), MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO|G_NOGEN), --- 2813,2819 ---- NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 350, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_SLITHY|M1_NOLIMBS| ! M1_CARNIVORE|M1_OVIPAROUS|M1_THICK_HIDE|M1_NOTAKE, M2_HOSTILE, 0, CLR_GRAY), MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO|G_NOGEN), *************** *** 2917,2931 **** */ MON("archeologist", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_TUNNEL|M1_NEEDPICK|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), --- 2919,2933 ---- */ MON("archeologist", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_TUNNEL|M1_NEEDPICK|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("barbarian", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), *************** *** 2954,2968 **** M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, ! A(ATTK(AT_KICK, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_HERBIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT|M2_MALE, --- 2956,2970 ---- M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("knight", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("monk", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, ! A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_HERBIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT|M2_MALE, *************** *** 2993,3024 **** HI_DOMESTIC), MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), #ifdef TOURIST MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), #endif MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, -1), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, --- 2995,3026 ---- HI_DOMESTIC), MON("rogue", S_HUMAN, LVL(10, 12, 10, 1, -3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("samurai", S_HUMAN, LVL(10, 12, 10, 1, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), #ifdef TOURIST MON("tourist", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), #endif MON("valkyrie", S_HUMAN, LVL(10, 12, 10, 1, -1), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_COLD, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, *************** *** 3094,3101 **** M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("King Arthur", S_HUMAN, LVL(20, 12, 0, 40, 20), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| --- 3096,3103 ---- M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("King Arthur", S_HUMAN, LVL(20, 12, 0, 40, 20), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| *************** *** 3143,3150 **** M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("Lord Sato", S_HUMAN, LVL(20, 12, 0, 30, 20), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| --- 3145,3152 ---- M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("Lord Sato", S_HUMAN, LVL(20, 12, 0, 30, 20), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| *************** *** 3153,3160 **** #ifdef TOURIST MON("Twoflower", S_HUMAN, LVL(20, 12, 10, 20, 0), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| --- 3155,3162 ---- #ifdef TOURIST MON("Twoflower", S_HUMAN, LVL(20, 12, 10, 20, 0), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| *************** *** 3163,3183 **** #endif MON("Norn", S_HUMAN, LVL(20, 12, 0, 80, 0), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_COLD, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_FEMALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), ! MON("Wizard of Balance", S_HUMAN, LVL(20, 12, 0, 60, 0), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, ! M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT|M2_MAGIC, ! M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), /* * quest nemeses */ --- 3165,3186 ---- #endif MON("Norn", S_HUMAN, LVL(20, 12, 0, 80, 0), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_COLD, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_FEMALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), ! MON("Neferet the Green", S_HUMAN, LVL(20, 12, 0, 60, 0), (G_NOGEN|G_UNIQ), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 2, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, ! M2_NOPOLY|M2_HUMAN|M2_FEMALE|M2_PNAME|M2_PEACEFUL| ! M2_STRONG|M2_COLLECT|M2_MAGIC, ! M3_CLOSE|M3_INFRAVISIBLE, CLR_GREEN), /* * quest nemeses */ *************** *** 3192,3199 **** M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, CLR_RED), MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14), (G_NOGEN|G_UNIQ|G_NOCORPSE), ! A(ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), ! ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, --- 3195,3202 ---- M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, CLR_RED), MON("Thoth Amon", S_HUMAN, LVL(16, 12, 0, 10, -14), (G_NOGEN|G_UNIQ|G_NOCORPSE), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), ! ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, *************** *** 3311,3318 **** M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD), MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10), (G_NOGEN|G_UNIQ|G_NOCORPSE), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), ! ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, --- 3314,3321 ---- M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD), MON("Dark One", S_HUMAN, LVL(15, 12, 0, 80, -10), (G_NOGEN|G_UNIQ|G_NOCORPSE), ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! ATTK(AT_CLAW, AD_SAMU, 1, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, *************** *** 3366,3373 **** HI_DOMESTIC), MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, --- 3369,3376 ---- HI_DOMESTIC), MON("page", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, *************** *** 3398,3421 **** M3_INFRAVISION|M3_INFRAVISIBLE, HI_DOMESTIC), MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_GREEDY|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, --- 3401,3424 ---- M3_INFRAVISION|M3_INFRAVISIBLE, HI_DOMESTIC), MON("thug", S_HUMAN, LVL(5, 12, 10, 10, -3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_GREEDY|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("ninja", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("roshi", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, *************** *** 3432,3439 **** #endif MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, -1), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, --- 3435,3442 ---- #endif MON("warrior", S_HUMAN, LVL(5, 12, 10, 10, -1), G_NOGEN, ! A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8), ! NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, *** nethack-3.3.1/src/mplayer.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mplayer.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mplayer.c 3.3 97/02/04 */ /* Copyright (c) Izchak Miller, 1992. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mplayer.c 3.4 1997/02/04 */ /* Copyright (c) Izchak Miller, 1992. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 9,15 **** STATIC_DCL void FDECL(mk_mplayer_armor, (struct monst *, SHORT_P)); /* These are the names of those who ! * contributed to the development of NetHack 3.2/3.3. * * Keep in alphabetical order within teams. * Same first name is entered once within each team. --- 9,15 ---- STATIC_DCL void FDECL(mk_mplayer_armor, (struct monst *, SHORT_P)); /* These are the names of those who ! * contributed to the development of NetHack 3.2/3.3/3.4. * * Keep in alphabetical order within teams. * Same first name is entered once within each team. *************** *** 18,34 **** /* devteam */ "Dave", "Dean", "Eric", "Izchak", "Janet", "Jessie", "Ken", "Kevin", "Michael", "Mike", "Pat", "Paul", "Steve", "Timo", /* PC team */ "Bill", "Eric", "Keizo", "Ken", "Kevin", "Michael", "Mike", "Paul", "Stephen", "Steve", "Timo", "Yitzhak", /* Amiga team */ ! "Andy", "Gregg", "Keni", "Mike", "Olaf", "Richard", /* Mac team */ "Andy", "Chris", "Dean", "Jon", "Jonathan", "Kevin", "Wang", /* Atari team */ ! "Eric", "Warwick", /* NT team */ ! "Michael", /* OS/2 team */ "Helge", "Ron", "Timo", /* VMS team */ --- 18,35 ---- /* devteam */ "Dave", "Dean", "Eric", "Izchak", "Janet", "Jessie", "Ken", "Kevin", "Michael", "Mike", "Pat", "Paul", "Steve", "Timo", + "Warwick", /* PC team */ "Bill", "Eric", "Keizo", "Ken", "Kevin", "Michael", "Mike", "Paul", "Stephen", "Steve", "Timo", "Yitzhak", /* Amiga team */ ! "Andy", "Gregg", "Janne", "Keni", "Mike", "Olaf", "Richard", /* Mac team */ "Andy", "Chris", "Dean", "Jon", "Jonathan", "Kevin", "Wang", /* Atari team */ ! "Eric", "Marvin", "Warwick", /* NT team */ ! "Alex", "Dion", "Michael", /* OS/2 team */ "Helge", "Ron", "Timo", /* VMS team */ *************** *** 255,261 **** --- 256,266 ---- (void)mongets(mtmp, rnd_class(DILITHIUM_CRYSTAL, JADE)); /* To get the gold "right" would mean a player can double his */ /* gold supply by killing one mplayer. Not good. */ + #ifndef GOLDOBJ mtmp->mgold = rn2(1000); + #else + mkmonmoney(mtmp, rn2(1000)); + #endif quan = rn2(10); while(quan--) (void) mpickobj(mtmp, mkobj(RANDOM_CLASS, FALSE)); *** nethack-3.3.1/src/mthrowu.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/mthrowu.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mthrowu.c 3.3 2000/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mthrowu.c 3.4 2001/12/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 32,40 **** "strange breath #9" }; ! int ! thitu(tlev, dam, obj, name) /* u is hit by sth, but not a monster */ int tlev, dam; struct obj *obj; const char *name; /* if null, then format `obj' */ --- 32,40 ---- "strange breath #9" }; ! /* hero is hit by something other than a monster */ int ! thitu(tlev, dam, obj, name) int tlev, dam; struct obj *obj; const char *name; /* if null, then format `obj' */ *************** *** 48,54 **** unsigned save_ocknown; if (!obj) panic("thitu: name & obj both null?"); ! name = strcpy(onmbuf, (obj->quan > 1L) ? doname(obj) : xname(obj)); /* killer name should be more specific; however, exact info like blessed/cursed and rustproof make things too verbose */ otmp = *obj; --- 48,55 ---- unsigned save_ocknown; if (!obj) panic("thitu: name & obj both null?"); ! name = strcpy(onmbuf, ! (obj->quan > 1L) ? doname(obj) : mshot_xname(obj)); /* killer name should be more specific; however, exact info like blessed/cursed and rustproof make things too verbose */ otmp = *obj; *************** *** 71,81 **** if(u.uac + tlev <= rnd(20)) { if(Blind || !flags.verbose) pline("It misses."); ! else You("are almost hit by %s!", onm); return(0); } else { if(Blind || !flags.verbose) You("are hit!"); ! else You("are hit by %s!", onm); if (obj && objects[obj->otyp].oc_material == SILVER && hates_silver(youmonst.data)) { --- 72,82 ---- if(u.uac + tlev <= rnd(20)) { if(Blind || !flags.verbose) pline("It misses."); ! else You("are almost hit by %s.", onm); return(0); } else { if(Blind || !flags.verbose) You("are hit!"); ! else You("are hit by %s%s", onm, exclam(dam)); if (obj && objects[obj->otyp].oc_material == SILVER && hates_silver(youmonst.data)) { *************** *** 129,134 **** --- 130,139 ---- if (!objgone) { if (!flooreffects(obj,x,y,"fall")) { /* don't double-dip on damage */ place_object(obj, x, y); + if (!mtmp && x == u.ux && y == u.uy) + mtmp = &youmonst; + if (mtmp && ohit) + passive_obj(mtmp, obj, (struct attack *)0); stackobj(obj); retvalu = 0; } *************** *** 161,167 **** tmp = 5 + find_mac(mtmp) + omon_adj(mtmp, otmp, FALSE); if (tmp < rnd(20)) { if (!ismimic) { ! if (vis) miss(distant_name(otmp, xname), mtmp); else if (verbose) pline("It is missed."); } if (!range) { /* Last position; object drops */ --- 166,172 ---- tmp = 5 + find_mac(mtmp) + omon_adj(mtmp, otmp, FALSE); if (tmp < rnd(20)) { if (!ismimic) { ! if (vis) miss(distant_name(otmp, mshot_xname), mtmp); else if (verbose) pline("It is missed."); } if (!range) { /* Last position; object drops */ *************** *** 180,186 **** damage = 0; if (ismimic) seemimic(mtmp); mtmp->msleeping = 0; ! if (vis) hit(distant_name(otmp,xname), mtmp, exclam(damage)); else if (verbose) pline("It is hit%s", exclam(damage)); if (otmp->opoisoned) { --- 185,191 ---- damage = 0; if (ismimic) seemimic(mtmp); mtmp->msleeping = 0; ! if (vis) hit(distant_name(otmp,mshot_xname), mtmp, exclam(damage)); else if (verbose) pline("It is hit%s", exclam(damage)); if (otmp->opoisoned) { *************** *** 218,224 **** pline("%s is %s!", Monnam(mtmp), (nonliving(mtmp->data) || !vis) ? "destroyed" : "killed"); ! mondied(mtmp); } if (can_blnd((struct monst*)0, mtmp, --- 223,230 ---- pline("%s is %s!", Monnam(mtmp), (nonliving(mtmp->data) || !vis) ? "destroyed" : "killed"); ! if (!flags.mon_moving) xkilled(mtmp,0); ! else mondied(mtmp); } if (can_blnd((struct monst*)0, mtmp, *************** *** 270,283 **** /* not possibly_unwield, which checks the object's */ /* location, not its existence */ if (MON_WEP(mon) == obj) { ! obj->owornmask &= ~W_WEP; MON_NOWEP(mon); } obj_extract_self(obj); singleobj = obj; obj = (struct obj *) 0; } else { ! singleobj = splitobj(obj, obj->quan - 1L); obj_extract_self(singleobj); } --- 276,289 ---- /* not possibly_unwield, which checks the object's */ /* location, not its existence */ if (MON_WEP(mon) == obj) { ! setmnotwielded(mon,obj); MON_NOWEP(mon); } obj_extract_self(obj); singleobj = obj; obj = (struct obj *) 0; } else { ! singleobj = splitobj(obj, 1L); obj_extract_self(singleobj); } *************** *** 288,295 **** if(is_ammo(singleobj)) pline("%s misfires!", Monnam(mon)); else ! pline("%s slips as %s throws it!", ! The(xname(singleobj)), mon_nam(mon)); } dx = rn2(3)-1; dy = rn2(3)-1; --- 294,301 ---- if(is_ammo(singleobj)) pline("%s misfires!", Monnam(mon)); else ! pline("%s as %s throws it!", ! Tobjnam(singleobj, "slip"), mon_nam(mon)); } dx = rn2(3)-1; dy = rn2(3)-1; *************** *** 389,414 **** poisoned(onmbuf, A_STR, knmbuf, 10); objects[otmp.otyp].oc_name_known = save_ocknown; } ! if(hitu && (singleobj->otyp == CREAM_PIE || ! singleobj->otyp == BLINDING_VENOM)) { blindinc = rnd(25); if(singleobj->otyp == CREAM_PIE) { if(!Blind) pline("Yecch! You've been creamed."); ! else pline("There's %s sticky all over your %s.", ! something, ! body_part(FACE)); ! } else { /* venom in the eyes */ ! if(ublindf) /* nothing */ ; ! else if(!Blind) pline_The("venom blinds you."); ! else Your("%s sting.", makeplural(body_part(EYE))); } } if (hitu && singleobj->otyp == EGG) { if (!Stone_resistance ! && !(poly_when_stoned(youmonst.data) && ! polymon(PM_STONE_GOLEM))) Stoned = 5; killer = (char *) 0; } stop_occupation(); if (hitu || !range) { --- 395,427 ---- poisoned(onmbuf, A_STR, knmbuf, 10); objects[otmp.otyp].oc_name_known = save_ocknown; } ! if(hitu && ! can_blnd((struct monst*)0, &youmonst, ! (uchar)(singleobj->otyp == BLINDING_VENOM ? ! AT_SPIT : AT_WEAP), singleobj)) { blindinc = rnd(25); if(singleobj->otyp == CREAM_PIE) { if(!Blind) pline("Yecch! You've been creamed."); ! else pline("There's %s sticky all over your %s.", ! something, ! body_part(FACE)); ! } else if(singleobj->otyp == BLINDING_VENOM) { ! int num_eyes = eyecount(youmonst.data); ! /* venom in the eyes */ ! if(!Blind) pline_The("venom blinds you."); ! else Your("%s sting%s.", ! (num_eyes == 1) ? body_part(EYE) : ! makeplural(body_part(EYE)), ! (num_eyes == 1) ? "s" : ""); } } if (hitu && singleobj->otyp == EGG) { if (!Stone_resistance ! && !(poly_when_stoned(youmonst.data) && ! polymon(PM_STONE_GOLEM))) { Stoned = 5; killer = (char *) 0; + } } stop_occupation(); if (hitu || !range) { *************** *** 434,443 **** tmp_at(bhitpos.x, bhitpos.y); delay_output(); tmp_at(DISP_END, 0); ! /* blindfolds, towels, & lenses keep substances out of your eyes */ ! if (blindinc && !ublindf) { u.ucreamed += blindinc; ! make_blinded(Blinded + blindinc,FALSE); } } --- 447,457 ---- tmp_at(bhitpos.x, bhitpos.y); delay_output(); tmp_at(DISP_END, 0); ! ! if (blindinc) { u.ucreamed += blindinc; ! make_blinded(Blinded + (long)blindinc, FALSE); ! if (!Blind) Your(vision_clears); } } *************** *** 452,457 **** --- 466,472 ---- { if (obj->quan > 1L) { obj->quan--; + obj->owt = weight(obj); } else { obj_extract_self(obj); possibly_unwield(mon); *************** *** 459,480 **** mon->misc_worn_check &= ~obj->owornmask; update_mon_intrinsics(mon, obj, FALSE); } ! dealloc_obj(obj); } } #endif /* OVLB */ #ifdef OVL1 void ! thrwmu(mtmp) /* monster throws item at you */ ! register struct monst *mtmp; { struct obj *otmp, *mwep; ! register xchar x, y; ! boolean ispole; schar skill; ! int multishot = 1; /* Rearranged beginning so monsters can use polearms not in a line */ if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) { --- 474,496 ---- mon->misc_worn_check &= ~obj->owornmask; update_mon_intrinsics(mon, obj, FALSE); } ! obfree(obj, (struct obj*) 0); } } #endif /* OVLB */ #ifdef OVL1 + /* monster attempts ranged weapon attack against player */ void ! thrwmu(mtmp) ! struct monst *mtmp; { struct obj *otmp, *mwep; ! xchar x, y; schar skill; ! int multishot; ! const char *onm; /* Rearranged beginning so monsters can use polearms not in a line */ if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) { *************** *** 486,587 **** /* Pick a weapon */ otmp = select_rwep(mtmp); if (!otmp) return; ! ispole = is_pole(otmp); skill = objects[otmp->otyp].oc_skill; mwep = MON_WEP(mtmp); /* wielded weapon */ ! if(ispole || lined_up(mtmp)) { ! /* If you are coming toward the monster, the monster ! * should try to soften you up with missiles. If you are ! * going away, you are probably hurt or running. Give ! * chase, but if you are getting too far away, throw. ! */ ! x = mtmp->mx; ! y = mtmp->my; ! if(ispole || !URETREATING(x,y) || ! !rn2(BOLT_LIM-distmin(x,y,mtmp->mux,mtmp->muy))) ! { ! const char *verb = "throws"; ! ! if (otmp->otyp == ARROW ! || otmp->otyp == ELVEN_ARROW ! || otmp->otyp == ORCISH_ARROW ! || otmp->otyp == YA ! || otmp->otyp == CROSSBOW_BOLT) verb = "shoots"; ! if (ispole) { ! if (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= ! POLE_LIM && couldsee(mtmp->mx, mtmp->my)) ! verb = "thrusts"; ! else return; /* Out of range, or intervening wall */ ! } ! if (canseemon(mtmp)) { ! pline("%s %s %s!", Monnam(mtmp), verb, ! obj_is_pname(otmp) ? ! the(singular(otmp, xname)) : ! an(singular(otmp, xname))); ! } ! /* Use a pole */ ! if (ispole) { ! int dam = dmgval(otmp, &youmonst); ! int hitv = 3 - distmin(u.ux,u.uy, mtmp->mx,mtmp->my); ! ! if (hitv < -4) hitv = -4; ! if (bigmonst(youmonst.data)) hitv++; ! hitv += 8 + otmp->spe; ! if (dam < 1) dam = 1; ! (void) thitu(hitv, dam, otmp, (char *)0); ! return; ! } ! /* Multishot calculations */ ! if ((ammo_and_launcher(otmp, mwep) || skill == P_DAGGER || ! skill == -P_DART || skill == -P_SHURIKEN) && ! !mtmp->mconf) { ! /* Assumes lords are skilled, princes are expert */ ! if (is_lord(mtmp->data)) multishot++; ! if (is_prince(mtmp->data)) multishot += 2; ! ! switch (monsndx(mtmp->data)) { ! case PM_RANGER: ! multishot++; ! break; ! case PM_ROGUE: ! if (skill == P_DAGGER) multishot++; ! break; ! case PM_SAMURAI: ! if (otmp->otyp == YA && mwep && ! mwep->otyp == YUMI) multishot++; ! break; ! default: ! break; ! } ! { /* racial bonus */ ! if (is_elf(mtmp->data) && ! otmp->otyp == ELVEN_ARROW && ! mwep && mwep->otyp == ELVEN_BOW) ! multishot++; ! else if (is_orc(mtmp->data) && ! otmp->otyp == ORCISH_ARROW && ! mwep && mwep->otyp == ORCISH_BOW) ! multishot++; ! } ! } ! if (otmp->quan < multishot) multishot = (int)otmp->quan; ! if (multishot < 1) multishot = 1; ! else multishot = rnd(multishot); ! while (multishot-- > 0) ! m_throw(mtmp, mtmp->mx, mtmp->my, ! sgn(tbx), sgn(tby), ! distmin(mtmp->mx, mtmp->my, ! mtmp->mux, mtmp->muy), ! otmp); ! nomul(0); ! return; ! } ! } } #endif /* OVL1 */ --- 502,615 ---- /* Pick a weapon */ otmp = select_rwep(mtmp); if (!otmp) return; ! ! if (is_pole(otmp)) { ! int dam, hitv; ! ! if (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) > POLE_LIM || ! !couldsee(mtmp->mx, mtmp->my)) ! return; /* Out of range, or intervening wall */ ! ! if (canseemon(mtmp)) { ! onm = xname(otmp); ! pline("%s thrusts %s.", Monnam(mtmp), ! obj_is_pname(otmp) ? the(onm) : an(onm)); ! } ! ! dam = dmgval(otmp, &youmonst); ! hitv = 3 - distmin(u.ux,u.uy, mtmp->mx,mtmp->my); ! if (hitv < -4) hitv = -4; ! if (bigmonst(youmonst.data)) hitv++; ! hitv += 8 + otmp->spe; ! if (dam < 1) dam = 1; ! ! (void) thitu(hitv, dam, otmp, (char *)0); ! stop_occupation(); ! return; ! } ! ! x = mtmp->mx; ! y = mtmp->my; ! /* If you are coming toward the monster, the monster ! * should try to soften you up with missiles. If you are ! * going away, you are probably hurt or running. Give ! * chase, but if you are getting too far away, throw. ! */ ! if (!lined_up(mtmp) || ! (URETREATING(x,y) && ! rn2(BOLT_LIM - distmin(x,y,mtmp->mux,mtmp->muy)))) ! return; ! skill = objects[otmp->otyp].oc_skill; mwep = MON_WEP(mtmp); /* wielded weapon */ ! /* Multishot calculations */ ! multishot = 1; ! if ((ammo_and_launcher(otmp, mwep) || skill == P_DAGGER || ! skill == -P_DART || skill == -P_SHURIKEN) && !mtmp->mconf) { ! /* Assumes lords are skilled, princes are expert */ ! if (is_prince(mtmp->data)) multishot += 2; ! else if (is_lord(mtmp->data)) multishot++; ! ! switch (monsndx(mtmp->data)) { ! case PM_RANGER: ! multishot++; ! break; ! case PM_ROGUE: ! if (skill == P_DAGGER) multishot++; ! break; ! case PM_NINJA: ! case PM_SAMURAI: ! if (otmp->otyp == YA && mwep && ! mwep->otyp == YUMI) multishot++; ! break; ! default: ! break; ! } ! /* racial bonus */ ! if ((is_elf(mtmp->data) && ! otmp->otyp == ELVEN_ARROW && ! mwep && mwep->otyp == ELVEN_BOW) || ! (is_orc(mtmp->data) && ! otmp->otyp == ORCISH_ARROW && ! mwep && mwep->otyp == ORCISH_BOW)) ! multishot++; ! ! if ((long)multishot > otmp->quan) multishot = (int)otmp->quan; ! if (multishot < 1) multishot = 1; ! else multishot = rnd(multishot); ! } ! if (canseemon(mtmp)) { ! char onmbuf[BUFSZ]; ! if (multishot > 1) { ! /* "N arrows"; multishot > 1 implies otmp->quan > 1, so ! xname()'s result will already be pluralized */ ! Sprintf(onmbuf, "%d %s", multishot, xname(otmp)); ! onm = onmbuf; ! } else { ! /* "an arrow" */ ! onm = singular(otmp, xname); ! onm = obj_is_pname(otmp) ? the(onm) : an(onm); ! } ! m_shot.s = ammo_and_launcher(otmp,mwep) ? TRUE : FALSE; ! pline("%s %s %s!", Monnam(mtmp), ! m_shot.s ? "shoots" : "throws", onm); ! m_shot.o = otmp->otyp; ! } else { ! m_shot.o = STRANGE_OBJECT; /* don't give multishot feedback */ ! } ! m_shot.n = multishot; ! for (m_shot.i = 1; m_shot.i <= m_shot.n; m_shot.i++) ! m_throw(mtmp, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), ! distmin(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy), otmp); ! m_shot.n = m_shot.i = 0; ! m_shot.o = STRANGE_OBJECT; ! m_shot.s = FALSE; ! nomul(0); } #endif /* OVL1 */ *** nethack-3.3.1/src/muse.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/muse.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)muse.c 3.3 2000/06/02 */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)muse.c 3.4 2002/02/07 */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 19,24 **** --- 19,25 ---- * don't know not to read scrolls, etc.... */ + STATIC_DCL struct permonst *FDECL(muse_newcham_mon, (struct monst *)); STATIC_DCL int FDECL(precheck, (struct monst *,struct obj *)); STATIC_DCL void FDECL(mzapmsg, (struct monst *,struct obj *,BOOLEAN_P)); STATIC_DCL void FDECL(mreadmsg, (struct monst *,struct obj *)); *************** *** 28,33 **** --- 29,36 ---- (struct monst *,int,int FDECL((*),(MONST_P,OBJ_P)), int FDECL((*),(OBJ_P,OBJ_P)),struct obj *)); STATIC_DCL void FDECL(you_aggravate, (struct monst *)); + STATIC_DCL void FDECL(mon_consume_unstone, (struct monst *,struct obj *, + BOOLEAN_P,BOOLEAN_P)); static struct musable { struct obj *offensive; *************** *** 153,159 **** "nearby" : "distant"); } else if (self) pline("%s zaps %sself with %s!", ! Monnam(mtmp), him[pronoun_gender(mtmp)], doname(otmp)); else { pline("%s zaps %s!", Monnam(mtmp), an(xname(otmp))); stop_occupation(); --- 156,162 ---- "nearby" : "distant"); } else if (self) pline("%s zaps %sself with %s!", ! Monnam(mtmp), mhim(mtmp), doname(otmp)); else { pline("%s zaps %s!", Monnam(mtmp), an(xname(otmp))); stop_occupation(); *************** *** 196,202 **** if (mtmp->mconf) pline("Being confused, %s mispronounces the magic words...", ! vismon ? mon_nam(mtmp) : he[pronoun_gender(mtmp)]); } STATIC_OVL void --- 199,205 ---- if (mtmp->mconf) pline("Being confused, %s mispronounces the magic words...", ! vismon ? mon_nam(mtmp) : mhe(mtmp)); } STATIC_OVL void *************** *** 234,239 **** --- 237,243 ---- #define MUSE_BUGLE 16 #define MUSE_UNICORN_HORN 17 #define MUSE_POT_FULL_HEALING 18 + #define MUSE_LIZARD_CORPSE 19 /* #define MUSE_INNATE_TPT 9999 * We cannot use this. Since monsters get unlimited teleportation, if they *************** *** 281,286 **** --- 285,300 ---- } } + if (mtmp->mconf) { + for(obj = mtmp->minvent; obj; obj = obj->nobj) { + if (obj->otyp == CORPSE && obj->corpsenm == PM_LIZARD) { + m.defensive = obj; + m.has_defense = MUSE_LIZARD_CORPSE; + return TRUE; + } + } + } + /* It so happens there are two unrelated cases when we might want to * check specifically for healing alone. The first is when the monster * is blind (healing cures blindness). The second is when the monster *************** *** 419,424 **** --- 433,440 ---- if (obj->otyp == WAN_DIGGING && obj->spe > 0 && !stuck && !t && !mtmp->isshk && !mtmp->isgd && !mtmp->ispriest && !is_floater(mtmp->data) + /* monsters digging in Sokoban can ruin things */ + && !In_sokoban(&u.uz) /* digging wouldn't be effective; assume they know that */ && !(levl[x][y].wall_info & W_NONDIGGABLE) && !(Is_botlevel(&u.uz) || In_endgame(&u.uz)) *************** *** 509,515 **** rushing right straight back; don't override if already scared */ fleetim = !mtmp->mflee ? (33 - (30 * mtmp->mhp / mtmp->mhpmax)) : 0; #define m_flee(m) if (fleetim && !m->iswiz) \ ! { m->mflee = 1; m->mfleetim = fleetim; } switch(m.has_defense) { case MUSE_UNICORN_HORN: --- 525,531 ---- rushing right straight back; don't override if already scared */ fleetim = !mtmp->mflee ? (33 - (30 * mtmp->mhp / mtmp->mhpmax)) : 0; #define m_flee(m) if (fleetim && !m->iswiz) \ ! { monflee(m, fleetim, FALSE, FALSE); } switch(m.has_defense) { case MUSE_UNICORN_HORN: *************** *** 701,706 **** --- 717,726 ---- pline("%s %s into a %s!", Monnam(mtmp), makeplural(locomotion(mtmp->data, "jump")), t->ttyp == TRAPDOOR ? "trap door" : "hole"); + if (levl[trapx][trapy].typ == SCORR) { + levl[trapx][trapy].typ = CORR; + unblock_point(trapx, trapy); + } seetrap(t_at(trapx,trapy)); } *************** *** 734,740 **** (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) { if (vismon) pline( "As %s climbs the stairs, a mysterious force momentarily surrounds %s...", ! mon_nam(mtmp), him[pronoun_gender(mtmp)]); /* simpler than for the player; this will usually be the Wizard and he'll immediately go right to the upstairs, so there's not much point in having any --- 754,760 ---- (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) { if (vismon) pline( "As %s climbs the stairs, a mysterious force momentarily surrounds %s...", ! mon_nam(mtmp), mhim(mtmp)); /* simpler than for the player; this will usually be the Wizard and he'll immediately go right to the upstairs, so there's not much point in having any *************** *** 787,792 **** --- 807,816 ---- if (vis) { pline("%s %s onto a teleport trap!", Monnam(mtmp), makeplural(locomotion(mtmp->data, "jump"))); + if (levl[trapx][trapy].typ == SCORR) { + levl[trapx][trapy].typ = CORR; + unblock_point(trapx, trapy); + } seetrap(t_at(trapx,trapy)); } /* don't use rloc_to() because worm tails must "move" */ *************** *** 839,844 **** --- 863,872 ---- if (oseen) makeknown(otmp->otyp); m_useup(mtmp, otmp); return 2; + case MUSE_LIZARD_CORPSE: + /* not actually called for its unstoning effect */ + mon_consume_unstone(mtmp, otmp, FALSE, FALSE); + return 2; case 0: return 0; /* i.e. an exploded wand */ default: impossible("%s wanted to perform action %d?", Monnam(mtmp), m.has_defense); *************** *** 987,993 **** m.has_offense = MUSE_POT_PARALYSIS; } nomore(MUSE_POT_BLINDNESS); ! if(obj->otyp == POT_BLINDNESS) { m.offensive = obj; m.has_offense = MUSE_POT_BLINDNESS; } --- 1015,1021 ---- m.has_offense = MUSE_POT_PARALYSIS; } nomore(MUSE_POT_BLINDNESS); ! if(obj->otyp == POT_BLINDNESS && !attacktype(mtmp->data, AT_GAZE)) { m.offensive = obj; m.has_offense = MUSE_POT_BLINDNESS; } *************** *** 1332,1338 **** if (canspotmon(mtmp2)) pline("%s's %s does not protect %s.", Monnam(mtmp2), xname(helmet), ! him[pronoun_gender(mtmp2)]); } } mtmp2->mhp -= mdmg; --- 1360,1366 ---- if (canspotmon(mtmp2)) pline("%s's %s does not protect %s.", Monnam(mtmp2), xname(helmet), ! mhim(mtmp2)); } } mtmp2->mhp -= mdmg; *************** *** 1352,1358 **** } m_useup(mtmp, otmp); /* Attack the player */ ! if (dist2(mmx, mmy, u.ux, u.uy) == 1 && !otmp->cursed) { int dmg; struct obj *otmp2; --- 1380,1386 ---- } m_useup(mtmp, otmp); /* Attack the player */ ! if (distmin(mmx, mmy, u.ux, u.uy) == 1 && !otmp->cursed) { int dmg; struct obj *otmp2; *************** *** 1579,1585 **** if(obj->otyp == WAN_MAKE_INVISIBLE && obj->spe > 0 && !mtmp->minvis && !mtmp->invis_blkd && (!mtmp->mpeaceful || See_invisible) && ! (mdat != &mons[PM_MEDUSA] || mtmp->mcan)) { m.misc = obj; m.has_misc = MUSE_WAN_MAKE_INVISIBLE; } --- 1607,1613 ---- if(obj->otyp == WAN_MAKE_INVISIBLE && obj->spe > 0 && !mtmp->minvis && !mtmp->invis_blkd && (!mtmp->mpeaceful || See_invisible) && ! (!attacktype(mtmp->data, AT_GAZE) || mtmp->mcan)) { m.misc = obj; m.has_misc = MUSE_WAN_MAKE_INVISIBLE; } *************** *** 1587,1593 **** if(obj->otyp == POT_INVISIBILITY && !mtmp->minvis && !mtmp->invis_blkd && (!mtmp->mpeaceful || See_invisible) && ! (mdat != &mons[PM_MEDUSA] || mtmp->mcan)) { m.misc = obj; m.has_misc = MUSE_POT_INVISIBILITY; } --- 1615,1621 ---- if(obj->otyp == POT_INVISIBILITY && !mtmp->minvis && !mtmp->invis_blkd && (!mtmp->mpeaceful || See_invisible) && ! (!attacktype(mtmp->data, AT_GAZE) || mtmp->mcan)) { m.misc = obj; m.has_misc = MUSE_POT_INVISIBILITY; } *************** *** 1620,1625 **** --- 1648,1670 ---- #undef nomore } + /* type of monster to polymorph into; defaults to one suitable for the + current level rather than the totally arbitrary choice of newcham() */ + static struct permonst * + muse_newcham_mon(mon) + struct monst *mon; + { + struct obj *m_armr; + + if ((m_armr = which_armor(mon, W_ARM)) != 0) { + if (Is_dragon_scales(m_armr)) + return Dragon_scales_to_pm(m_armr); + else if (Is_dragon_mail(m_armr)) + return Dragon_mail_to_pm(m_armr); + } + return rndmonst(); + } + int use_misc(mtmp) struct monst *mtmp; *************** *** 1701,1707 **** case MUSE_WAN_SPEED_MONSTER: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; ! mon_adjust_speed(mtmp, 1); return 2; case MUSE_POT_SPEED: mquaffmsg(mtmp, otmp); --- 1746,1752 ---- case MUSE_WAN_SPEED_MONSTER: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; ! mon_adjust_speed(mtmp, 1, otmp); return 2; case MUSE_POT_SPEED: mquaffmsg(mtmp, otmp); *************** *** 1709,1730 **** different methods of maintaining speed ratings: player's character becomes "very fast" temporarily; monster becomes "one stage faster" permanently */ ! if (vismon) ! pline("%s is suddenly moving faster.", Monnam(mtmp)); ! if (oseen) makeknown(POT_SPEED); ! mon_adjust_speed(mtmp, 1); m_useup(mtmp, otmp); return 2; case MUSE_WAN_POLYMORPH: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; ! (void) newcham(mtmp, rndmonst()); if (oseen) makeknown(WAN_POLYMORPH); return 2; case MUSE_POT_POLYMORPH: mquaffmsg(mtmp, otmp); if (vismon) pline("%s suddenly mutates!", Monnam(mtmp)); ! (void) newcham(mtmp, rndmonst()); if (oseen) makeknown(POT_POLYMORPH); m_useup(mtmp, otmp); return 2; --- 1754,1772 ---- different methods of maintaining speed ratings: player's character becomes "very fast" temporarily; monster becomes "one stage faster" permanently */ ! mon_adjust_speed(mtmp, 1, otmp); m_useup(mtmp, otmp); return 2; case MUSE_WAN_POLYMORPH: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; ! (void) newcham(mtmp, muse_newcham_mon(mtmp), TRUE); if (oseen) makeknown(WAN_POLYMORPH); return 2; case MUSE_POT_POLYMORPH: mquaffmsg(mtmp, otmp); if (vismon) pline("%s suddenly mutates!", Monnam(mtmp)); ! (void) newcham(mtmp, muse_newcham_mon(mtmp), FALSE); if (oseen) makeknown(POT_POLYMORPH); m_useup(mtmp, otmp); return 2; *************** *** 1742,1748 **** if (mtmp->wormno) worm_move(mtmp); newsym(trapx, trapy); ! (void) newcham(mtmp, (struct permonst *)0); return 2; case MUSE_BULLWHIP: /* attempt to disarm hero */ --- 1784,1790 ---- if (mtmp->wormno) worm_move(mtmp); newsym(trapx, trapy); ! (void) newcham(mtmp, (struct permonst *)0, FALSE); return 2; case MUSE_BULLWHIP: /* attempt to disarm hero */ *************** *** 1767,1782 **** } pline("%s wraps around %s you're wielding!", The_whip, the_weapon); ! if (obj->cursed) { ! pline("%s is welded to your %s%c", ! (obj->quan == 1L) ? "It" : "They", hand, !obj->bknown ? '!' : '.'); ! obj->bknown = 1; where_to = 0; } if (!where_to) { pline_The("whip slips free."); /* not `The_whip' */ return 1; } freeinv(obj); uwepgone(); --- 1809,1829 ---- } pline("%s wraps around %s you're wielding!", The_whip, the_weapon); ! if (welded(obj)) { ! pline("%s welded to your %s%c", ! !is_plural(obj) ? "It is" : "They are", hand, !obj->bknown ? '!' : '.'); ! /* obj->bknown = 1; */ /* welded() takes care of this */ where_to = 0; } if (!where_to) { pline_The("whip slips free."); /* not `The_whip' */ return 1; + } else if (where_to == 3 && hates_silver(mtmp->data) && + objects[obj->otyp].oc_material == SILVER) { + /* this monster won't want to catch a silver + weapon; drop it at hero's feet instead */ + where_to = 2; } freeinv(obj); uwepgone(); *************** *** 1784,1793 **** case 1: /* onto floor beneath mon */ pline("%s yanks %s from your %s!", Monnam(mtmp), the_weapon, hand); - if (obj->otyp == CRYSKNIFE && (!obj->oerodeproof || !rn2(10))) { - obj->otyp = WORM_TOOTH; - obj->oerodeproof = 0; - } place_object(obj, mtmp->mx, mtmp->my); break; case 2: /* onto floor beneath you */ --- 1831,1836 ---- *************** *** 1886,1897 **** return FALSE; if (typ == WAN_MAKE_INVISIBLE || typ == POT_INVISIBILITY) ! return (boolean)(!mon->minvis && !mon->invis_blkd); if (typ == WAN_SPEED_MONSTER || typ == POT_SPEED) return (boolean)(mon->mspeed != MFAST); switch (obj->oclass) { case WAND_CLASS: if (typ == WAN_DIGGING) return (boolean)(!is_floater(mon->data)); if (typ == WAN_POLYMORPH) --- 1929,1942 ---- return FALSE; if (typ == WAN_MAKE_INVISIBLE || typ == POT_INVISIBILITY) ! return (boolean)(!mon->minvis && !mon->invis_blkd && !attacktype(mon->data, AT_GAZE)); if (typ == WAN_SPEED_MONSTER || typ == POT_SPEED) return (boolean)(mon->mspeed != MFAST); switch (obj->oclass) { case WAND_CLASS: + if (obj->spe <= 0) + return FALSE; if (typ == WAN_DIGGING) return (boolean)(!is_floater(mon->data)); if (typ == WAN_POLYMORPH) *************** *** 1911,1919 **** typ == POT_PARALYSIS || typ == POT_SLEEPING || typ == POT_ACID || - typ == POT_BLINDNESS || typ == POT_CONFUSION) return TRUE; break; case SCROLL_CLASS: if (typ == SCR_TELEPORTATION || typ == SCR_CREATE_MONSTER --- 1956,1965 ---- typ == POT_PARALYSIS || typ == POT_SLEEPING || typ == POT_ACID || typ == POT_CONFUSION) return TRUE; + if (typ == POT_BLINDNESS && !attacktype(mon->data, AT_GAZE)) + return TRUE; break; case SCROLL_CLASS: if (typ == SCR_TELEPORTATION || typ == SCR_CREATE_MONSTER *************** *** 1932,1938 **** if (typ == UNICORN_HORN) return (boolean)(!obj->cursed && !is_unicorn(mon->data)); if (typ == FROST_HORN || typ == FIRE_HORN) ! return TRUE; break; case FOOD_CLASS: if (typ == CORPSE) --- 1978,1984 ---- if (typ == UNICORN_HORN) return (boolean)(!obj->cursed && !is_unicorn(mon->data)); if (typ == FROST_HORN || typ == FIRE_HORN) ! return (obj->spe > 0); break; case FOOD_CLASS: if (typ == CORPSE) *************** *** 1940,1946 **** touch_petrifies(&mons[obj->corpsenm])) || (!resists_ston(mon) && (obj->corpsenm == PM_LIZARD || ! acidic(&mons[obj->corpsenm])))); if (typ == EGG) return (boolean)(touch_petrifies(&mons[obj->corpsenm])); break; --- 1986,1993 ---- touch_petrifies(&mons[obj->corpsenm])) || (!resists_ston(mon) && (obj->corpsenm == PM_LIZARD || ! (acidic(&mons[obj->corpsenm]) && ! obj->corpsenm != PM_GREEN_SLIME)))); if (typ == EGG) return (boolean)(touch_petrifies(&mons[obj->corpsenm])); break; *************** *** 1976,1982 **** if (str) pline(str, s_suffix(mon_nam(mon)), "armor"); return TRUE; ! } else if (mon->data == &mons[PM_SILVER_DRAGON]) { /* Silver dragons only reflect when mature; babies do not */ if (str) pline(str, s_suffix(mon_nam(mon)), "scales"); --- 2023,2030 ---- if (str) pline(str, s_suffix(mon_nam(mon)), "armor"); return TRUE; ! } else if (mon->data == &mons[PM_SILVER_DRAGON] || ! mon->data == &mons[PM_CHROMATIC_DRAGON]) { /* Silver dragons only reflect when mature; babies do not */ if (str) pline(str, s_suffix(mon_nam(mon)), "scales"); *************** *** 2034,2084 **** for(obj = mon->minvent; obj; obj = obj->nobj) { /* Monsters can also use potions of acid */ if ((obj->otyp == POT_ACID) || (obj->otyp == CORPSE && ! (obj->corpsenm == PM_LIZARD || acidic(&mons[obj->corpsenm])))) { ! int nutrit = dog_nutrition(mon, obj); /* also sets meating */ ! ! if (canseemon(mon)) { ! long save_quan = obj->quan; ! ! obj->quan = 1L; ! pline("%s %ss %s.", Monnam(mon), ! (obj->otyp == POT_ACID) ? "quaff" : "eat", ! distant_name(obj,doname)); ! obj->quan = save_quan; ! } else if (flags.soundok) ! You_hear("%s.", (obj->otyp == POT_ACID) ? "drinking" : "chewing"); ! m_useup(mon, obj); ! if (((obj->otyp == POT_ACID) || acidic(&mons[obj->corpsenm])) && ! !resists_acid(mon)) { ! mon->mhp -= rnd(15); ! pline("%s has a very bad case of stomach acid.", ! Monnam(mon)); ! } ! if (mon->mhp <= 0) { ! pline("%s dies!", Monnam(mon)); ! if (by_you) xkilled(mon, 0); ! else mondead(mon); ! return TRUE; ! } ! if (canseemon(mon)) { ! if (Hallucination) ! pline("What a pity - %s just ruined a future piece of art!", ! mon_nam(mon)); ! else ! pline("%s seems limber!", Monnam(mon)); ! } ! if (mon->mtame && !mon->isminion) { ! struct edog *edog = EDOG(mon); ! ! if (edog->hungrytime < moves) edog->hungrytime = moves; ! edog->hungrytime += nutrit; ! mon->mconf = 0; ! } ! mon->mlstmv = monstermoves; /* it takes a turn */ return TRUE; } } return FALSE; } /*muse.c*/ --- 2082,2148 ---- for(obj = mon->minvent; obj; obj = obj->nobj) { /* Monsters can also use potions of acid */ if ((obj->otyp == POT_ACID) || (obj->otyp == CORPSE && ! (obj->corpsenm == PM_LIZARD || (acidic(&mons[obj->corpsenm]) && obj->corpsenm != PM_GREEN_SLIME)))) { ! mon_consume_unstone(mon, obj, by_you, TRUE); return TRUE; } } return FALSE; + } + + STATIC_OVL void + mon_consume_unstone(mon, obj, by_you, stoning) + struct monst *mon; + struct obj *obj; + boolean by_you; + boolean stoning; + { + int nutrit = (obj->otyp == CORPSE) ? dog_nutrition(mon, obj) : 0; + /* also sets meating */ + + if (canseemon(mon)) { + long save_quan = obj->quan; + + obj->quan = 1L; + pline("%s %ss %s.", Monnam(mon), + (obj->otyp == POT_ACID) ? "quaff" : "eat", + distant_name(obj,doname)); + obj->quan = save_quan; + } else if (flags.soundok) + You_hear("%s.", (obj->otyp == POT_ACID) ? "drinking" : "chewing"); + m_useup(mon, obj); + if (((obj->otyp == POT_ACID) || acidic(&mons[obj->corpsenm])) && + !resists_acid(mon)) { + mon->mhp -= rnd(15); + pline("%s has a very bad case of stomach acid.", + Monnam(mon)); + } + if (mon->mhp <= 0) { + pline("%s dies!", Monnam(mon)); + if (by_you) xkilled(mon, 0); + else mondead(mon); + return; + } + if (stoning && canseemon(mon)) { + if (Hallucination) + pline("What a pity - %s just ruined a future piece of art!", + mon_nam(mon)); + else + pline("%s seems limber!", Monnam(mon)); + } + if (obj->otyp == CORPSE && obj->corpsenm == PM_LIZARD && mon->mconf) { + mon->mconf = 0; + if (canseemon(mon)) + pline("%s seems steadier now.", Monnam(mon)); + } + if (mon->mtame && !mon->isminion && nutrit > 0) { + struct edog *edog = EDOG(mon); + + if (edog->hungrytime < monstermoves) edog->hungrytime = monstermoves; + edog->hungrytime += nutrit; + mon->mconf = 0; + } + mon->mlstmv = monstermoves; /* it takes a turn */ } /*muse.c*/ *** nethack-3.3.1/src/music.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/music.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)music.c 3.3 1999/08/19 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)music.c 3.4 2001/12/03 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 73,80 **** mtmp->mfrozen = 0; /* May scare some monsters */ if (distm < distance/3 && ! !resist(mtmp, SCROLL_CLASS, 0, NOTELL)) ! mtmp->mflee = 1; } } mtmp = mtmp->nmon; --- 73,80 ---- mtmp->mfrozen = 0; /* May scare some monsters */ if (distm < distance/3 && ! !resist(mtmp, TOOL_CLASS, 0, NOTELL)) ! monflee(mtmp, 0, FALSE, TRUE); } } mtmp = mtmp->nmon; *************** *** 93,99 **** while(mtmp) { if (!DEADMONSTER(mtmp) && distu(mtmp->mx, mtmp->my) < distance && ! sleep_monst(mtmp, d(10,10), WAND_CLASS)) { mtmp->msleeping = 1; /* 10d10 turns + wake_nearby to rouse */ slept_monst(mtmp); } --- 93,99 ---- while(mtmp) { if (!DEADMONSTER(mtmp) && distu(mtmp->mx, mtmp->my) < distance && ! sleep_monst(mtmp, d(10,10), TOOL_CLASS)) { mtmp->msleeping = 1; /* 10d10 turns + wake_nearby to rouse */ slept_monst(mtmp); } *************** *** 117,122 **** --- 117,123 ---- distu(mtmp->mx, mtmp->my) < distance) { was_peaceful = mtmp->mpeaceful; mtmp->mpeaceful = 1; + mtmp->mavenge = 0; could_see_mon = canseemon(mtmp); mtmp->mundetected = 0; newsym(mtmp->mx, mtmp->my); *************** *** 149,154 **** --- 150,156 ---- distu(mtmp->mx, mtmp->my) < distance) { mtmp->msleeping = 0; mtmp->mpeaceful = 1; + mtmp->mavenge = 0; if (canseemon(mtmp)) pline( "%s listens cheerfully to the music, then seems quieter.", *************** *** 179,200 **** } } ! /* Charm monsters in range. Note that they may resist the spell. */ STATIC_OVL void charm_monsters(distance) int distance; { ! register struct monst *mtmp = fmon, *mtmp2; ! while(mtmp) { mtmp2 = mtmp->nmon; ! if (!DEADMONSTER(mtmp)) { ! if (distu(mtmp->mx, mtmp->my) <= distance) ! if(!resist(mtmp, SCROLL_CLASS, 0, NOTELL)) ! (void) tamedog(mtmp, (struct obj *) 0); } ! mtmp = mtmp2; } } --- 181,209 ---- } } ! /* Charm monsters in range. Note that they may resist the spell. ! * If swallowed, range is reduced to 0. ! */ STATIC_OVL void charm_monsters(distance) int distance; { ! struct monst *mtmp, *mtmp2; ! if (u.uswallow) { ! if (!resist(u.ustuck, TOOL_CLASS, 0, NOTELL)) ! (void) tamedog(u.ustuck, (struct obj *) 0); ! } else { ! for (mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; ! if (DEADMONSTER(mtmp)) continue; ! ! if (distu(mtmp->mx, mtmp->my) <= distance) { ! if (!resist(mtmp, TOOL_CLASS, 0, NOTELL)) ! (void) tamedog(mtmp, (struct obj *) 0); } ! } } } *************** *** 329,334 **** --- 338,344 ---- if (*in_rooms(x, y, SHOPBASE)) add_damage(x, y, 0L); levl[x][y].doormask = D_NODOOR; + unblock_point(x,y); newsym(x,y); break; } *************** *** 383,390 **** } /* else FALLTHRU */ case WOODEN_FLUTE: /* May charm snakes */ do_spec &= (rn2(ACURR(A_DEX)) + u.ulevel > 25); ! pline("%s %s.", The(xname(instr)), ! do_spec ? "trills" : "toots"); if (do_spec) charm_snakes(u.ulevel * 3); exercise(A_DEX, TRUE); break; --- 393,399 ---- } /* else FALLTHRU */ case WOODEN_FLUTE: /* May charm snakes */ do_spec &= (rn2(ACURR(A_DEX)) + u.ulevel > 25); ! pline("%s.", Tobjnam(instr, do_spec ? "trill" : "toot")); if (do_spec) charm_snakes(u.ulevel * 3); exercise(A_DEX, TRUE); break; *************** *** 394,407 **** check_unpaid(instr); instr->spe--; if (!getdir((char *)0)) { ! pline("%s vibrates.", The(xname(instr))); break; } else if (!u.dx && !u.dy && !u.dz) { ! if ((damage = zapyourself(instr, TRUE)) != 0) ! losehp(damage, ! self_pronoun("using a magical horn on %sself", ! "him"), ! NO_KILLER_PREFIX); } else { buzz((instr->otyp == FROST_HORN) ? AD_COLD-1 : AD_FIRE-1, rn1(6,6), u.ux, u.uy, u.dx, u.dy); --- 403,416 ---- check_unpaid(instr); instr->spe--; if (!getdir((char *)0)) { ! pline("%s.", Tobjnam(instr, "vibrate")); break; } else if (!u.dx && !u.dy && !u.dz) { ! if ((damage = zapyourself(instr, TRUE)) != 0) { ! char buf[BUFSZ]; ! Sprintf(buf, "using a magical horn on %sself", uhim()); ! losehp(damage, buf, NO_KILLER_PREFIX); ! } } else { buzz((instr->otyp == FROST_HORN) ? AD_COLD-1 : AD_FIRE-1, rn1(6,6), u.ux, u.uy, u.dx, u.dy); *************** *** 423,430 **** if (do_spec && instr->spe > 0) { check_unpaid(instr); instr->spe--; ! pline("%s produces very attractive music.", ! The(xname(instr))); charm_monsters((u.ulevel - 1) / 3 + 1); exercise(A_DEX, TRUE); break; --- 432,438 ---- if (do_spec && instr->spe > 0) { check_unpaid(instr); instr->spe--; ! pline("%s very attractive music.", Tobjnam(instr, "produce")); charm_monsters((u.ulevel - 1) / 3 + 1); exercise(A_DEX, TRUE); break; *** nethack-3.3.1/src/objects.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/objects.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)objects.c 3.3 2000/02/18 */ /* Copyright (c) Mike Threepoint, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)objects.c 3.4 2002/02/13 */ /* Copyright (c) Mike Threepoint, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 13,24 **** #else /* !OBJECTS_PASS_2_ */ /* second pass */ - # ifdef TEXTCOLOR #include "color.h" # define COLOR_FIELD(X) X, - # else - # define COLOR_FIELD(X) /*empty*/ - # endif #endif /* !OBJECTS_PASS_2_ */ --- 13,20 ---- *************** *** 135,141 **** WEAPON("athame", (char *)0, 1, 1, 0, 0, 10, 4, 4, 3, 2, S, P_DAGGER, IRON, HI_METAL), WEAPON("scalpel", (char *)0, ! 1, 1, 0, 0, 5, 4, 3, 3, 2, S, P_KNIFE, IRON, HI_METAL), WEAPON("knife", (char *)0, 1, 1, 0, 20, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL), WEAPON("stiletto", (char *)0, --- 131,137 ---- WEAPON("athame", (char *)0, 1, 1, 0, 0, 10, 4, 4, 3, 2, S, P_DAGGER, IRON, HI_METAL), WEAPON("scalpel", (char *)0, ! 1, 1, 0, 0, 5, 6, 3, 3, 2, S, P_KNIFE, METAL, HI_METAL), WEAPON("knife", (char *)0, 1, 1, 0, 20, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL), WEAPON("stiletto", (char *)0, *************** *** 263,269 **** BOW("elven bow", "runed bow", 0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD), BOW("orcish bow", "crude bow", 0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK), BOW("yumi", "long bow", 0, 0, 30, 60, 0, WOOD, P_BOW, HI_WOOD), ! BOW("sling", (char *)0, 1, 40, 3, 20, 0, WOOD, P_SLING, HI_WOOD), BOW("crossbow", (char *)0, 1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD), #undef P --- 259,265 ---- BOW("elven bow", "runed bow", 0, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD), BOW("orcish bow", "crude bow", 0, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK), BOW("yumi", "long bow", 0, 0, 30, 60, 0, WOOD, P_BOW, HI_WOOD), ! BOW("sling", (char *)0, 1, 40, 3, 20, 0, LEATHER, P_SLING, HI_LEATHER), BOW("crossbow", (char *)0, 1, 45, 50, 40, 0, WOOD, P_CROSSBOW, HI_WOOD), #undef P *************** *** 410,441 **** CLOAK("mummy wrapping", (char *)0, 1, 0, 0, 0, 0, 3, 2, 10, 1, CLOTH, CLR_GRAY), CLOAK("elven cloak", "faded pall", ! 0, 1, STEALTH, 10, 0, 10, 60, 9, 3, CLOTH, CLR_BLACK), CLOAK("orcish cloak", "coarse mantelet", ! 0, 0, 0, 10, 0, 10, 40, 10, 2, CLOTH, CLR_BLACK), CLOAK("dwarvish cloak", "hooded cloak", ! 0, 0, 0, 10, 0, 10, 50, 10, 2, CLOTH, HI_CLOTH), CLOAK("oilskin cloak", "slippery cloak", ! 0, 0, 0, 10, 0, 10, 50, 9, 3, CLOTH, HI_CLOTH), CLOAK("robe", (char *)0, ! 1, 1, 0, 0, 0, 15, 50, 8, 3, CLOTH, CLR_RED), CLOAK("alchemy smock", "apron", 0, 1, POISON_RES, 9, 0, 10, 50, 9, 1, CLOTH, CLR_WHITE), /* With shuffled appearances... */ CLOAK("cloak of protection", "tattered cape", ! 0, 1, PROTECTION,10, 0, 10, 50, 7, 3, CLOTH, HI_CLOTH), CLOAK("cloak of invisibility", "opera cloak", ! 0, 1, INVIS, 11, 0, 10, 60, 9, 2, CLOTH, CLR_BRIGHT_MAGENTA), CLOAK("cloak of magic resistance", "ornamental cope", 0, 1, ANTIMAGIC, 2, 0, 10, 60, 9, 3, CLOTH, CLR_WHITE), CLOAK("cloak of displacement", "piece of cloth", ! 0, 1, DISPLACED, 11, 0, 10, 50, 9, 2, CLOTH, HI_CLOTH), /* shields */ SHIELD("small shield", (char *)0, 1, 0, 0, 0, 6, 0, 30, 3, 9, 0, WOOD, HI_WOOD), SHIELD("elven shield", "blue and green shield", ! 0, 0, 0, 0, 2, 0, 50, 7, 8, 0, IRON, CLR_GREEN), SHIELD("Uruk-hai shield", "white-handed shield", 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, HI_METAL), SHIELD("orcish shield", "red-eyed shield", --- 406,439 ---- CLOAK("mummy wrapping", (char *)0, 1, 0, 0, 0, 0, 3, 2, 10, 1, CLOTH, CLR_GRAY), CLOAK("elven cloak", "faded pall", ! 0, 1, STEALTH, 8, 0, 10, 60, 9, 3, CLOTH, CLR_BLACK), CLOAK("orcish cloak", "coarse mantelet", ! 0, 0, 0, 8, 0, 10, 40, 10, 2, CLOTH, CLR_BLACK), CLOAK("dwarvish cloak", "hooded cloak", ! 0, 0, 0, 8, 0, 10, 50, 10, 2, CLOTH, HI_CLOTH), CLOAK("oilskin cloak", "slippery cloak", ! 0, 0, 0, 8, 0, 10, 50, 9, 3, CLOTH, HI_CLOTH), CLOAK("robe", (char *)0, ! 1, 1, 0, 3, 0, 15, 50, 8, 3, CLOTH, CLR_RED), CLOAK("alchemy smock", "apron", 0, 1, POISON_RES, 9, 0, 10, 50, 9, 1, CLOTH, CLR_WHITE), + CLOAK("leather cloak", (char *)0, + 1, 0, 0, 8, 0, 15, 40, 9, 1, LEATHER, CLR_BROWN), /* With shuffled appearances... */ CLOAK("cloak of protection", "tattered cape", ! 0, 1, PROTECTION, 9, 0, 10, 50, 7, 3, CLOTH, HI_CLOTH), CLOAK("cloak of invisibility", "opera cloak", ! 0, 1, INVIS, 10, 0, 10, 60, 9, 2, CLOTH, CLR_BRIGHT_MAGENTA), CLOAK("cloak of magic resistance", "ornamental cope", 0, 1, ANTIMAGIC, 2, 0, 10, 60, 9, 3, CLOTH, CLR_WHITE), CLOAK("cloak of displacement", "piece of cloth", ! 0, 1, DISPLACED, 10, 0, 10, 50, 9, 2, CLOTH, HI_CLOTH), /* shields */ SHIELD("small shield", (char *)0, 1, 0, 0, 0, 6, 0, 30, 3, 9, 0, WOOD, HI_WOOD), SHIELD("elven shield", "blue and green shield", ! 0, 0, 0, 0, 2, 0, 40, 7, 8, 0, WOOD, CLR_GREEN), SHIELD("Uruk-hai shield", "white-handed shield", 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, HI_METAL), SHIELD("orcish shield", "red-eyed shield", *************** *** 555,561 **** AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL), OBJECT(OBJ("Amulet of Yendor", /* note: description == name */ "Amulet of Yendor"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,MITHRIL), 0, ! AMULET_CLASS, 0, 0, 20, 3500, 0, 0, 0, 0, 20, HI_METAL), #undef AMULET /* tools ... */ --- 553,559 ---- AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL), OBJECT(OBJ("Amulet of Yendor", /* note: description == name */ "Amulet of Yendor"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,MITHRIL), 0, ! AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL), #undef AMULET /* tools ... */ *************** *** 655,664 **** /* two special unique artifact "tools" */ OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,GOLD), 0, ! TOOL_CLASS, 0, 0,10, 3000, 0, 0, 0, 0, 200, HI_GOLD), OBJECT(OBJ("Bell of Opening", "silver bell"), BITS(0,0,1,0,1,1,1,1,0,0,0,P_NONE,SILVER), 0, ! TOOL_CLASS, 0, 0,10, 1000, 0, 0, 0, 0, 50, HI_SILVER), #undef TOOL #undef WEPTOOL --- 653,662 ---- /* two special unique artifact "tools" */ OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,GOLD), 0, ! TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 200, HI_GOLD), OBJECT(OBJ("Bell of Opening", "silver bell"), BITS(0,0,1,0,1,1,1,1,0,0,0,P_NONE,SILVER), 0, ! TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 50, HI_SILVER), #undef TOOL #undef WEPTOOL *************** *** 837,843 **** SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER), /* a special, one of a kind, spellbook */ OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0, ! SPBOOK_CLASS, 0, 0,20, 3500, 0, 0, 0, 7, 20, HI_PAPER), #undef SPELL /* wands ... */ --- 835,841 ---- SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER), /* a special, one of a kind, spellbook */ OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0, ! SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER), #undef SPELL /* wands ... */ *************** *** 875,884 **** #undef WAND /* coins ... - so far, gold is all there is */ ! #define COIN(name,prob,metal) OBJECT( \ OBJ(name,(char *)0), BITS(0,1,0,0,0,0,0,0,0,0,0,P_NONE,metal), 0, \ ! GOLD_CLASS, prob, 0, 1, 0, 0, 0, 0, 0, 0, HI_GOLD ) ! COIN("gold piece", 1000, GOLD), #undef COIN /* gems ... - includes stones and rocks but not boulders */ --- 873,882 ---- #undef WAND /* coins ... - so far, gold is all there is */ ! #define COIN(name,prob,metal,worth) OBJECT( \ OBJ(name,(char *)0), BITS(0,1,0,0,0,0,0,0,0,0,0,P_NONE,metal), 0, \ ! GOLD_CLASS, prob, 0, 1, worth, 0, 0, 0, 0, 0, HI_GOLD ) ! COIN("gold piece", 1000, GOLD,1), #undef COIN /* gems ... - includes stones and rocks but not boulders */ *************** *** 925,931 **** ROCK("luckstone", "gray", 0, 10, 10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY), ROCK("loadstone", "gray", 0, 10, 500, 1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY), ! ROCK("flint", "gray", 0, 18, 10, 1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY), ROCK("rock", (char *)0, 1,100, 10, 0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY), #undef GEM #undef ROCK --- 923,930 ---- ROCK("luckstone", "gray", 0, 10, 10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY), ROCK("loadstone", "gray", 0, 10, 500, 1, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY), ! ROCK("touchstone", "gray", 0, 8, 10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY), ! ROCK("flint", "gray", 0, 10, 10, 1, 6, 6, 0, 10, 7, MINERAL, CLR_GRAY), ROCK("rock", (char *)0, 1,100, 10, 0, 3, 3, 0, 10, 7, MINERAL, CLR_GRAY), #undef GEM #undef ROCK *** nethack-3.3.1/src/objnam.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/objnam.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)objnam.c 3.3 2000/07/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)objnam.c 3.4 2002/02/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 7,20 **** /* "an uncursed greased partly eaten guardian naga hatchling [corpse]" */ #define PREFIX 80 /* (56) */ #define SCHAR_LIM 127 STATIC_DCL char *FDECL(strprepend,(char *,const char *)); - #ifdef OVL0 - static boolean FDECL(the_unique_obj, (struct obj *obj)); - #endif #ifdef OVLB static boolean FDECL(wishymatch, (const char *,const char *,BOOLEAN_P)); #endif struct Jitem { int item; --- 7,20 ---- /* "an uncursed greased partly eaten guardian naga hatchling [corpse]" */ #define PREFIX 80 /* (56) */ #define SCHAR_LIM 127 + #define NUMOBUF 12 STATIC_DCL char *FDECL(strprepend,(char *,const char *)); #ifdef OVLB static boolean FDECL(wishymatch, (const char *,const char *,BOOLEAN_P)); #endif + static char *NDECL(nextobuf); + static void FDECL(add_erosion_words, (struct obj *, char *)); struct Jitem { int item; *************** *** 47,53 **** { HELMET, "kabuto" }, { LEATHER_GLOVES, "yugake" }, { FOOD_RATION, "gunyoki" }, - { KELP_FROND, "nori" }, { POT_BOOZE, "sake" }, {0, "" } }; --- 47,52 ---- *************** *** 77,98 **** #endif /* OVL1 */ #ifdef OVLB char * obj_typename(otyp) register int otyp; { ! #ifdef LINT /* static char buf[BUFSZ]; */ ! char buf[BUFSZ]; ! #else ! static char NEARDATA buf[BUFSZ]; ! #endif register struct objclass *ocl = &objects[otyp]; register const char *actualn = OBJ_NAME(*ocl); register const char *dn = OBJ_DESCR(*ocl); register const char *un = ocl->oc_uname; register int nn = ocl->oc_name_known; - if (Role_if(PM_SAMURAI) && Japanese_item_name(otyp)) actualn = Japanese_item_name(otyp); switch(ocl->oc_class) { --- 76,103 ---- #endif /* OVL1 */ #ifdef OVLB + /* manage a pool of BUFSZ buffers, so callers don't have to */ + static char * + nextobuf() + { + static char NEARDATA bufs[NUMOBUF][BUFSZ]; + static int bufidx = 0; + + bufidx = (bufidx + 1) % NUMOBUF; + return bufs[bufidx]; + } + char * obj_typename(otyp) register int otyp; { ! char *buf = nextobuf(); register struct objclass *ocl = &objects[otyp]; register const char *actualn = OBJ_NAME(*ocl); register const char *dn = OBJ_DESCR(*ocl); register const char *un = ocl->oc_uname; register int nn = ocl->oc_name_known; if (Role_if(PM_SAMURAI) && Japanese_item_name(otyp)) actualn = Japanese_item_name(otyp); switch(ocl->oc_class) { *************** *** 144,151 **** return(buf); } /* here for ring/scroll/potion/wand */ ! if(nn) Sprintf(eos(buf), " of %s", actualn); if(un) Sprintf(eos(buf), " called %s", un); if(dn) --- 149,160 ---- return(buf); } /* here for ring/scroll/potion/wand */ ! if(nn) { ! if (ocl->oc_unique) ! Strcpy(buf, actualn); /* avoid spellbook of Book of the Dead */ ! else Sprintf(eos(buf), " of %s", actualn); + } if(un) Sprintf(eos(buf), " called %s", un); if(dn) *************** *** 207,218 **** xname(obj) register struct obj *obj; { ! #ifdef LINT /* lint may handle static decl poorly -- static char bufr[]; */ ! char bufr[BUFSZ]; ! #else ! static char bufr[BUFSZ]; ! #endif ! register char *buf = &(bufr[PREFIX]); /* leave room for "17 -3 " */ register int typ = obj->otyp; register struct objclass *ocl = &objects[typ]; register int nn = ocl->oc_name_known; --- 216,222 ---- xname(obj) register struct obj *obj; { ! register char *buf; register int typ = obj->otyp; register struct objclass *ocl = &objects[typ]; register int nn = ocl->oc_name_known; *************** *** 220,229 **** --- 224,242 ---- register const char *dn = OBJ_DESCR(*ocl); register const char *un = ocl->oc_uname; + buf = nextobuf() + PREFIX; /* leave room for "17 -3 " */ if (Role_if(PM_SAMURAI) && Japanese_item_name(typ)) actualn = Japanese_item_name(typ); buf[0] = '\0'; + /* + * clean up known when it's tied to oc_name_known, eg after AD_DRIN + * This is only required for unique objects and the Fake AoY since the + * article printed for the object is tied to the combination of the two + * and printing the wrong article gives away information. + */ + if (!nn && ocl->oc_uses_known && + (ocl->oc_unique || typ == FAKE_AMULET_OF_YENDOR)) obj->known = 0; if (!Blind) obj->dknown = TRUE; if (Role_if(PM_PRIEST)) obj->bknown = TRUE; if (obj_is_pname(obj)) *************** *** 451,461 **** return(buf); } #endif /* OVL1 */ #ifdef OVL0 /* used for naming "the unique_item" instead of "a unique_item" */ ! static boolean the_unique_obj(obj) register struct obj *obj; { --- 464,493 ---- return(buf); } + /* xname() output augmented for multishot missile feedback */ + char * + mshot_xname(obj) + struct obj *obj; + { + char tmpbuf[BUFSZ]; + char *onm = xname(obj); + + if (m_shot.n > 1 && m_shot.o == obj->otyp) { + /* copy xname's result so that we can reuse its return buffer */ + Strcpy(tmpbuf, onm); + /* "the Nth arrow"; value will eventually be passed to an() or + The(), both of which correctly handle this "the " prefix */ + Sprintf(onm, "the %d%s %s", m_shot.i, ordin(m_shot.i), tmpbuf); + } + + return onm; + } + #endif /* OVL1 */ #ifdef OVL0 /* used for naming "the unique_item" instead of "a unique_item" */ ! boolean the_unique_obj(obj) register struct obj *obj; { *************** *** 714,721 **** Strcat(bp, " (alternate weapon; not wielded)"); } if(obj->owornmask & W_QUIVER) Strcat(bp, " (in quiver)"); ! if(obj->unpaid) ! Strcat(bp, " (unpaid)"); if (!strncmp(prefix, "a ", 2) && index(vowels, *(prefix+2) ? *(prefix+2) : *bp) && (*(prefix+2) || (strncmp(bp, "uranium", 7) --- 746,764 ---- Strcat(bp, " (alternate weapon; not wielded)"); } if(obj->owornmask & W_QUIVER) Strcat(bp, " (in quiver)"); ! if(obj->unpaid) { ! xchar ox, oy; ! long quotedprice = unpaid_cost(obj); ! struct monst *shkp = (struct monst *)0; ! ! if (Has_contents(obj) && ! get_obj_location(obj, &ox, &oy, BURIED_TOO|CONTAINED_TOO) && ! costly_spot(ox, oy) && ! (shkp = shop_keeper(*in_rooms(ox, oy, SHOPBASE)))) ! quotedprice += contained_cost(obj, shkp, 0L, FALSE, TRUE); ! Sprintf(eos(bp), " (unpaid, %ld %s)", ! quotedprice, currency(quotedprice)); ! } if (!strncmp(prefix, "a ", 2) && index(vowels, *(prefix+2) ? *(prefix+2) : *bp) && (*(prefix+2) || (strncmp(bp, "uranium", 7) *************** *** 765,781 **** is_flammable(otmp)); } ! /* The result is actually modifiable, but caller shouldn't rely on that ! * due to the small buffer size. ! */ ! const char * corpse_xname(otmp, ignore_oquan) struct obj *otmp; boolean ignore_oquan; /* to force singular */ { ! static char NEARDATA nambuf[40]; - /* assert( strlen(mons[otmp->corpsenm].mname) <= 32 ); */ Sprintf(nambuf, "%s corpse", mons[otmp->corpsenm].mname); if (ignore_oquan || otmp->quan < 2) --- 808,820 ---- is_flammable(otmp)); } ! char * corpse_xname(otmp, ignore_oquan) struct obj *otmp; boolean ignore_oquan; /* to force singular */ { ! char *nambuf = nextobuf(); Sprintf(nambuf, "%s corpse", mons[otmp->corpsenm].mname); if (ignore_oquan || otmp->quan < 2) *************** *** 784,789 **** --- 823,838 ---- return makeplural(nambuf); } + /* xname, unless it's a corpse, then corpse_xname(obj, FALSE) */ + char * + cxname(obj) + struct obj *obj; + { + if (obj->otyp == CORPSE) + return corpse_xname(obj, FALSE); + return xname(obj); + } + /* * Used if only one of a collection of objects is named (e.g. in eat.c). */ *************** *** 810,816 **** an(str) register const char *str; { ! static char NEARDATA buf[BUFSZ]; buf[0] = '\0'; --- 859,865 ---- an(str) register const char *str; { ! char *buf = nextobuf(); buf[0] = '\0'; *************** *** 849,855 **** the(str) const char *str; { ! static char NEARDATA buf[BUFSZ]; boolean insert_the = FALSE; if (!strncmpi(str, "the ", 4)) { --- 898,904 ---- the(str) const char *str; { ! char *buf = nextobuf(); boolean insert_the = FALSE; if (!strncmpi(str, "the ", 4)) { *************** *** 901,912 **** return tmp; } char * aobjnam(otmp,verb) register struct obj *otmp; register const char *verb; { ! register char *bp = xname(otmp); char prefix[PREFIX]; if(otmp->quan != 1L) { --- 950,962 ---- return tmp; } + /* returns "count cxname(otmp)" or just cxname(otmp) if count == 1 */ char * aobjnam(otmp,verb) register struct obj *otmp; register const char *verb; { ! register char *bp = cxname(otmp); char prefix[PREFIX]; if(otmp->quan != 1L) { *************** *** 915,934 **** } if(verb) { ! /* verb is given in plural (without trailing s) */ ! Strcat(bp, " "); ! if(otmp->quan != 1L) ! Strcat(bp, verb); ! else if(!strcmp(verb, "are")) ! Strcat(bp, "is"); ! else { ! Strcat(bp, verb); ! Strcat(bp, "s"); ! } } return(bp); } /* capitalized variant of doname() */ char * Doname2(obj) --- 965,1086 ---- } if(verb) { ! Strcat(bp, " "); ! Strcat(bp, otense(otmp, verb)); ! } ! return(bp); ! } ! ! /* like aobjnam, but prepend "The", not count, and use xname */ ! char * ! Tobjnam(otmp, verb) ! register struct obj *otmp; ! register const char *verb; ! { ! char *bp = The(xname(otmp)); ! ! if(verb) { ! Strcat(bp, " "); ! Strcat(bp, otense(otmp, verb)); } return(bp); } + /* return form of the verb (input plural) if xname(otmp) were the subject */ + char * + otense(otmp, verb) + register struct obj *otmp; + register const char *verb; + { + char *buf; + + /* + * verb is given in plural (without trailing s). Return as input + * if the result of xname(otmp) would be plural. Don't bother + * recomputing xname(otmp) at this time. + */ + if (!is_plural(otmp)) + return vtense((char *)0, verb); + + buf = nextobuf(); + Strcpy(buf, verb); + return buf; + } + + /* return form of the verb (input plural) for present tense 3rd person subj */ + char * + vtense(subj, verb) + register const char *subj; + register const char *verb; + { + char *buf = nextobuf(); + int len; + const char *spot; + const char *sp; + + /* + * verb is given in plural (without trailing s). Return as input + * if subj appears to be plural. Add special cases as necessary. + * Many hard cases can already be handled by using otense() instead. + * If this gets much bigger, consider decomposing makeplural. + * Note: monster names are not expected here (except before corpse). + * + * special case: allow null sobj to get the singular 3rd person + * present tense form so we don't duplicate this code elsewhere. + */ + if (subj) { + spot = (const char *)0; + for (sp = subj; (sp = index(sp, ' ')) != 0; ++sp) { + if (!strncmp(sp, " of ", 4) || + !strncmp(sp, " called ", 8) || + !strncmp(sp, " named ", 7) || + !strncmp(sp, " labeled ", 9)) { + if (sp != subj) spot = sp - 1; + break; + } + } + len = strlen(subj); + if (!spot) spot = subj + len - 1; + + /* + * plural: anything that ends in 's', but not '*us'. + * Guess at a few other special cases that makeplural creates. + */ + if ((*spot == 's' && spot != subj && *(spot-1) != 'u') || + ((spot - subj) >= 4 && !strncmp(spot-3, "eeth", 4)) || + ((spot - subj) >= 3 && !strncmp(spot-3, "feet", 4)) || + ((spot - subj) >= 2 && !strncmp(spot-1, "ia", 2)) || + ((spot - subj) >= 2 && !strncmp(spot-1, "ae", 2))) { + Strcpy(buf, verb); + return buf; + } + } + + len = strlen(verb); + spot = verb + len - 1; + + if (!strcmp(verb, "are")) + Strcpy(buf, "is"); + else if (!strcmp(verb, "have")) + Strcpy(buf, "has"); + else if (index("zxs", *spot) || + (len >= 2 && *spot=='h' && index("cs", *(spot-1))) || + (len == 2 && *spot == 'o')) { + /* Ends in z, x, s, ch, sh; add an "es" */ + Strcpy(buf, verb); + Strcat(buf, "es"); + } else if (*spot == 'y' && (!index(vowels, *(spot-1)))) { + /* like "y" case in makeplural */ + Strcpy(buf, verb); + Strcpy(buf + len - 1, "ies"); + } else { + Strcpy(buf, verb); + Strcat(buf, "s"); + } + + return buf; + } + /* capitalized variant of doname() */ char * Doname2(obj) *************** *** 945,955 **** yname(obj) struct obj *obj; { ! static char outbuf[BUFSZ]; char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */ ! int space_left = sizeof outbuf - strlen(s) - sizeof " "; ! return strncat(strcat(s, " "), xname(obj), space_left); } /* capitalized variant of yname() */ --- 1097,1107 ---- yname(obj) struct obj *obj; { ! char *outbuf = nextobuf(); char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */ ! int space_left = BUFSZ - strlen(s) - sizeof " "; ! return strncat(strcat(s, " "), cxname(obj), space_left); } /* capitalized variant of yname() */ *************** *** 995,1001 **** { /* Note: cannot use strcmpi here -- it'd give MATZot, CAVEMeN,... */ register char *spot; ! static char NEARDATA str[BUFSZ]; const char *excess = (char *)0; int len; --- 1147,1153 ---- { /* Note: cannot use strcmpi here -- it'd give MATZot, CAVEMeN,... */ register char *spot; ! char *str = nextobuf(); const char *excess = (char *)0; int len; *************** *** 1008,1021 **** Strcpy(str, oldstr); /* ! Skip changing "pair of" to "pairs of". According to Webster, usual ! English usage is use pairs for humans, e.g. 3 pairs of dancers, ! and pair for objects and non-humans, e.g. 3 pair of boots. We don't ! refer to pairs of humans in this game so just skip to the bottom. ! ! Actually, none of the "pair" objects -- gloves, boots, and lenses -- ! currently merge, so this isn't used. ! */ if (!strncmp(str, "pair of ", 8)) goto bottom; --- 1160,1170 ---- Strcpy(str, oldstr); /* ! * Skip changing "pair of" to "pairs of". According to Webster, usual ! * English usage is use pairs for humans, e.g. 3 pairs of dancers, ! * and pair for objects and non-humans, e.g. 3 pair of boots. We don't ! * refer to pairs of humans in this game so just skip to the bottom. ! */ if (!strncmp(str, "pair of ", 8)) goto bottom; *************** *** 1059,1070 **** (len >= 3 && !strcmp(spot-2, " ya")) || (len >= 4 && (!strcmp(spot-3, "fish") || !strcmp(spot-3, "tuna") || ! !strcmp(spot-3, "deer") || !strcmp(spot-3, "yaki") || ! !strcmp(spot-3, "nori"))) || (len >= 5 && (!strcmp(spot-4, "sheep") || !strcmp(spot-4, "ninja") || !strcmp(spot-4, "ronin") || !strcmp(spot-4, "shito") || !strcmp(spot-4, "tengu") || !strcmp(spot-4, "manes"))) || (len >= 6 && !strcmp(spot-5, "ki-rin")) || --- 1208,1219 ---- (len >= 3 && !strcmp(spot-2, " ya")) || (len >= 4 && (!strcmp(spot-3, "fish") || !strcmp(spot-3, "tuna") || ! !strcmp(spot-3, "deer") || !strcmp(spot-3, "yaki"))) || (len >= 5 && (!strcmp(spot-4, "sheep") || !strcmp(spot-4, "ninja") || !strcmp(spot-4, "ronin") || !strcmp(spot-4, "shito") || + !strcmp(spot-7, "shuriken") || !strcmp(spot-4, "tengu") || !strcmp(spot-4, "manes"))) || (len >= 6 && !strcmp(spot-5, "ki-rin")) || *************** *** 1120,1127 **** goto bottom; } ! /* fungus/fungi, homunculus/homunculi, but wumpuses */ ! if (!strcmp(spot-1, "us") && (len < 6 || strcmp(spot-5, "wumpus"))) { *(spot--) = (char)0; *spot = 'i'; goto bottom; --- 1269,1278 ---- goto bottom; } ! /* fungus/fungi, homunculus/homunculi, but buses, lotuses, wumpuses */ ! if (len > 3 && !strcmp(spot-1, "us") && ! (len < 5 || (strcmp(spot-4, "lotus") && ! (len < 6 || strcmp(spot-5, "wumpus"))))) { *(spot--) = (char)0; *spot = 'i'; goto bottom; *************** *** 1258,1270 **** * of readobjnam, and is also used in pager.c to singularize the string * for which help is sought. */ - char * makesingular(oldstr) const char *oldstr; { register char *p, *bp; ! static char NEARDATA str[BUFSZ]; if (!oldstr || !*oldstr) { impossible("singular of null?"); --- 1409,1420 ---- * of readobjnam, and is also used in pager.c to singularize the string * for which help is sought. */ char * makesingular(oldstr) const char *oldstr; { register char *p, *bp; ! char *str = nextobuf(); if (!oldstr || !*oldstr) { impossible("singular of null?"); *************** *** 1442,1454 **** { (const char *)0, 0 }, }; ! /* Return something wished for. If not an object, return &zeroobj; if an error ! * (no matching object), return (struct obj *)0. Giving readobjnam() a null ! * pointer skips the error return and creates a random object instead. */ struct obj * ! readobjnam(bp) register char *bp; { register char *p; register int i; --- 1592,1610 ---- { (const char *)0, 0 }, }; ! /* ! * Return something wished for. Specifying a null pointer for ! * the user request string results in a random object. Otherwise, ! * if asking explicitly for "nothing" (or "nil") return no_wish; ! * if not an object return &zeroobj; if an error (no matching object), ! * return null. ! * If from_user is false, we're reading from the wizkit, nothing was typed in. */ struct obj * ! readobjnam(bp, no_wish, from_user) register char *bp; + struct obj *no_wish; + boolean from_user; { register char *p; register int i; *************** *** 1501,1506 **** --- 1657,1666 ---- if (!bp) goto any; /* first, remove extra whitespace they may have typed */ (void)mungspaces(bp); + /* allow wishing for "nothing" to preserve wishless conduct... + [now requires "wand of nothing" if that's what was really wanted] */ + if (!strcmpi(bp, "nothing") || !strcmpi(bp, "nil")) return no_wish; + /* save the [nearly] unmodified choice string */ Strcpy(fruitbuf, bp); for(;;) { *************** *** 1517,1522 **** --- 1677,1688 ---- while(digit(*bp)) bp++; while(*bp == ' ') bp++; l = 0; + } else if (*bp == '+' || *bp == '-') { + spesgn = (*bp++ == '+') ? 1 : -1; + spe = atoi(bp); + while(digit(*bp)) bp++; + while(*bp == ' ') bp++; + l = 0; } else if (!strncmpi(bp, "blessed ", l=8) || !strncmpi(bp, "holy ", l=5)) { blessed = 1; *************** *** 1576,1596 **** ishistoric = 1; } else if (!strncmpi(bp, "diluted ", l=8)) { isdiluted = 1; } else break; bp += l; } if(!cnt) cnt = 1; /* %% what with "gems" etc. ? */ - if(!strncmpi(bp, "empty ", 6)) { - contents = EMPTY; - bp += 6; - } if (strlen(bp) > 1) { ! if (*bp == '+' || *bp == '-') { ! spesgn = (*bp++ == '+') ? 1 : -1; ! spe = atoi(bp); ! while(digit(*bp)) bp++; ! while(*bp == ' ') bp++; ! } else if ((p = rindex(bp, '(')) != 0) { if (p > bp && p[-1] == ' ') p[-1] = 0; else *p = 0; p++; --- 1742,1755 ---- ishistoric = 1; } else if (!strncmpi(bp, "diluted ", l=8)) { isdiluted = 1; + } else if(!strncmpi(bp, "empty ", l=6)) { + contents = EMPTY; } else break; bp += l; } if(!cnt) cnt = 1; /* %% what with "gems" etc. ? */ if (strlen(bp) > 1) { ! if ((p = rindex(bp, '(')) != 0) { if (p > bp && p[-1] == ' ') p[-1] = 0; else *p = 0; p++; *************** *** 1712,1718 **** int mntmptoo, mntmplen; /* double check for rank title */ char *obp = bp; mntmptoo = title_to_mon(bp, (int *)0, &mntmplen); ! bp += mntmp != mntmptoo ? strlen(mons[mntmp].mname) : mntmplen; if (*bp == ' ') bp++; else if (!strncmpi(bp, "s ", 2)) bp += 2; else if (!strncmpi(bp, "es ", 3)) bp += 3; --- 1871,1877 ---- int mntmptoo, mntmplen; /* double check for rank title */ char *obp = bp; mntmptoo = title_to_mon(bp, (int *)0, &mntmplen); ! bp += mntmp != mntmptoo ? (int)strlen(mons[mntmp].mname) : mntmplen; if (*bp == ' ') bp++; else if (!strncmpi(bp, "s ", 2)) bp += 2; else if (!strncmpi(bp, "es ", 3)) bp += 3; *************** *** 1784,1793 **** #endif ) cnt=5000; if (cnt < 1) cnt=1; ! pline("%d gold piece%s.", cnt, plur(cnt)); u.ugold += cnt; flags.botl=1; return (&zeroobj); } if (strlen(bp) == 1 && (i = def_char_to_objclass(*bp)) < MAXOCLASSES && i > ILLOBJ_CLASS --- 1943,1961 ---- #endif ) cnt=5000; if (cnt < 1) cnt=1; ! #ifndef GOLDOBJ ! if (from_user) ! pline("%d gold piece%s.", cnt, plur(cnt)); u.ugold += cnt; flags.botl=1; return (&zeroobj); + #else + otmp = mksobj(GOLD_PIECE, FALSE, FALSE); + otmp->quan = cnt; + otmp->owt = weight(otmp); + flags.botl=1; + return (otmp); + #endif } if (strlen(bp) == 1 && (i = def_char_to_objclass(*bp)) < MAXOCLASSES && i > ILLOBJ_CLASS *************** *** 1983,1989 **** /* must come after objects check so wizards can still wish for * trap objects like beartraps */ ! if (wizard) { int trap; for (trap = NO_TRAP+1; trap < TRAPNUM; trap++) { --- 2151,2157 ---- /* must come after objects check so wizards can still wish for * trap objects like beartraps */ ! if (wizard && from_user) { int trap; for (trap = NO_TRAP+1; trap < TRAPNUM; trap++) { *************** *** 2075,2080 **** --- 2243,2249 ---- levl[u.ux][u.uy].typ = TREE; pline("A tree."); newsym(u.ux, u.uy); + block_point(u.ux, u.uy); return &zeroobj; } *************** *** 2101,2107 **** #endif switch (typ) { case AMULET_OF_YENDOR: ! typ = FAKE_AMULET_OF_YENDOR; break; case CANDELABRUM_OF_INVOCATION: typ = rnd_class(TALLOW_CANDLE, WAX_CANDLE); --- 2270,2276 ---- #endif switch (typ) { case AMULET_OF_YENDOR: ! typ = FAKE_AMULET_OF_YENDOR; break; case CANDELABRUM_OF_INVOCATION: typ = rnd_class(TALLOW_CANDLE, WAX_CANDLE); *************** *** 2215,2221 **** } /* set otmp->corpsenm or dragon scale [mail] */ ! if (mntmp >= LOW_PM) switch(typ) { case TIN: otmp->spe = 0; /* No spinach */ if (dead_species(mntmp, FALSE)) { --- 2384,2393 ---- } /* set otmp->corpsenm or dragon scale [mail] */ ! if (mntmp >= LOW_PM) { ! if (mntmp == PM_LONG_WORM_TAIL) mntmp = PM_LONG_WORM; ! ! switch (typ) { case TIN: otmp->spe = 0; /* No spinach */ if (dead_species(mntmp, FALSE)) { *************** *** 2268,2273 **** --- 2440,2446 ---- otmp->otyp = GRAY_DRAGON_SCALE_MAIL + mntmp - PM_GRAY_DRAGON; break; + } } /* set blessed/cursed -- setting the fields directly is safe *************** *** 2371,2393 **** artifact_exists(otmp, ONAME(otmp), FALSE); obfree(otmp, (struct obj *) 0); otmp = &zeroobj; ! pline( ! "For a moment, you feel %s in your %s, but it disappears!", something, makeplural(body_part(HAND))); } - otmp->owt = weight(otmp); - if (very && otmp->otyp == HEAVY_IRON_BALL) otmp->owt += 160; if (halfeaten && otmp->oclass == FOOD_CLASS) { if (otmp->otyp == CORPSE) otmp->oeaten = mons[otmp->corpsenm].cnutrit; else otmp->oeaten = objects[otmp->otyp].oc_nutrition; ! otmp->owt /= 2; ! otmp->oeaten /= 2; ! if (!otmp->owt) otmp->owt = 1; ! if (!otmp->oeaten) otmp->oeaten = 1; } return(otmp); } --- 2544,2564 ---- artifact_exists(otmp, ONAME(otmp), FALSE); obfree(otmp, (struct obj *) 0); otmp = &zeroobj; ! pline("For a moment, you feel %s in your %s, but it disappears!", something, makeplural(body_part(HAND))); } if (halfeaten && otmp->oclass == FOOD_CLASS) { if (otmp->otyp == CORPSE) otmp->oeaten = mons[otmp->corpsenm].cnutrit; else otmp->oeaten = objects[otmp->otyp].oc_nutrition; ! /* (do this adjustment before setting up object's weight) */ ! consume_oeaten(otmp, 1); } + otmp->owt = weight(otmp); + if (very && otmp->otyp == HEAVY_IRON_BALL) otmp->owt += 160; + return(otmp); } *************** *** 2423,2428 **** --- 2594,2620 ---- } return (const char *)0; } + + const char * + cloak_simple_name(cloak) + struct obj *cloak; + { + if (cloak) { + switch (cloak->otyp) { + case ROBE: + return "robe"; + case MUMMY_WRAPPING: + return "wrapping"; + case ALCHEMY_SMOCK: + return (objects[cloak->otyp].oc_name_known && + cloak->dknown) ? "smock" : "apron"; + default: + break; + } + } + return "cloak"; + } + #endif /* OVLB */ /*objnam.c*/ *** nethack-3.3.1/src/options.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/options.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)options.c 3.3 2000/08/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)options.c 3.4 2002/02/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 22,194 **** * options help (option_help()), the long options help (dat/opthelp), * and the current options setting display function (doset()), * and also the Guidebooks. */ static struct Bool_Opt { const char *name; boolean *addr, initvalue; } boolopt[] = { #ifdef AMIGA ! {"altmeta", &flags.altmeta, TRUE}, #else ! {"altmeta", (boolean *)0, TRUE}, #endif #ifdef MFLOPPY ! {"asksavedisk", &flags.asksavedisk, FALSE}, #else ! {"asksavedisk", (boolean *)0, FALSE}, #endif ! {"autopickup", &flags.pickup, TRUE}, ! {"autoquiver", &flags.autoquiver, FALSE}, #if defined(MICRO) && !defined(AMIGA) ! {"BIOS", &iflags.BIOS, FALSE}, #else ! {"BIOS", (boolean *)0, FALSE}, #endif #ifdef INSURANCE ! {"checkpoint", &flags.ins_chkpt, TRUE}, #else ! {"checkpoint", (boolean *)0, FALSE}, #endif #ifdef MFLOPPY ! {"checkspace", &iflags.checkspace, TRUE}, #else ! {"checkspace", (boolean *)0, FALSE}, #endif - #ifdef TEXTCOLOR # ifdef MICRO ! {"color", &iflags.use_color, TRUE}, # else /* systems that support multiple terminals, many monochrome */ ! {"color", &iflags.use_color, FALSE}, # endif #else ! {"color", (boolean *)0, FALSE}, ! #endif ! {"confirm",&flags.confirm, TRUE}, ! #ifdef TERMLIB ! {"DECgraphics", &iflags.DECgraphics, FALSE}, ! #else ! {"DECgraphics", (boolean *)0, FALSE}, #endif #ifdef TTY_GRAPHICS ! {"eight_bit_tty", &iflags.eight_bit_tty, FALSE}, ! {"extmenu", &iflags.extmenu, FALSE}, #else ! {"eight_bit_tty", (boolean *)0, FALSE}, ! {"extmenu", (boolean *)0, FALSE}, #endif #ifdef OPT_DISPMAP ! {"fast_map", &flags.fast_map, TRUE}, #else ! {"fast_map", (boolean *)0, TRUE}, #endif ! {"female", &flags.female, FALSE}, ! {"fixinv", &flags.invlet_constant, TRUE}, #ifdef AMIFLUSH ! {"flush", &flags.amiflush, FALSE}, #else ! {"flush", (boolean *)0, FALSE}, ! #endif ! {"help", &flags.help, TRUE}, ! #ifdef TEXTCOLOR ! {"hilite_pet", &iflags.hilite_pet, FALSE}, ! #else ! {"hilite_pet", (boolean *)0, FALSE}, #endif #ifdef ASCIIGRAPH ! {"IBMgraphics", &iflags.IBMgraphics, FALSE}, #else ! {"IBMgraphics", (boolean *)0, FALSE}, #endif ! {"ignintr", &flags.ignintr, FALSE}, ! #ifdef MAC_GRAPHICS_ENV ! {"large_font", &iflags.large_font, FALSE}, #else ! {"large_font", (boolean *)0, FALSE}, #endif ! {"legacy", &flags.legacy, TRUE}, ! {"lit_corridor", &flags.lit_corridor, FALSE}, #ifdef MAC_GRAPHICS_ENV ! {"Macgraphics", &iflags.MACgraphics, TRUE}, #else ! {"Macgraphics", (boolean *)0, FALSE}, #endif #ifdef MAIL ! {"mail", &flags.biff, TRUE}, #else ! {"mail", (boolean *)0, TRUE}, #endif ! #ifdef NEWS ! {"news", &iflags.news, TRUE}, #else ! {"news", (boolean *)0, FALSE}, #endif ! {"null", &flags.null, TRUE}, ! {"number_pad", &iflags.num_pad, FALSE}, ! #ifdef MAC ! {"page_wait", &flags.page_wait, TRUE}, #else ! {"page_wait", (boolean *)0, FALSE}, #endif ! {"perm_invent", &flags.perm_invent, FALSE}, ! #ifdef MAC ! {"popup_dialog", &iflags.popup_dialog, FALSE}, #else ! {"popup_dialog", (boolean *)0, FALSE}, #endif ! {"prayconfirm", &flags.prayconfirm, TRUE}, ! #if defined(MSDOS) && defined(USE_TILES) ! {"preload_tiles", &iflags.preload_tiles, TRUE}, #else ! {"preload_tiles", (boolean *)0, FALSE}, #endif ! {"pushweapon", &flags.pushweapon, FALSE}, ! #if defined(MICRO) && !defined(AMIGA) ! {"rawio", &iflags.rawio, FALSE}, #else ! {"rawio", (boolean *)0, FALSE}, #endif ! {"rest_on_space", &flags.rest_on_space, FALSE}, ! {"safe_pet", &flags.safe_dog, TRUE}, #ifdef WIZARD ! {"sanity_check", &iflags.sanity_check, FALSE}, #else ! {"sanity_check", (boolean *)0, FALSE}, #endif #ifdef EXP_ON_BOTL ! {"showexp", &flags.showexp, FALSE}, #else ! {"showexp", (boolean *)0, FALSE}, #endif #ifdef SCORE_ON_BOTL ! {"showscore", &flags.showscore, FALSE}, #else ! {"showscore", (boolean *)0, FALSE}, #endif ! {"silent", &flags.silent, TRUE}, ! {"sortpack", &flags.sortpack, TRUE}, ! {"sound", &flags.soundok, TRUE}, ! {"standout", &flags.standout, FALSE}, ! {"time", &flags.time, FALSE}, #ifdef TIMED_DELAY ! {"timed_delay", &flags.nap, TRUE}, #else ! {"timed_delay", (boolean *)0, FALSE}, #endif ! {"tombstone",&flags.tombstone, TRUE}, ! {"toptenwin",&flags.toptenwin, FALSE}, ! {"verbose", &flags.verbose, TRUE}, ! {(char *)0, (boolean *)0, FALSE} }; /* compound options, for option_help() and external programs like Amiga * frontend */ - #define SET_IN_FILE 0 /* config file option only, not visible in game - * or via program */ - #define SET_VIA_PROG 1 /* may be set via extern program, not seen in game */ - #define DISP_IN_GAME 2 /* may be set via extern program, displayed in game */ - #define SET_IN_GAME 3 /* may be set via extern program or set in the game */ static struct Comp_Opt { const char *name, *descr; --- 22,193 ---- * options help (option_help()), the long options help (dat/opthelp), * and the current options setting display function (doset()), * and also the Guidebooks. + * + * The order matters. If an option is a an initial substring of another + * option (e.g. time and timed_delay) the shorter one must come first. */ static struct Bool_Opt { const char *name; boolean *addr, initvalue; + int optflags; } boolopt[] = { #ifdef AMIGA ! {"altmeta", &flags.altmeta, TRUE, DISP_IN_GAME}, #else ! {"altmeta", (boolean *)0, TRUE, DISP_IN_GAME}, #endif + {"ascii_map", &iflags.wc_ascii_map, TRUE, SET_IN_GAME}, /*WC*/ #ifdef MFLOPPY ! {"asksavedisk", &flags.asksavedisk, FALSE, SET_IN_GAME}, #else ! {"asksavedisk", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! {"autodig", &flags.autodig, FALSE, SET_IN_GAME}, ! {"autopickup", &flags.pickup, TRUE, SET_IN_GAME}, ! {"autoquiver", &flags.autoquiver, FALSE, SET_IN_GAME}, #if defined(MICRO) && !defined(AMIGA) ! {"BIOS", &iflags.BIOS, FALSE, SET_IN_FILE}, #else ! {"BIOS", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef INSURANCE ! {"checkpoint", &flags.ins_chkpt, TRUE, SET_IN_GAME}, #else ! {"checkpoint", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef MFLOPPY ! {"checkspace", &iflags.checkspace, TRUE, SET_IN_GAME}, #else ! {"checkspace", (boolean *)0, FALSE, SET_IN_FILE}, #endif # ifdef MICRO ! {"color", &iflags.wc_color,TRUE, SET_IN_GAME}, /*WC*/ # else /* systems that support multiple terminals, many monochrome */ ! {"color", &iflags.wc_color, FALSE, SET_IN_GAME}, /*WC*/ # endif + {"confirm",&flags.confirm, TRUE, SET_IN_GAME}, + #if defined(TERMLIB) && !defined(MAC_GRAPHICS_ENV) + {"DECgraphics", &iflags.DECgraphics, FALSE, SET_IN_GAME}, #else ! {"DECgraphics", (boolean *)0, FALSE, SET_IN_FILE}, #endif + {"eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, SET_IN_GAME}, /*WC*/ #ifdef TTY_GRAPHICS ! {"extmenu", &iflags.extmenu, FALSE, SET_IN_GAME}, #else ! {"extmenu", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef OPT_DISPMAP ! {"fast_map", &flags.fast_map, TRUE, SET_IN_GAME}, #else ! {"fast_map", (boolean *)0, TRUE, SET_IN_FILE}, #endif ! {"female", &flags.female, FALSE, DISP_IN_GAME}, ! {"fixinv", &flags.invlet_constant, TRUE, SET_IN_GAME}, #ifdef AMIFLUSH ! {"flush", &flags.amiflush, FALSE, SET_IN_GAME}, #else ! {"flush", (boolean *)0, FALSE, SET_IN_FILE}, #endif + {"help", &flags.help, TRUE, SET_IN_GAME}, + {"hilite_pet", &iflags.wc_hilite_pet, FALSE, SET_IN_GAME}, /*WC*/ #ifdef ASCIIGRAPH ! {"IBMgraphics", &iflags.IBMgraphics, FALSE, SET_IN_GAME}, #else ! {"IBMgraphics", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! #ifndef MAC ! {"ignintr", &flags.ignintr, FALSE, SET_IN_GAME}, #else ! {"ignintr", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! {"large_font", &iflags.wc_large_font, FALSE, SET_IN_FILE}, /*WC*/ ! {"legacy", &flags.legacy, TRUE, DISP_IN_GAME}, ! {"lit_corridor", &flags.lit_corridor, FALSE, SET_IN_GAME}, #ifdef MAC_GRAPHICS_ENV ! {"Macgraphics", &iflags.MACgraphics, TRUE, SET_IN_GAME}, #else ! {"Macgraphics", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef MAIL ! {"mail", &flags.biff, TRUE, SET_IN_GAME}, #else ! {"mail", (boolean *)0, TRUE, SET_IN_FILE}, #endif ! #ifdef WIZARD ! /* for menu debugging only*/ ! {"menu_tab_sep", &iflags.menu_tab_sep, FALSE, SET_IN_GAME}, #else ! {"menu_tab_sep", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! #ifdef TTY_GRAPHICS ! {"msg_window", &iflags.prevmsg_window, FALSE, SET_IN_GAME}, #else ! {"msg_window", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! #ifdef NEWS ! {"news", &iflags.news, TRUE, DISP_IN_GAME}, #else ! {"news", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! {"null", &flags.null, TRUE, SET_IN_GAME}, ! {"number_pad", &iflags.num_pad, FALSE, SET_IN_GAME}, ! #ifdef MAC ! {"page_wait", &flags.page_wait, TRUE, SET_IN_GAME}, #else ! {"page_wait", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! {"perm_invent", &flags.perm_invent, FALSE, SET_IN_GAME}, ! {"popup_dialog", &iflags.wc_popup_dialog, FALSE, SET_IN_GAME}, /*WC*/ ! {"prayconfirm", &flags.prayconfirm, TRUE, SET_IN_GAME}, ! {"preload_tiles", &iflags.wc_preload_tiles, TRUE, DISP_IN_GAME}, /*WC*/ ! {"pushweapon", &flags.pushweapon, FALSE, SET_IN_GAME}, ! #if defined(MICRO) && !defined(AMIGA) && !defined(MSWIN_GRAPHICS) ! {"rawio", &iflags.rawio, FALSE, DISP_IN_GAME}, #else ! {"rawio", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! {"rest_on_space", &flags.rest_on_space, FALSE, SET_IN_GAME}, ! {"safe_pet", &flags.safe_dog, TRUE, SET_IN_GAME}, #ifdef WIZARD ! {"sanity_check", &iflags.sanity_check, FALSE, SET_IN_GAME}, #else ! {"sanity_check", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef EXP_ON_BOTL ! {"showexp", &flags.showexp, FALSE, SET_IN_GAME}, #else ! {"showexp", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef SCORE_ON_BOTL ! {"showscore", &flags.showscore, FALSE, SET_IN_GAME}, #else ! {"showscore", (boolean *)0, FALSE, SET_IN_FILE}, #endif ! {"silent", &flags.silent, TRUE, SET_IN_GAME}, ! {"sortpack", &flags.sortpack, TRUE, SET_IN_GAME}, ! {"sound", &flags.soundok, TRUE, SET_IN_GAME}, ! {"sparkle", &flags.sparkle, TRUE, SET_IN_GAME}, ! {"standout", &flags.standout, FALSE, SET_IN_GAME}, ! {"splash_screen", &iflags.wc_splash_screen, TRUE, DISP_IN_GAME}, /*WC*/ ! {"tiled_map", &iflags.wc_tiled_map, FALSE, DISP_IN_GAME}, /*WC*/ ! {"time", &flags.time, FALSE, SET_IN_GAME}, #ifdef TIMED_DELAY ! {"timed_delay", &flags.nap, TRUE, SET_IN_GAME}, #else ! {"timed_delay", (boolean *)0, FALSE, SET_IN_GAME}, #endif ! {"tombstone",&flags.tombstone, TRUE, SET_IN_GAME}, ! {"toptenwin",&flags.toptenwin, FALSE, SET_IN_GAME}, ! {"use_inverse", &iflags.wc_inverse, FALSE, SET_IN_GAME}, /*WC*/ ! {"verbose", &flags.verbose, TRUE, SET_IN_GAME}, ! {(char *)0, (boolean *)0, FALSE, 0} }; /* compound options, for option_help() and external programs like Amiga * frontend */ static struct Comp_Opt { const char *name, *descr; *************** *** 201,214 **** } compopt[] = { { "align", "your starting alignment (lawful, neutral, or chaotic)", 8, DISP_IN_GAME }, #ifdef MAC { "background", "the color of the background (black or white)", 6, SET_IN_FILE }, #endif { "catname", "the name of your (first) cat (e.g., catname:Tabby)", PL_PSIZ, DISP_IN_GAME }, { "disclose", "the kinds of information to disclose at end of game", ! sizeof(flags.end_disclose), SET_IN_GAME }, { "dogname", "the name of your (first) dog (e.g., dogname:Fang)", PL_PSIZ, DISP_IN_GAME }, --- 200,217 ---- } compopt[] = { { "align", "your starting alignment (lawful, neutral, or chaotic)", 8, DISP_IN_GAME }, + { "align_message", "message window alignment", 20, DISP_IN_GAME }, /*WC*/ + { "align_status", "status window alignment", 20, DISP_IN_GAME }, /*WC*/ #ifdef MAC { "background", "the color of the background (black or white)", 6, SET_IN_FILE }, #endif + { "boulder", "the symbol to use for displaying boulders", + 1, SET_IN_GAME }, { "catname", "the name of your (first) cat (e.g., catname:Tabby)", PL_PSIZ, DISP_IN_GAME }, { "disclose", "the kinds of information to disclose at end of game", ! sizeof(flags.end_disclose) * 2, SET_IN_GAME }, { "dogname", "the name of your (first) dog (e.g., dogname:Fang)", PL_PSIZ, DISP_IN_GAME }, *************** *** 216,233 **** MAXDCHARS+1, SET_IN_FILE }, { "effects", "the symbols to use in drawing special effects", MAXECHARS+1, SET_IN_FILE }, ! #ifdef MAC ! { "fontmap", "the font to use in the map window", 40, SET_IN_FILE }, ! { "fontmessage", "the font to use in the message window", ! 40, SET_IN_FILE }, ! { "fonttext", "the font to use in text windows", 40, SET_IN_FILE }, ! #endif { "fruit", "the name of a fruit you enjoy eating", PL_FSIZ, SET_IN_GAME }, { "gender", "your starting gender (male or female)", 8, DISP_IN_GAME }, { "horsename", "the name of your (first) horse (e.g., horsename:Silver)", PL_PSIZ, DISP_IN_GAME }, { "menustyle", "user interface for object selection", MENUTYPELEN, SET_IN_GAME }, { "menu_deselect_all", "deselect all items in a menu", 4, SET_IN_FILE }, --- 219,242 ---- MAXDCHARS+1, SET_IN_FILE }, { "effects", "the symbols to use in drawing special effects", MAXECHARS+1, SET_IN_FILE }, ! { "font_map", "the font to use in the map window", 40, DISP_IN_GAME }, /*WC*/ ! { "font_menu", "the font to use in menus", 40, DISP_IN_GAME }, /*WC*/ ! { "font_message", "the font to use in the message window", ! 40, DISP_IN_GAME }, /*WC*/ ! { "font_size_map", "the size of the map font", 20, DISP_IN_GAME }, /*WC*/ ! { "font_size_menu", "the size of the map font", 20, DISP_IN_GAME }, /*WC*/ ! { "font_size_message", "the size of the map font", 20, DISP_IN_GAME }, /*WC*/ ! { "font_size_status", "the size of the map font", 20, DISP_IN_GAME }, /*WC*/ ! { "font_size_text", "the size of the map font", 20, DISP_IN_GAME }, /*WC*/ ! { "font_status", "the font to use in status window", 40, DISP_IN_GAME }, /*WC*/ ! { "font_text", "the font to use in text windows", 40, DISP_IN_GAME }, /*WC*/ { "fruit", "the name of a fruit you enjoy eating", PL_FSIZ, SET_IN_GAME }, { "gender", "your starting gender (male or female)", 8, DISP_IN_GAME }, { "horsename", "the name of your (first) horse (e.g., horsename:Silver)", PL_PSIZ, DISP_IN_GAME }, + { "map_mode", "map display mode under Windows", 20, DISP_IN_GAME }, /*WC*/ { "menustyle", "user interface for object selection", MENUTYPELEN, SET_IN_GAME }, { "menu_deselect_all", "deselect all items in a menu", 4, SET_IN_FILE }, *************** *** 268,289 **** --- 277,305 ---- 20, SET_IN_GAME }, { "pickup_types", "types of objects to pick up automatically", MAXOCLASSES, SET_IN_GAME }, + { "player_selection", "choose character via dialog or prompts", + 12, DISP_IN_GAME }, { "race", "your starting race (e.g., Human, Elf)", PL_CSIZ, DISP_IN_GAME }, { "role", "your starting role (e.g., Barbarian, Valkyrie)", PL_CSIZ, DISP_IN_GAME }, { "scores", "the parts of the score list you wish to see", 32, SET_IN_GAME }, + { "scroll_margin", "scroll map when this far from the edge", 20, DISP_IN_GAME }, /*WC*/ #ifdef MSDOS { "soundcard", "type of sound card to use", 20, SET_IN_FILE }, #endif { "suppress_alert", "suppress alerts about version-specific features", 8, SET_IN_GAME }, + { "tile_width", "width of tiles", 20, DISP_IN_GAME}, /*WC*/ + { "tile_height", "height of tiles", 20, DISP_IN_GAME}, /*WC*/ + { "tile_file", "name of tile file", 70, DISP_IN_GAME}, /*WC*/ { "traps", "the symbols to use in drawing traps", MAXTCHARS+1, SET_IN_FILE }, #ifdef MAC {"use_stone", "use stone background patterns", 8, SET_IN_FILE }, #endif + { "vary_msgcount", "show more old messages at a time", 20, DISP_IN_GAME }, /*WC*/ #ifdef MSDOS { "video", "method of video updating", 20, SET_IN_FILE }, #endif *************** *** 293,303 **** { "videoshades", "gray shades to map to black/gray/white", 32, DISP_IN_GAME }, #endif ! #if 0 ! { "warnlevel", "minimum monster level to trigger warning", 4, SET_IN_GAME }, ! #endif { "windowtype", "windowing system to use", WINTYPELEN, DISP_IN_GAME }, ! { (char *)0, (char *)0, 0 } }; #ifdef OPTION_LISTS_ONLY --- 309,318 ---- { "videoshades", "gray shades to map to black/gray/white", 32, DISP_IN_GAME }, #endif ! { "windowcolors", "the foreground/background colors of windows", /*WC*/ ! 80, DISP_IN_GAME }, { "windowtype", "windowing system to use", WINTYPELEN, DISP_IN_GAME }, ! { (char *)0, (char *)0, 0, 0 } }; #ifdef OPTION_LISTS_ONLY *************** *** 383,389 **** STATIC_DCL void FDECL(doset_add_menu, (winid,const char *,int)); STATIC_DCL void FDECL(nmcpy, (char *, const char *, int)); STATIC_DCL void FDECL(escapes, (const char *, char *)); - STATIC_DCL int FDECL(boolopt_only_initial, (int)); STATIC_DCL void FDECL(rejectoption, (const char *)); STATIC_DCL void FDECL(badoption, (const char *)); STATIC_DCL char *FDECL(string_for_opt, (char *,BOOLEAN_P)); --- 398,403 ---- *************** *** 396,404 **** STATIC_DCL const char *FDECL(get_compopt_value, (const char *, char *)); STATIC_DCL boolean FDECL(special_handling, (const char *, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL void FDECL(warning_opts, (char *,const char *)); ! #if 0 ! STATIC_DCL int FDECL(warnlevel_opts, (char *, const char *)); ! #endif /* check whether a user-supplied option string is a proper leading substring of a particular option name; option string might have --- 410,421 ---- STATIC_DCL const char *FDECL(get_compopt_value, (const char *, char *)); STATIC_DCL boolean FDECL(special_handling, (const char *, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL void FDECL(warning_opts, (char *,const char *)); ! STATIC_DCL void FDECL(duplicate_opt_detection, (const char *, int)); ! ! STATIC_OVL void FDECL(wc_set_font_name, (int, char *)); ! STATIC_OVL int FDECL(wc_set_window_colors, (char *)); ! STATIC_OVL boolean FDECL(is_wc_option, (const char *)); ! STATIC_OVL boolean FDECL(wc_supported, (const char *)); /* check whether a user-supplied option string is a proper leading substring of a particular option name; option string might have *************** *** 451,456 **** --- 468,476 ---- /* initialize the random number generator */ setrandom(); + /* for detection of configfile options specified multiple times */ + iflags.opt_booldup = iflags.opt_compdup = (int *)0; + for (i = 0; boolopt[i].name; i++) { if (boolopt[i].addr) *(boolopt[i].addr) = boolopt[i].initvalue; *************** *** 474,479 **** --- 494,500 ---- monsyms[i] = (uchar) def_monsyms[i]; for (i = 0; i < WARNCOUNT; i++) warnsyms[i] = def_warnsyms[i].sym; + iflags.bouldersym = 0; flags.warnlevel = 1; flags.warntype = 0L; *************** *** 483,488 **** --- 504,511 ---- flags.pickup_types[0] = '\0'; flags.pickup_burden = MOD_ENCUMBER; + for (i = 0; i < NUM_DISCLOSURE_OPTIONS; i++) + flags.end_disclose[i] = DISCLOSE_PROMPT_DEFAULT_NO; switch_graphics(ASCII_GRAPHICS); /* set default characters */ #if defined(UNIX) && defined(TTY_GRAPHICS) /* *************** *** 537,545 **** } else #endif read_config_file((char *)0); ! #ifdef AMIGA ! ami_wbench_init(); /* must be here or can't set fruit */ ! #endif (void)fruitadd(pl_fruit); /* Remove "slime mold" from list of object names; this will */ /* prevent it from being wished unless it's actually present */ --- 560,566 ---- } else #endif read_config_file((char *)0); ! (void)fruitadd(pl_fruit); /* Remove "slime mold" from list of object names; this will */ /* prevent it from being wished unless it's actually present */ *************** *** 628,662 **** *tp = '\0'; } - /* some boolean options can only be set on start-up */ - STATIC_OVL int - boolopt_only_initial(i) - int i; - { - return (boolopt[i].addr == &flags.female - || boolopt[i].addr == &flags.legacy - #if defined(MICRO) && !defined(AMIGA) - || boolopt[i].addr == &iflags.rawio - || boolopt[i].addr == &iflags.BIOS - #endif - #if defined(MSDOS) && defined(USE_TILES) - || boolopt[i].addr == &iflags.preload_tiles - #endif - ); - } - STATIC_OVL void rejectoption(optname) const char *optname; { #ifdef MICRO ! # ifdef AMIGA ! if(FromWBench){ ! pline("\"%s\" settable only from %s or in icon.", ! optname, configfile); ! } else ! # endif ! pline("\"%s\" settable only from %s.", optname, configfile); #else pline("%s can be set only from NETHACKOPTIONS or %s.", optname, configfile); --- 649,660 ---- *tp = '\0'; } STATIC_OVL void rejectoption(optname) const char *optname; { #ifdef MICRO ! pline("\"%s\" settable only from %s.", optname, configfile); #else pline("%s can be set only from NETHACKOPTIONS or %s.", optname, configfile); *************** *** 678,693 **** else return; #endif - # ifdef AMIGA - if(ami_wbench_badopt(opts)) { - # endif if(from_file) raw_printf("Bad syntax in OPTIONS in %s: %s.", configfile, opts); else raw_printf("Bad syntax in NETHACKOPTIONS: %s.", opts); ! # ifdef AMIGA ! } ! # endif wait_synch(); } --- 676,686 ---- else return; #endif if(from_file) raw_printf("Bad syntax in OPTIONS in %s: %s.", configfile, opts); else raw_printf("Bad syntax in NETHACKOPTIONS: %s.", opts); ! wait_synch(); } *************** *** 749,756 **** --- 742,753 ---- char *sp, buf[BUFSZ]; num = 0; + #ifndef GOLDOBJ if (!index(op, GOLD_SYM)) buf[num++] = GOLD_CLASS; + #else + /* !!!! probably unnecessary with gold as normal inventory */ + #endif for (sp = op; *sp; sp++) { oc_sym = def_char_to_objclass(*sp); *************** *** 826,873 **** warnsyms[i] = graph_chars[i]; } - #if 0 - /* warnlevel is unnecessary with the new warning introduced in 3.3.1 */ - STATIC_OVL int - warnlevel_opts(op, optn) - char *op; - const char *optn; - { - char buf[BUFSZ]; - int twarnlevel; - boolean rejectlevel = FALSE; - - if (op) { - twarnlevel = atoi(op); - if (twarnlevel >= WARNCOUNT || twarnlevel < 1) - rejectlevel = TRUE; - else { - flags.warnlevel = twarnlevel; - see_monsters(); - } - } - if (rejectlevel) { - if (!initial) - pline("warnlevel must be 1 to %d.", WARNCOUNT - 1); - else { - Sprintf(buf, - "\n%s=%s Invalid warnlevel ignored (must be 1 to %d)", - optn, op, WARNCOUNT - 1); - badoption(buf); - } - return 0; - } - if (!initial) { - if (flags.warnlevel < WARNCOUNT -1) - Sprintf(buf, "s %d to %d", flags.warnlevel, WARNCOUNT - 1); - else - Sprintf(buf, " %d", flags.warnlevel); - pline("Warning level%s will be displayed.", buf); - } - return 1; - } - #endif - STATIC_OVL int feature_alert_opts(op, optn) char *op; --- 823,828 ---- *************** *** 902,907 **** --- 857,935 ---- } void + set_duplicate_opt_detection(on_or_off) + int on_or_off; + { + int k, *optptr; + if (on_or_off != 0) { + /*-- ON --*/ + if (iflags.opt_booldup) + impossible("iflags.opt_booldup already on (memory leak)"); + iflags.opt_booldup = (int *)alloc(SIZE(boolopt) * sizeof(int)); + optptr = iflags.opt_booldup; + for (k = 0; k < SIZE(boolopt); ++k) + *optptr++ = 0; + + if (iflags.opt_compdup) + impossible("iflags.opt_compdup already on (memory leak)"); + iflags.opt_compdup = (int *)alloc(SIZE(compopt) * sizeof(int)); + optptr = iflags.opt_compdup; + for (k = 0; k < SIZE(compopt); ++k) + *optptr++ = 0; + } else { + /*-- OFF --*/ + if (iflags.opt_booldup) free((genericptr_t) iflags.opt_booldup); + iflags.opt_booldup = (int *)0; + if (iflags.opt_compdup) free((genericptr_t) iflags.opt_compdup); + iflags.opt_compdup = (int *)0; + } + } + + STATIC_OVL void + duplicate_opt_detection(opts, bool_or_comp) + const char *opts; + int bool_or_comp; /* 0 == boolean option, 1 == compound */ + { + int i, *optptr; + #if defined(MAC) + /* the Mac has trouble dealing with the output of messages while + * processing the config file. That should get fixed one day. + * For now just return. + */ + return; + #endif + if ((bool_or_comp == 0) && iflags.opt_booldup && initial && from_file) { + for (i = 0; boolopt[i].name; i++) { + if (match_optname(opts, boolopt[i].name, 3, FALSE)) { + optptr = iflags.opt_booldup + i; + if (*optptr == 1) { + raw_printf( + "\nWarning - Boolean option specified multiple times: %s.\n", + opts); + wait_synch(); + } + *optptr += 1; + break; /* don't match multiple options */ + } + } + } else if ((bool_or_comp == 1) && iflags.opt_compdup && initial && from_file) { + for (i = 0; compopt[i].name; i++) { + if (match_optname(opts, compopt[i].name, strlen(compopt[i].name), TRUE)) { + optptr = iflags.opt_compdup + i; + if (*optptr == 1) { + raw_printf( + "\nWarning - compound option specified multiple times: %s.\n", + compopt[i].name); + wait_synch(); + } + *optptr += 1; + break; /* don't match multiple options */ + } + } + } + } + + void parseoptions(opts, tinitial, tfrom_file) register char *opts; boolean tinitial, tfrom_file; *************** *** 940,945 **** --- 968,975 ---- if (match_optname(opts, "colour", 5, FALSE)) Strcpy(opts, "color"); /* fortunately this isn't longer */ + duplicate_opt_detection(opts, 1); /* 1 means compound opts */ + /* special boolean options */ if (match_optname(opts, "female", 3, FALSE)) { *************** *** 983,993 **** case 'F': preferred_pet = 'c'; break; default: pline("Unrecognized pet type '%s'", op); break; } ! } else if (negated) preferred_pet = 0; return; } --- 1013,1027 ---- case 'F': preferred_pet = 'c'; break; + case 'n': /* no pet */ + case 'N': + preferred_pet = 'n'; + break; default: pline("Unrecognized pet type '%s'", op); break; } ! } else if (negated) preferred_pet = 'n'; return; } *************** *** 1024,1029 **** --- 1058,1135 ---- return; } + /* WINCAP + * setting font options */ + fullname = "font"; + if (!strncmpi(opts, fullname, 4)) + { + int wintype = -1; + char *fontopts = opts + 4; + + if (!strncmpi(fontopts, "map", 3) || + !strncmpi(fontopts, "_map", 4)) + wintype = NHW_MAP; + else if (!strncmpi(fontopts, "message", 7) || + !strncmpi(fontopts, "_message", 8)) + wintype = NHW_MESSAGE; + else if (!strncmpi(fontopts, "text", 4) || + !strncmpi(fontopts, "_text", 5)) + wintype = NHW_TEXT; + else if (!strncmpi(fontopts, "menu", 4) || + !strncmpi(fontopts, "_menu", 5)) + wintype = NHW_MENU; + else if (!strncmpi(fontopts, "status", 6) || + !strncmpi(fontopts, "_status", 7)) + wintype = NHW_STATUS; + else if (!strncmpi(fontopts, "_size", 5)) { + if (!strncmpi(fontopts, "_size_map", 8)) + wintype = NHW_MAP; + else if (!strncmpi(fontopts, "_size_message", 12)) + wintype = NHW_MESSAGE; + else if (!strncmpi(fontopts, "_size_text", 9)) + wintype = NHW_TEXT; + else if (!strncmpi(fontopts, "_size_menu", 9)) + wintype = NHW_MENU; + else if (!strncmpi(fontopts, "_size_status", 11)) + wintype = NHW_STATUS; + else { + badoption(opts); + return; + } + if (wintype > 0 && !negated && + (op = string_for_opt(opts, FALSE)) != 0) { + switch(wintype) { + case NHW_MAP: + iflags.wc_fontsiz_map = atoi(op); + break; + case NHW_MESSAGE: + iflags.wc_fontsiz_message = atoi(op); + break; + case NHW_TEXT: + iflags.wc_fontsiz_text = atoi(op); + break; + case NHW_MENU: + iflags.wc_fontsiz_menu = atoi(op); + break; + case NHW_STATUS: + iflags.wc_fontsiz_status = atoi(op); + break; + } + } + return; + } else { + badoption(opts); + } + if (wintype > 0 && + (op = string_for_opt(opts, FALSE)) != 0) { + wc_set_font_name(wintype, op); + #ifdef MAC + set_font_name (wintype, op); + #endif + return; + } else if (negated) bad_negation(fullname, TRUE); + return; + } #ifdef CHANGE_COLOR #ifdef MAC fullname = "use_stone"; *************** *** 1047,1076 **** } return; } ! ! fullname = "font"; ! if (!strncmpi(opts, fullname, 4)) ! { int wintype = -1; ! ! opts += 4; ! if (!strncmpi (opts, "map", 3)) ! wintype = NHW_MAP; ! else if (!strncmpi (opts, "message", 7)) ! wintype = NHW_MESSAGE; ! else if (!strncmpi (opts, "text", 4)) ! wintype = NHW_TEXT; ! ! if (wintype > 0 && (op = string_for_env_opt(fullname, opts, FALSE)) != 0) ! { set_font_name (wintype, op); ! } ! return; ! } ! #endif if (match_optname(opts, "palette", 3, TRUE) # ifdef MAC ! || match_optname(opts, "hicolor", 3, TRUE) # endif ! ) { int color_number, color_incr; # ifdef MAC --- 1153,1165 ---- } return; } ! #endif ! if (match_optname(opts, "palette", 3, TRUE) # ifdef MAC ! || match_optname(opts, "hicolor", 3, TRUE) # endif ! ) { int color_number, color_incr; # ifdef MAC *************** *** 1138,1144 **** } return; } ! #endif if (match_optname(opts, "fruit", 2, TRUE)) { char empty_str = '\0'; --- 1227,1233 ---- } return; } ! #endif /* CHANGE_COLOR */ if (match_optname(opts, "fruit", 2, TRUE)) { char empty_str = '\0'; *************** *** 1266,1280 **** else warning_opts(opts, fullname); return; } ! #if 0 ! fullname = "warnlevel"; ! if (match_optname(opts, fullname, 5, TRUE)) { ! op = string_for_opt(opts, negated); ! if (negated) bad_negation(fullname, FALSE); ! else if (op) (void) warnlevel_opts(op,fullname); ! return; } ! #endif /* name:string */ fullname = "name"; if (match_optname(opts, fullname, 4, TRUE)) { --- 1355,1380 ---- else warning_opts(opts, fullname); return; } ! /* boulder:symbol */ ! fullname = "boulder"; ! if (match_optname(opts, fullname, 7, TRUE)) { ! if (negated) { ! bad_negation(fullname, FALSE); ! return; ! } ! /* if (!(opts = string_for_env_opt(fullname, opts, FALSE))) */ ! if (!(opts = string_for_opt(opts, FALSE))) ! return; ! escapes(opts, opts); ! ! /* ! * Override the default boulder symbol. ! */ ! iflags.bouldersym = (uchar) opts[0]; ! if (!initial) need_redraw = TRUE; ! return; } ! /* name:string */ fullname = "name"; if (match_optname(opts, fullname, 4, TRUE)) { *************** *** 1324,1332 **** return; } /* align:string */ fullname = "align"; ! if (match_optname(opts, fullname, 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) if ((flags.initalign = str2align(op)) == ROLE_NONE) --- 1424,1470 ---- return; } + /* WINCAP + * align_status:[left|top|right|bottom] */ + fullname = "align_status"; + if (match_optname(opts, fullname, sizeof("align_status")-1, TRUE)) { + op = string_for_opt(opts, negated); + if (op && !negated) { + if (!strncmpi (op, "left", sizeof("left")-1)) + iflags.wc_align_status = ALIGN_LEFT; + else if (!strncmpi (op, "top", sizeof("top")-1)) + iflags.wc_align_status = ALIGN_TOP; + else if (!strncmpi (op, "right", sizeof("right")-1)) + iflags.wc_align_status = ALIGN_RIGHT; + else if (!strncmpi (op, "bottom", sizeof("bottom")-1)) + iflags.wc_align_status = ALIGN_BOTTOM; + else + badoption(opts); + } else if (negated) bad_negation(fullname, TRUE); + return; + } + /* WINCAP + * align_message:[left|top|right|bottom] */ + fullname = "align_message"; + if (match_optname(opts, fullname, sizeof("align_message")-1, TRUE)) { + op = string_for_opt(opts, negated); + if (op && !negated) { + if (!strncmpi (op, "left", sizeof("left")-1)) + iflags.wc_align_message = ALIGN_LEFT; + else if (!strncmpi (op, "top", sizeof("top")-1)) + iflags.wc_align_message = ALIGN_TOP; + else if (!strncmpi (op, "right", sizeof("right")-1)) + iflags.wc_align_message = ALIGN_RIGHT; + else if (!strncmpi (op, "bottom", sizeof("bottom")-1)) + iflags.wc_align_message = ALIGN_BOTTOM; + else + badoption(opts); + } else if (negated) bad_negation(fullname, TRUE); + return; + } /* align:string */ fullname = "align"; ! if (match_optname(opts, fullname, sizeof("align")-1, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) if ((flags.initalign = str2align(op)) == ROLE_NONE) *************** *** 1359,1377 **** case 'u': flags.pickup_burden = UNENCUMBERED; break; ! /* Burdened (slight encumberance) */ case 'b': flags.pickup_burden = SLT_ENCUMBER; break; ! /* streSsed (moderate encumberance) */ case 's': flags.pickup_burden = MOD_ENCUMBER; break; ! /* straiNed (heavy encumberance) */ case 'n': flags.pickup_burden = HVY_ENCUMBER; break; ! /* OverTaxed (extreme encumberance) */ case 'o': case 't': flags.pickup_burden = EXT_ENCUMBER; --- 1497,1515 ---- case 'u': flags.pickup_burden = UNENCUMBERED; break; ! /* Burdened (slight encumbrance) */ case 'b': flags.pickup_burden = SLT_ENCUMBER; break; ! /* streSsed (moderate encumbrance) */ case 's': flags.pickup_burden = MOD_ENCUMBER; break; ! /* straiNed (heavy encumbrance) */ case 'n': flags.pickup_burden = HVY_ENCUMBER; break; ! /* OverTaxed (extreme encumbrance) */ case 'o': case 't': flags.pickup_burden = EXT_ENCUMBER; *************** *** 1447,1456 **** } return; } /* things to disclose at end of game */ ! if (match_optname(opts, "disclose", 4, TRUE)) { ! flags.end_disclose[0] = '\0'; /* all */ if (!(op = string_for_opt(opts, TRUE))) { /* for backwards compatibility, "disclose" without a * value means all (was inventory and attributes, --- 1585,1630 ---- } return; } + /* WINCAP + * player_selection: dialog | prompts */ + fullname = "player_selection"; + if (match_optname(opts, fullname, sizeof("player_selection")-1, TRUE)) { + op = string_for_opt(opts, negated); + if (op && !negated) { + if (!strncmpi (op, "dialog", sizeof("dialog")-1)) + iflags.wc_player_selection = VIA_DIALOG; + else if (!strncmpi (op, "prompt", sizeof("prompt")-1)) + iflags.wc_player_selection = VIA_PROMPTS; + else + badoption(opts); + } else if (negated) bad_negation(fullname, TRUE); + return; + } /* things to disclose at end of game */ ! if (match_optname(opts, "disclose", 7, TRUE)) { ! /* ! * The order that the end_disclore options are stored: ! * inventory, attribs, vanquished, genocided, conduct ! * There is an array in flags: ! * end_disclose[NUM_DISCLOSURE_OPT]; ! * with option settings for the each of the following: ! * iagvc [see disclosure_options in decl.c]: ! * Legal setting values in that array are: ! * DISCLOSE_PROMPT_DEFAULT_YES ask with default answer yes ! * DISCLOSE_PROMPT_DEFAULT_NO ask with default answer no ! * DISCLOSE_YES_WITHOUT_PROMPT always disclose and don't ask ! * DISCLOSE_NO_WITHOUT_PROMPT never disclose and don't ask ! * ! * Those setting values can be used in the option ! * string as a prefix to get the desired behaviour. ! * ! * For backward compatibility, no prefix is required, ! * and the presence of a i,a,g,v, or c without a ! * prefix sets the corresponding value to DISCLOSE_YES_WITHOUT_PROMPT; ! */ ! boolean badopt = FALSE; ! int idx, prefix_val; if (!(op = string_for_opt(opts, TRUE))) { /* for backwards compatibility, "disclose" without a * value means all (was inventory and attributes, *************** *** 1458,1464 **** * it means "none" * (note "none" contains none of "iavkgc") */ ! if (negated) Strcpy(flags.end_disclose, "none"); return; } if (negated) { --- 1632,1642 ---- * it means "none" * (note "none" contains none of "iavkgc") */ ! for (num = 0; num < NUM_DISCLOSURE_OPTIONS; num++) { ! if (negated) ! flags.end_disclose[num] = DISCLOSE_NO_WITHOUT_PROMPT; ! else flags.end_disclose[num] = DISCLOSE_PROMPT_DEFAULT_YES; ! } return; } if (negated) { *************** *** 1466,1481 **** return; } num = 0; while (*op && num < sizeof flags.end_disclose - 1) { ! register char c; c = lowc(*op); if (c == 'k') c = 'v'; /* killed -> vanquished */ ! if (!index(flags.end_disclose, c)) { ! flags.end_disclose[num++] = c; ! flags.end_disclose[num] = '\0'; /* for index */ ! } op++; } return; } --- 1644,1683 ---- return; } num = 0; + prefix_val = -1; while (*op && num < sizeof flags.end_disclose - 1) { ! register char c, *dop; ! static char valid_settings[] = { ! DISCLOSE_PROMPT_DEFAULT_YES, ! DISCLOSE_PROMPT_DEFAULT_NO, ! DISCLOSE_YES_WITHOUT_PROMPT, ! DISCLOSE_NO_WITHOUT_PROMPT, ! '\0' ! }; c = lowc(*op); if (c == 'k') c = 'v'; /* killed -> vanquished */ ! dop = index(disclosure_options, c); ! if (dop) { ! idx = dop - disclosure_options; ! if (idx < 0 || idx > NUM_DISCLOSURE_OPTIONS - 1) { ! impossible("bad disclosure index %d %c", ! idx, c); ! continue; ! } ! if (prefix_val != -1) { ! flags.end_disclose[idx] = prefix_val; ! prefix_val = -1; ! } else ! flags.end_disclose[idx] = DISCLOSE_YES_WITHOUT_PROMPT; ! } else if (index(valid_settings, c)) { ! prefix_val = c; ! } else if (c == ' ') { ! /* do nothing */ ! } else ! badopt = TRUE; op++; } + if (badopt) badoption(opts); return; } *************** *** 1590,1595 **** --- 1792,1882 ---- } #endif /* MSDOS */ + /* WINCAP + * map_mode:[tiles|ascii4x6|ascii6x8|ascii8x8|ascii16x8|ascii7x12|ascii8x12| + ascii16x12|ascii12x16|ascii10x18|fit_to_screen] */ + fullname = "map_mode"; + if (match_optname(opts, fullname, sizeof("map_mode")-1, TRUE)) { + op = string_for_opt(opts, negated); + if (op && !negated) { + if (!strncmpi (op, "tiles", sizeof("tiles")-1)) + iflags.wc_map_mode = MAP_MODE_TILES; + else if (!strncmpi (op, "ascii4x6", sizeof("ascii4x6")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII4x6; + else if (!strncmpi (op, "ascii6x8", sizeof("ascii6x8")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII6x8; + else if (!strncmpi (op, "ascii8x8", sizeof("ascii8x8")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII8x8; + else if (!strncmpi (op, "ascii16x8", sizeof("ascii16x8")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII16x8; + else if (!strncmpi (op, "ascii7x12", sizeof("ascii7x12")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII7x12; + else if (!strncmpi (op, "ascii8x12", sizeof("ascii8x12")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII8x12; + else if (!strncmpi (op, "ascii16x12", sizeof("ascii16x12")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII16x12; + else if (!strncmpi (op, "ascii12x16", sizeof("ascii12x16")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII12x16; + else if (!strncmpi (op, "ascii10x18", sizeof("ascii10x18")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII10x18; + else if (!strncmpi (op, "fit_to_screen", sizeof("fit_to_screen")-1)) + iflags.wc_map_mode = MAP_MODE_ASCII_FIT_TO_SCREEN; + else + badoption(opts); + } else if (negated) bad_negation(fullname, TRUE); + return; + } + /* WINCAP + * scroll_margin:nn */ + fullname = "scroll_margin"; + if (match_optname(opts, fullname, sizeof("scroll_margin")-1, TRUE)) { + op = string_for_opt(opts, negated); + if ((negated && !op) || (!negated && op)) { + iflags.wc_scroll_margin = negated ? 5 : atoi(op); + } else if (negated) bad_negation(fullname, TRUE); + return; + } + /* WINCAP + * tile_width:nn */ + fullname = "tile_width"; + if (match_optname(opts, fullname, sizeof("tile_width")-1, TRUE)) { + op = string_for_opt(opts, negated); + if ((negated && !op) || (!negated && op)) { + iflags.wc_tile_width = negated ? 0 : atoi(op); + } else if (negated) bad_negation(fullname, TRUE); + return; + } + /* WINCAP + * tile_file:name */ + fullname = "tile_file"; + if (match_optname(opts, fullname, sizeof("tile_file")-1, TRUE)) { + if ((op = string_for_opt(opts, FALSE)) != 0) { + if (iflags.wc_tile_file) free(iflags.wc_tile_file); + iflags.wc_tile_file = (char *)alloc(strlen(op) + 1); + Strcpy(iflags.wc_tile_file, op); + } + return; + } + /* WINCAP + * tile_height:nn */ + fullname = "tile_height"; + if (match_optname(opts, fullname, sizeof("tile_height")-1, TRUE)) { + op = string_for_opt(opts, negated); + if ((negated && !op) || (!negated && op)) { + iflags.wc_tile_height = negated ? 0 : atoi(op); + } else if (negated) bad_negation(fullname, TRUE); + return; + } + /* WINCAP + * vary_msgcount:nn */ + fullname = "vary_msgcount"; + if (match_optname(opts, fullname, sizeof("vary_msgcount")-1, TRUE)) { + op = string_for_opt(opts, negated); + if ((negated && !op) || (!negated && op)) { + iflags.wc_vary_msgcount = negated ? 0 : atoi(op); + } else if (negated) bad_negation(fullname, TRUE); + return; + } fullname = "windowtype"; if (match_optname(opts, fullname, 3, TRUE)) { *************** *** 1604,1609 **** --- 1891,1909 ---- return; } + /* WINCAP + * setting window colors + * syntax: windowcolors=menu foregrnd/backgrnd text foregrnd/backgrnd + */ + fullname = "windowcolors"; + if (match_optname(opts, fullname, 7, TRUE)) { + if ((op = string_for_opt(opts, FALSE)) != 0) { + if (!wc_set_window_colors(op)) + badoption(opts); + } else if (negated) bad_negation(fullname, TRUE); + return; + } + /* menustyle:traditional or combo or full or partial */ if (match_optname(opts, "menustyle", 4, TRUE)) { int tmp; *************** *** 1681,1693 **** return; } /* options that must come from config file */ ! if (!initial && boolopt_only_initial(i)) { rejectoption(boolopt[i].name); return; } *(boolopt[i].addr) = !negated; #if defined(TERMLIB) || defined(ASCIIGRAPH) || defined(MAC_GRAPHICS_ENV) if (FALSE # ifdef TERMLIB --- 1981,1995 ---- return; } /* options that must come from config file */ ! if (!initial && (boolopt[i].optflags == SET_IN_FILE)) { rejectoption(boolopt[i].name); return; } *(boolopt[i].addr) = !negated; + duplicate_opt_detection(boolopt[i].name, 0); + #if defined(TERMLIB) || defined(ASCIIGRAPH) || defined(MAC_GRAPHICS_ENV) if (FALSE # ifdef TERMLIB *************** *** 1763,1772 **** vision_recalc(2); /* shut down vision */ vision_full_recalc = 1; /* delayed recalc */ } ! #ifdef TEXTCOLOR ! else if ((boolopt[i].addr) == &iflags.use_color ! || (boolopt[i].addr) == &iflags.hilite_pet) { need_redraw = TRUE; # ifdef TOS if ((boolopt[i].addr) == &iflags.use_color --- 2065,2078 ---- vision_recalc(2); /* shut down vision */ vision_full_recalc = 1; /* delayed recalc */ } ! else if ((boolopt[i].addr) == &iflags.use_inverse) { ! need_redraw = TRUE; ! } ! else if ((boolopt[i].addr) == &iflags.hilite_pet) { ! need_redraw = TRUE; ! } #ifdef TEXTCOLOR ! else if ((boolopt[i].addr) == &iflags.use_color) { need_redraw = TRUE; # ifdef TOS if ((boolopt[i].addr) == &iflags.use_color *************** *** 1861,1866 **** --- 2167,2173 ---- #endif static char fmtstr_doset_add_menu[] = "%s%-15s [%s] "; + static char fmtstr_doset_add_menu_tab[] = "%s\t[%s]"; STATIC_OVL void doset_add_menu(win, option, indexoffset) *************** *** 1893,1899 **** } } /* " " replaces "a - " -- assumes menus follow that style */ ! Sprintf(buf, fmtstr_doset_add_menu, (any.a_int ? "" : " "), option, value); add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } --- 2200,2209 ---- } } /* " " replaces "a - " -- assumes menus follow that style */ ! if (!iflags.menu_tab_sep) ! Sprintf(buf, fmtstr_doset_add_menu, any.a_int ? "" : " ", option, value); ! else ! Sprintf(buf, fmtstr_doset_add_menu_tab, option, value); add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } *************** *** 1922,1936 **** for (pass = 0; pass <= 1; pass++) for (i = 0; boolopt[i].name; i++) if ((bool_p = boolopt[i].addr) != 0 && ! (boolopt_only_initial(i) ^ pass)) { if (bool_p == &flags.female) continue; /* obsolete */ #ifdef WIZARD if (bool_p == &iflags.sanity_check && !wizard) continue; #endif any.a_int = (pass == 0) ? 0 : i + 1; ! Sprintf(buf, "%s%-13s [%s]", pass == 0 ? " " : "", boolopt[i].name, *bool_p ? "true" : "false"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } --- 2232,2254 ---- for (pass = 0; pass <= 1; pass++) for (i = 0; boolopt[i].name; i++) if ((bool_p = boolopt[i].addr) != 0 && ! ((boolopt[i].optflags == DISP_IN_GAME && pass == 0) || ! (boolopt[i].optflags == SET_IN_GAME && pass == 1))) { if (bool_p == &flags.female) continue; /* obsolete */ #ifdef WIZARD if (bool_p == &iflags.sanity_check && !wizard) continue; + if (bool_p == &iflags.menu_tab_sep && !wizard) continue; #endif + if (is_wc_option(boolopt[i].name) && + !wc_supported(boolopt[i].name)) continue; any.a_int = (pass == 0) ? 0 : i + 1; ! if (!iflags.menu_tab_sep) ! Sprintf(buf, "%s%-13s [%s]", pass == 0 ? " " : "", boolopt[i].name, *bool_p ? "true" : "false"); + else + Sprintf(buf, "%s\t[%s]", + boolopt[i].name, *bool_p ? "true" : "false"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } *************** *** 1954,1961 **** strlen(compopt[i].name) > (unsigned) biggest_name) biggest_name = (int) strlen(compopt[i].name); if (biggest_name > 30) biggest_name = 30; ! Sprintf(fmtstr_doset_add_menu, "%%s%%-%ds [%%s]", biggest_name); ! /* deliberately put `name', `role', `race', `gender' first */ doset_add_menu(tmpwin, "name", 0); doset_add_menu(tmpwin, "role", 0); --- 2272,2280 ---- strlen(compopt[i].name) > (unsigned) biggest_name) biggest_name = (int) strlen(compopt[i].name); if (biggest_name > 30) biggest_name = 30; ! if (!iflags.menu_tab_sep) ! Sprintf(fmtstr_doset_add_menu, "%%s%%-%ds [%%s]", biggest_name); ! /* deliberately put `name', `role', `race', `gender' first */ doset_add_menu(tmpwin, "name", 0); doset_add_menu(tmpwin, "role", 0); *************** *** 1970,1975 **** --- 2289,2297 ---- !strcmp(compopt[i].name, "race") || !strcmp(compopt[i].name, "gender")) continue; + else if (is_wc_option(compopt[i].name) && + !wc_supported(compopt[i].name)) + continue; else doset_add_menu(tmpwin, compopt[i].name, (pass == DISP_IN_GAME) ? 0 : indexoffset); *************** *** 1997,2002 **** --- 2319,2326 ---- Sprintf(buf, "%s%s", *boolopt[opt_indx].addr ? "!" : "", boolopt[opt_indx].name); parseoptions(buf, setinitial, fromfile); + if (wc_supported(boolopt[opt_indx].name)) + preference_update(boolopt[opt_indx].name); } else { /* compound option */ opt_indx -= boolcount; *************** *** 2009,2014 **** --- 2333,2340 ---- /* pass the buck */ parseoptions(buf, setinitial, fromfile); } + if (wc_supported(compopt[opt_indx].name)) + preference_update(compopt[opt_indx].name); } } free((genericptr_t)pick_list); *************** *** 2032,2038 **** char buf[BUFSZ]; boolean retval = FALSE; ! /* Special handling of menustyle, pickup_burden, and pickup_types. */ if (!strcmp("menustyle", optname)) { const char *style_name; menu_item *style_pick = (menu_item *)0; --- 2358,2364 ---- char buf[BUFSZ]; boolean retval = FALSE; ! /* Special handling of menustyle, pickup_burden, and pickup_types, disclose options. */ if (!strcmp("menustyle", optname)) { const char *style_name; menu_item *style_pick = (menu_item *)0; *************** *** 2064,2070 **** add_menu(tmpwin, NO_GLYPH, &any, burden_letters[i], 0, ATR_NONE, burden_name, MENU_UNSELECTED); } ! end_menu(tmpwin, "Select encumberence level:"); if (select_menu(tmpwin, PICK_ONE, &burden_pick) > 0) { flags.pickup_burden = burden_pick->item.a_int - 1; free((genericptr_t)burden_pick); --- 2390,2396 ---- add_menu(tmpwin, NO_GLYPH, &any, burden_letters[i], 0, ATR_NONE, burden_name, MENU_UNSELECTED); } ! end_menu(tmpwin, "Select encumbrance level:"); if (select_menu(tmpwin, PICK_ONE, &burden_pick) > 0) { flags.pickup_burden = burden_pick->item.a_int - 1; free((genericptr_t)burden_pick); *************** *** 2075,2080 **** --- 2401,2470 ---- /* parseoptions will prompt for the list of types */ parseoptions(strcpy(buf, "pickup_types"), setinitial, setfromfile); retval = TRUE; + } else if (!strcmp("disclose", optname)) { + int pick_cnt, pick_idx, opt_idx; + menu_item *disclosure_category_pick = (menu_item *)0; + /* + * The order of disclose_names[] + * must correspond to disclosure_options in decl.h + */ + static const char *disclosure_names[] = { + "inventory", "attributes", "vanquished", "genocides", "conduct" + }; + int disc_cat[NUM_DISCLOSURE_OPTIONS]; + const char *disclosure_name; + + tmpwin = create_nhwindow(NHW_MENU); + start_menu(tmpwin); + for (i = 0; i < NUM_DISCLOSURE_OPTIONS; i++) { + disclosure_name = disclosure_names[i]; + any.a_int = i + 1; + add_menu(tmpwin, NO_GLYPH, &any, disclosure_options[i], 0, + ATR_NONE, disclosure_name, MENU_UNSELECTED); + disc_cat[i] = 0; + } + end_menu(tmpwin, "Change which disclosure options categories:"); + if ((pick_cnt = select_menu(tmpwin, PICK_ANY, &disclosure_category_pick)) > 0) { + for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) { + opt_idx = disclosure_category_pick[pick_idx].item.a_int - 1; + disc_cat[opt_idx] = 1; + } + free((genericptr_t)disclosure_category_pick); + disclosure_category_pick = (menu_item *)0; + } + destroy_nhwindow(tmpwin); + + for (i = 0; i < NUM_DISCLOSURE_OPTIONS; i++) { + if (disc_cat[i]) { + char dbuf[BUFSZ]; + menu_item *disclosure_option_pick = (menu_item *)0; + Sprintf(dbuf, "Disclosure options for %s:", disclosure_names[i]); + tmpwin = create_nhwindow(NHW_MENU); + start_menu(tmpwin); + any.a_char = DISCLOSE_NO_WITHOUT_PROMPT; + add_menu(tmpwin, NO_GLYPH, &any, 'a', 0, + ATR_NONE,"Never disclose and don't prompt", MENU_UNSELECTED); + any.a_void = 0; + any.a_char = DISCLOSE_YES_WITHOUT_PROMPT; + add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, + ATR_NONE,"Always disclose and don't prompt", MENU_UNSELECTED); + any.a_void = 0; + any.a_char = DISCLOSE_PROMPT_DEFAULT_NO; + add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, + ATR_NONE,"Prompt and default answer to \"No\"", MENU_UNSELECTED); + any.a_void = 0; + any.a_char = DISCLOSE_PROMPT_DEFAULT_YES; + add_menu(tmpwin, NO_GLYPH, &any, 'd', 0, + ATR_NONE,"Prompt and default answer to \"Yes\"", MENU_UNSELECTED); + end_menu(tmpwin, dbuf); + if (select_menu(tmpwin, PICK_ONE, &disclosure_option_pick) > 0) { + flags.end_disclose[i] = disclosure_option_pick->item.a_char; + free((genericptr_t)disclosure_option_pick); + } + destroy_nhwindow(tmpwin); + } + } + retval = TRUE; } return retval; } *************** *** 2091,2121 **** { char ocl[MAXOCLASSES+1]; static const char none[] = "(none)", randomrole[] = "random", ! to_be_done[] = "(to be done)"; ! #ifdef PREFIXES_IN_USE int i; - #endif buf[0] = '\0'; ! if (!strcmp(optname,"align")) Sprintf(buf, "%s", rolestring(flags.initalign, aligns, adj)); else if (!strcmp(optname, "catname")) Sprintf(buf, "%s", catname[0] ? catname : none ); ! else if (!strcmp(optname, "disclose")) ! Sprintf(buf, "%s", ! flags.end_disclose[0] ? flags.end_disclose : "all" ); else if (!strcmp(optname, "dogname")) Sprintf(buf, "%s", dogname[0] ? dogname : none ); else if (!strcmp(optname, "dungeon")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "effects")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "fruit")) Sprintf(buf, "%s", pl_fruit); else if (!strcmp(optname, "gender")) Sprintf(buf, "%s", rolestring(flags.initgend, genders, adj)); else if (!strcmp(optname, "horsename")) Sprintf(buf, "%s", horsename[0] ? horsename : none); else if (!strcmp(optname, "menustyle")) Sprintf(buf, "%s", menutype[(int)flags.menu_style] ); else if (!strcmp(optname, "menu_deselect_all")) --- 2481,2579 ---- { char ocl[MAXOCLASSES+1]; static const char none[] = "(none)", randomrole[] = "random", ! to_be_done[] = "(to be done)", ! defopt[] = "default", ! defbrief[] = "def"; int i; buf[0] = '\0'; ! if (!strcmp(optname,"align_message")) ! Sprintf(buf, "%s", iflags.wc_align_message == ALIGN_TOP ? "top" : ! iflags.wc_align_message == ALIGN_LEFT ? "left" : ! iflags.wc_align_message == ALIGN_BOTTOM ? "bottom" : ! iflags.wc_align_message == ALIGN_RIGHT ? "right" : ! defopt); ! else if (!strcmp(optname,"align_status")) ! Sprintf(buf, "%s", iflags.wc_align_status == ALIGN_TOP ? "top" : ! iflags.wc_align_status == ALIGN_LEFT ? "left" : ! iflags.wc_align_status == ALIGN_BOTTOM ? "bottom" : ! iflags.wc_align_status == ALIGN_RIGHT ? "right" : ! defopt); ! else if (!strcmp(optname,"align")) Sprintf(buf, "%s", rolestring(flags.initalign, aligns, adj)); + else if (!strcmp(optname, "boulder")) + Sprintf(buf, "%c", iflags.bouldersym ? + iflags.bouldersym : oc_syms[(int)objects[BOULDER].oc_class]); else if (!strcmp(optname, "catname")) Sprintf(buf, "%s", catname[0] ? catname : none ); ! else if (!strcmp(optname, "disclose")) { ! for (i = 0; i < NUM_DISCLOSURE_OPTIONS; i++) { ! char topt[2]; ! if (i) Strcat(buf," "); ! topt[1] = '\0'; ! topt[0] = flags.end_disclose[i]; ! Strcat(buf, topt); ! topt[0] = disclosure_options[i]; ! Strcat(buf, topt); ! } ! } else if (!strcmp(optname, "dogname")) Sprintf(buf, "%s", dogname[0] ? dogname : none ); else if (!strcmp(optname, "dungeon")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "effects")) Sprintf(buf, "%s", to_be_done); + else if (!strcmp(optname, "font_map")) + Sprintf(buf, "%s", iflags.wc_font_map ? iflags.wc_font_map : defopt); + else if (!strcmp(optname, "font_message")) + Sprintf(buf, "%s", iflags.wc_font_message ? iflags.wc_font_message : defopt); + else if (!strcmp(optname, "font_status")) + Sprintf(buf, "%s", iflags.wc_font_status ? iflags.wc_font_status : defopt); + else if (!strcmp(optname, "font_menu")) + Sprintf(buf, "%s", iflags.wc_font_menu ? iflags.wc_font_menu : defopt); + else if (!strcmp(optname, "font_text")) + Sprintf(buf, "%s", iflags.wc_font_text ? iflags.wc_font_text : defopt); + else if (!strcmp(optname, "font_size_map")) { + if (iflags.wc_fontsiz_map) Sprintf(buf, "%d", iflags.wc_fontsiz_map); + else Strcpy(buf, defopt); + } + else if (!strcmp(optname, "font_size_message")) { + if (iflags.wc_fontsiz_message) Sprintf(buf, "%d", + iflags.wc_fontsiz_message); + else Strcpy(buf, defopt); + } + else if (!strcmp(optname, "font_size_status")) { + if (iflags.wc_fontsiz_status) Sprintf(buf, "%d", iflags.wc_fontsiz_status); + else Strcpy(buf, defopt); + } + else if (!strcmp(optname, "font_size_menu")) { + if (iflags.wc_fontsiz_menu) Sprintf(buf, "%d", iflags.wc_fontsiz_menu); + else Strcpy(buf, defopt); + } + else if (!strcmp(optname, "font_size_text")) { + if (iflags.wc_fontsiz_text) Sprintf(buf, "%d",iflags.wc_fontsiz_text); + else Strcpy(buf, defopt); + } else if (!strcmp(optname, "fruit")) Sprintf(buf, "%s", pl_fruit); else if (!strcmp(optname, "gender")) Sprintf(buf, "%s", rolestring(flags.initgend, genders, adj)); else if (!strcmp(optname, "horsename")) Sprintf(buf, "%s", horsename[0] ? horsename : none); + else if (!strcmp(optname, "map_mode")) + Sprintf(buf, "%s", + iflags.wc_map_mode == MAP_MODE_TILES ? "tiles" : + iflags.wc_map_mode == MAP_MODE_ASCII4x6 ? "ascii4x6" : + iflags.wc_map_mode == MAP_MODE_ASCII6x8 ? "ascii6x8" : + iflags.wc_map_mode == MAP_MODE_ASCII8x8 ? "ascii8x8" : + iflags.wc_map_mode == MAP_MODE_ASCII16x8 ? "ascii16x8" : + iflags.wc_map_mode == MAP_MODE_ASCII7x12 ? "ascii7x12" : + iflags.wc_map_mode == MAP_MODE_ASCII8x12 ? "ascii8x12" : + iflags.wc_map_mode == MAP_MODE_ASCII16x12 ? "ascii16x12" : + iflags.wc_map_mode == MAP_MODE_ASCII12x16 ? "ascii12x16" : + iflags.wc_map_mode == MAP_MODE_ASCII10x18 ? "ascii10x18" : + iflags.wc_map_mode == MAP_MODE_ASCII_FIT_TO_SCREEN ? + "fit_to_screen" : defopt); else if (!strcmp(optname, "menustyle")) Sprintf(buf, "%s", menutype[(int)flags.menu_style] ); else if (!strcmp(optname, "menu_deselect_all")) *************** *** 2158,2164 **** #endif else if (!strcmp(optname, "pettype")) Sprintf(buf, "%s", (preferred_pet == 'c') ? "cat" : ! (preferred_pet == 'd') ? "dog" : "random" ); else if (!strcmp(optname, "pickup_burden")) Sprintf(buf, "%s", burdentype[flags.pickup_burden] ); else if (!strcmp(optname, "pickup_types")) { --- 2616,2623 ---- #endif else if (!strcmp(optname, "pettype")) Sprintf(buf, "%s", (preferred_pet == 'c') ? "cat" : ! (preferred_pet == 'd') ? "dog" : ! (preferred_pet == 'n') ? "none" : "random"); else if (!strcmp(optname, "pickup_burden")) Sprintf(buf, "%s", burdentype[flags.pickup_burden] ); else if (!strcmp(optname, "pickup_types")) { *************** *** 2172,2178 **** else if (!strcmp(optname, "scores")) { Sprintf(buf, "%d top/%d around%s", flags.end_top, flags.end_around, flags.end_own ? "/own" : ""); ! } #ifdef MSDOS else if (!strcmp(optname, "soundcard")) Sprintf(buf, "%s", to_be_done); --- 2631,2643 ---- else if (!strcmp(optname, "scores")) { Sprintf(buf, "%d top/%d around%s", flags.end_top, flags.end_around, flags.end_own ? "/own" : ""); ! } ! else if (!strcmp(optname, "scroll_margin")) { ! if (iflags.wc_scroll_margin) Sprintf(buf, "%d",iflags.wc_scroll_margin); ! else Strcpy(buf, defopt); ! } ! else if (!strcmp(optname, "player_selection")) ! Sprintf(buf, "%s", iflags.wc_player_selection ? "prompts" : "dialog"); #ifdef MSDOS else if (!strcmp(optname, "soundcard")) Sprintf(buf, "%s", to_be_done); *************** *** 2185,2192 **** FEATURE_NOTICE_VER_MAJ, FEATURE_NOTICE_VER_MIN, FEATURE_NOTICE_VER_PATCH); ! } else if (!strcmp(optname, "traps")) Sprintf(buf, "%s", to_be_done); #ifdef MSDOS else if (!strcmp(optname, "video")) Sprintf(buf, "%s", to_be_done); --- 2650,2672 ---- FEATURE_NOTICE_VER_MAJ, FEATURE_NOTICE_VER_MIN, FEATURE_NOTICE_VER_PATCH); ! } ! else if (!strcmp(optname, "tile_file")) ! Sprintf(buf, "%s", iflags.wc_tile_file ? iflags.wc_tile_file : defopt); ! else if (!strcmp(optname, "tile_height")) { ! if (iflags.wc_tile_height) Sprintf(buf, "%d",iflags.wc_tile_height); ! else Strcpy(buf, defopt); ! } ! else if (!strcmp(optname, "tile_width")) { ! if (iflags.wc_tile_width) Sprintf(buf, "%d",iflags.wc_tile_width); ! else Strcpy(buf, defopt); ! } ! else if (!strcmp(optname, "traps")) Sprintf(buf, "%s", to_be_done); + else if (!strcmp(optname, "vary_msgcount")) { + if (iflags.wc_vary_msgcount) Sprintf(buf, "%d",iflags.wc_vary_msgcount); + else Strcpy(buf, defopt); + } #ifdef MSDOS else if (!strcmp(optname, "video")) Sprintf(buf, "%s", to_be_done); *************** *** 2204,2215 **** ttycolors[CLR_BRIGHT_MAGENTA], ttycolors[CLR_BRIGHT_CYAN]); #endif /* VIDEOSHADES */ - #if 0 - else if (!strcmp(optname, "warnlevel")) - Sprintf(buf, "%d", flags.warnlevel); - #endif else if (!strcmp(optname, "windowtype")) Sprintf(buf, "%s", windowprocs.name); #ifdef PREFIXES_IN_USE else { for (i = 0; i < PREFIX_COUNT; ++i) --- 2684,2701 ---- ttycolors[CLR_BRIGHT_MAGENTA], ttycolors[CLR_BRIGHT_CYAN]); #endif /* VIDEOSHADES */ else if (!strcmp(optname, "windowtype")) Sprintf(buf, "%s", windowprocs.name); + else if (!strcmp(optname, "windowcolors")) + Sprintf(buf, "%s/%s %s/%s %s/%s %s/%s", + iflags.wc_foregrnd_menu ? iflags.wc_foregrnd_menu : defbrief, + iflags.wc_backgrnd_menu ? iflags.wc_backgrnd_menu : defbrief, + iflags.wc_foregrnd_message ? iflags.wc_foregrnd_message : defbrief, + iflags.wc_backgrnd_message ? iflags.wc_backgrnd_message : defbrief, + iflags.wc_foregrnd_status ? iflags.wc_foregrnd_status : defbrief, + iflags.wc_backgrnd_status ? iflags.wc_backgrnd_status : defbrief, + iflags.wc_foregrnd_text ? iflags.wc_foregrnd_text : defbrief, + iflags.wc_backgrnd_text ? iflags.wc_backgrnd_text : defbrief); #ifdef PREFIXES_IN_USE else { for (i = 0; i < PREFIX_COUNT; ++i) *************** *** 2273,2284 **** winid datawin; datawin = create_nhwindow(NHW_TEXT); ! #ifdef AMIGA ! if (FromWBench) ! Sprintf(buf, "Set options as OPTIONS= in %s or in icon", configfile); ! else ! #endif ! Sprintf(buf, "Set options as OPTIONS= in %s", configfile); opt_intro[CONFIG_SLOT] = (const char *) buf; for (i = 0; opt_intro[i]; i++) putstr(datawin, 0, opt_intro[i]); --- 2759,2765 ---- winid datawin; datawin = create_nhwindow(NHW_TEXT); ! Sprintf(buf, "Set options as OPTIONS= in %s", configfile); opt_intro[CONFIG_SLOT] = (const char *) buf; for (i = 0; opt_intro[i]; i++) putstr(datawin, 0, opt_intro[i]); *************** *** 2288,2293 **** --- 2769,2775 ---- if (boolopt[i].addr) { #ifdef WIZARD if (boolopt[i].addr == &iflags.sanity_check && !wizard) continue; + if (boolopt[i].addr == &iflags.menu_tab_sep && !wizard) continue; #endif next_opt(datawin, boolopt[i].name); } *************** *** 2529,2534 **** --- 3011,3252 ---- ret = 0; *class_select = '\0'; return ret; + } + + struct wc_Opt wc_options[] = { + {"ascii_map", WC_ASCII_MAP}, + {"color", WC_COLOR}, + {"eight_bit_tty", WC_EIGHT_BIT_IN}, + {"hilite_pet", WC_HILITE_PET}, + {"large_font", WC_LARGE_FONT}, /* now obsolete */ + {"popup_dialog", WC_POPUP_DIALOG}, + {"preload_tiles", WC_PRELOAD_TILES}, + {"tiled_map", WC_TILED_MAP}, + {"tile_file", WC_TILE_FILE}, + {"tile_width", WC_TILE_WIDTH}, + {"tile_height", WC_TILE_HEIGHT}, + {"use_inverse", WC_INVERSE}, + {"align_message", WC_ALIGN_MESSAGE}, + {"align_status", WC_ALIGN_STATUS}, + {"font_map", WC_FONT_MAP}, + {"font_menu", WC_FONT_MENU}, + {"font_message",WC_FONT_MESSAGE}, + #if 0 + {"perm_invent",WC_PERM_INVENT}, + #endif + {"font_size_map", WC_FONTSIZ_MAP}, + {"font_size_menu", WC_FONTSIZ_MENU}, + {"font_size_message", WC_FONTSIZ_MESSAGE}, + {"font_size_status", WC_FONTSIZ_STATUS}, + {"font_size_text", WC_FONTSIZ_TEXT}, + {"font_status", WC_FONT_STATUS}, + {"font_text", WC_FONT_TEXT}, + {"map_mode", WC_MAP_MODE}, + {"scroll_margin", WC_SCROLL_MARGIN}, + {"vary_msgcount",WC_VARY_MSGCOUNT}, + {(char *)0, 0L} + }; + + + /* + * If a port wants to change or ensure that the + * SET_IN_FILE, DISP_IN_GAME, or SET_IN_GAME status of an option is + * correct (for controlling its display in the option menu) call + * set_option_mod_status() + * with the second argument of 0,2, or 3 respectively. + */ + void + set_option_mod_status(optnam, status) + char *optnam; + int status; + { + int k; + if (status < SET_IN_FILE || status > SET_IN_GAME) { + impossible("set_option_mod_status: status out of range %d.", status); + return; + } + for (k = 0; boolopt[k].name; k++) { + if (!strncmpi(boolopt[k].name, optnam, strlen(optnam))) { + boolopt[k].optflags = status; + return; + } + } + for (k = 0; compopt[k].name; k++) { + if (!strncmpi(compopt[k].name, optnam, strlen(optnam))) { + compopt[k].optflags = status; + return; + } + } + } + + /* + * You can set several wc_options in one call to + * set_wc_option_mod_status() by setting + * the appropriate bits for each option that you + * are setting in the optmask argument + * prior to calling. + * example: set_wc_option_mod_status(WC_COLOR|WC_SCROLL_MARGIN, SET_IN_GAME); + */ + void + set_wc_option_mod_status(optmask, status) + unsigned long optmask; + int status; + { + int k = 0; + if (status < SET_IN_FILE || status > SET_IN_GAME) { + impossible("set_option_mod_status: status out of range %d.", status); + return; + } + while (wc_options[k].wc_name) { + if (optmask & wc_options[k].wc_bit) { + set_option_mod_status(wc_options[k].wc_name, status); + } + k++; + } + } + + STATIC_OVL boolean + is_wc_option(optnam) + const char *optnam; + { + int k = 0; + while (wc_options[k].wc_name) { + if (strcmp(wc_options[k].wc_name, optnam) == 0) + return TRUE; + k++; + } + return FALSE; + } + + STATIC_OVL boolean + wc_supported(optnam) + const char *optnam; + { + int k = 0; + while (wc_options[k].wc_name) { + if (!strcmp(wc_options[k].wc_name, optnam) && + (windowprocs.wincap & wc_options[k].wc_bit)) + return TRUE; + k++; + } + return FALSE; + } + + STATIC_OVL void + wc_set_font_name(wtype, fontname) + int wtype; + char *fontname; + { + char **fn = (char **)0; + if (!fontname) return; + switch(wtype) { + case NHW_MAP: + fn = &iflags.wc_font_map; + break; + case NHW_MESSAGE: + fn = &iflags.wc_font_message; + break; + case NHW_TEXT: + fn = &iflags.wc_font_text; + break; + case NHW_MENU: + fn = &iflags.wc_font_menu; + break; + case NHW_STATUS: + fn = &iflags.wc_font_status; + break; + default: + return; + } + if (fn) { + if (*fn) free(*fn); + *fn = (char *)alloc(strlen(fontname) + 1); + Strcpy(*fn, fontname); + } + return; + } + + STATIC_OVL int + wc_set_window_colors(op) + char *op; + { + /* syntax: + * menu white/black message green/yellow status white/blue text white/black + */ + + int j; + char buf[BUFSZ]; + char *wn, *tfg, *tbg, *newop; + static char *wnames[] = {"menu", "message", "status", "text"}; + static char *shortnames[] = {"mnu", "msg", "sts", "txt"}; + static char **fgp[] = { + &iflags.wc_foregrnd_menu, + &iflags.wc_foregrnd_message, + &iflags.wc_foregrnd_status, + &iflags.wc_foregrnd_text + }; + static char **bgp[] = { + &iflags.wc_backgrnd_menu, + &iflags.wc_backgrnd_message, + &iflags.wc_backgrnd_status, + &iflags.wc_backgrnd_text + }; + + Strcpy(buf, op); + newop = mungspaces(buf); + while (newop && *newop) { + + wn = tfg = tbg = (char *)0; + + /* until first non-space in case there's leading spaces - before colorname*/ + while(*newop && isspace(*newop)) newop++; + if (*newop) wn = newop; + else return 0; + + /* until first space - colorname*/ + while(*newop && !isspace(*newop)) newop++; + if (*newop) *newop = '\0'; + else return 0; + newop++; + + /* until first non-space - before foreground*/ + while(*newop && isspace(*newop)) newop++; + if (*newop) tfg = newop; + else return 0; + + /* until slash - foreground */ + while(*newop && *newop != '/') newop++; + if (*newop) *newop = '\0'; + else return 0; + newop++; + + /* until first non-space (in case there's leading space after slash) - before background */ + while(*newop && isspace(*newop)) newop++; + if (*newop) tbg = newop; + else return 0; + + /* until first space - background */ + while(*newop && !isspace(*newop)) newop++; + if (*newop) *newop++ = '\0'; + + for (j = 0; j < 4; ++j) { + if (!strcmpi(wn, wnames[j]) || + !strcmpi(wn, shortnames[j])) { + if (tfg && !strstri(tfg, " ")) { + if (*fgp[j]) free(*fgp[j]); + *fgp[j] = (char *)alloc(strlen(tfg) + 1); + Strcpy(*fgp[j], tfg); + } + if (tbg && !strstri(tbg, " ")) { + if (*bgp[j]) free(*bgp[j]); + *bgp[j] = (char *)alloc(strlen(tbg) + 1); + Strcpy(*bgp[j], tbg); + } + break; + } + } + } + return 1; } #endif /* OPTION_LISTS_ONLY */ *** nethack-3.3.1/src/o_init.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/o_init.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)o_init.c 3.3 1999/12/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)o_init.c 3.4 1999/12/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 75,83 **** { int i, j, num_to_shuffle; short sw; - #ifdef TEXTCOLOR int color; - #endif /* TEXTCOLOR */ for (num_to_shuffle = 0, j=o_low; j <= o_high; j++) if (!objects[j].oc_name_known) num_to_shuffle++; --- 75,81 ---- *************** *** 94,104 **** sw = objects[j].oc_tough; objects[j].oc_tough = objects[i].oc_tough; objects[i].oc_tough = sw; - #ifdef TEXTCOLOR color = objects[j].oc_color; objects[j].oc_color = objects[i].oc_color; objects[i].oc_color = color; ! #endif /* TEXTCOLOR */ /* shuffle material */ if (domaterial) { sw = objects[j].oc_material; --- 92,101 ---- sw = objects[j].oc_tough; objects[j].oc_tough = objects[i].oc_tough; objects[i].oc_tough = sw; color = objects[j].oc_color; objects[j].oc_color = objects[i].oc_color; objects[i].oc_color = color; ! /* shuffle material */ if (domaterial) { sw = objects[j].oc_material; *** nethack-3.3.1/src/pager.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/pager.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pager.c 3.3 1999/10/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pager.c 3.4 2002/01/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 98,115 **** bhitpos.x = x; bhitpos.y = y; mtmp = m_at(x,y); ! if(mtmp != (struct monst *) 0) { ! register boolean hp = (mtmp->data == &mons[PM_HIGH_PRIEST]); pm = mtmp->data; Sprintf(buf, "%s%s%s", (mtmp->mx != x || mtmp->my != y) ? ! ((mtmp->isshk && !Hallucination) ? "tail of " : "tail of a ") : "", ! (!hp && mtmp->mtame && !Hallucination) ? "tame " : ! (!hp && mtmp->mpeaceful && !Hallucination) ? ! "peaceful " : "", ! (hp ? "high priest" : x_monnam(mtmp, ARTICLE_NONE, (char *)0, 0, TRUE))); if (u.ustuck == mtmp) Strcat(buf, (Upolyd && sticks(youmonst.data)) ? ", being held" : ", holding you"); --- 98,120 ---- bhitpos.x = x; bhitpos.y = y; mtmp = m_at(x,y); ! if (mtmp != (struct monst *) 0) { ! char *name, monnambuf[BUFSZ]; ! boolean accurate = !Hallucination; ! ! if (mtmp->data == &mons[PM_COYOTE] && accurate) ! name = coyotename(mtmp, monnambuf); ! else ! name = distant_monnam(mtmp, ARTICLE_NONE, monnambuf); pm = mtmp->data; Sprintf(buf, "%s%s%s", (mtmp->mx != x || mtmp->my != y) ? ! ((mtmp->isshk && accurate) ? "tail of " : "tail of a ") : "", ! (mtmp->mtame && accurate) ? "tame " : ! (mtmp->mpeaceful && accurate) ? "peaceful " : "", ! name); if (u.ustuck == mtmp) Strcat(buf, (Upolyd && sticks(youmonst.data)) ? ", being held" : ", holding you"); *************** *** 176,183 **** } if (MATCH_WARN_OF_MON(mtmp)) { char wbuf[BUFSZ]; ! Sprintf(wbuf, "warned of %s", makeplural(mtmp->data->mname)); ! Strcat(monbuf, wbuf); if (ways_seen-- > 1) Strcat(monbuf, ", "); } } --- 181,193 ---- } if (MATCH_WARN_OF_MON(mtmp)) { char wbuf[BUFSZ]; ! if (Hallucination) ! Strcat(monbuf, "paranoid delusion"); ! else { ! Sprintf(wbuf, "warned of %s", ! makeplural(mtmp->data->mname)); ! Strcat(monbuf, wbuf); ! } if (ways_seen-- > 1) Strcat(monbuf, ", "); } } *************** *** 485,490 **** --- 495,502 ---- sym = showsyms[trap_to_defsym(glyph_to_trap(glyph))]; } else if (glyph_is_object(glyph)) { sym = oc_syms[(int)objects[glyph_to_obj(glyph)].oc_class]; + if (sym == '`' && iflags.bouldersym && (int)glyph_to_obj(glyph) == BOULDER) + sym = iflags.bouldersym; } else if (glyph_is_monster(glyph)) { /* takes care of pets, detected, ridden, and regular mons */ sym = monsyms[(int)mons[glyph_to_mon(glyph)].mlet]; *************** *** 606,612 **** } /* Now check for warning symbols */ ! for (i = 0; i < WARNCOUNT; i++) { x_str = def_warnsyms[i].explanation; if (sym == (from_screen ? warnsyms[i] : def_warnsyms[i].sym)) { if (!found) { --- 618,624 ---- } /* Now check for warning symbols */ ! for (i = 1; i < WARNCOUNT; i++) { x_str = def_warnsyms[i].explanation; if (sym == (from_screen ? warnsyms[i] : def_warnsyms[i].sym)) { if (!found) { *************** *** 633,638 **** --- 645,654 ---- } } + /* handle optional boulder symbol as a special case */ + if (iflags.bouldersym && sym == iflags.bouldersym) + found += append_str(out_str, "boulder"); + /* * If we are looking at the screen, follow multiple possibilities or * an ambiguous explanation by something more detailed. *************** *** 640,653 **** if (from_screen) { if (found > 1 || need_to_look) { char monbuf[BUFSZ]; ! char temp_buf[BUFSZ], coybuf[QBUFSZ]; pm = lookat(cc.x, cc.y, look_buf, monbuf); firstmatch = look_buf; if (*firstmatch) { ! Sprintf(temp_buf, " (%s)", ! (pm == &mons[PM_COYOTE]) ? ! coyotename(coybuf) : firstmatch); (void)strncat(out_str, temp_buf, BUFSZ-strlen(out_str)-1); found = 1; /* we have something to look up */ } --- 656,667 ---- if (from_screen) { if (found > 1 || need_to_look) { char monbuf[BUFSZ]; ! char temp_buf[BUFSZ]; pm = lookat(cc.x, cc.y, look_buf, monbuf); firstmatch = look_buf; if (*firstmatch) { ! Sprintf(temp_buf, " (%s)", firstmatch); (void)strncat(out_str, temp_buf, BUFSZ-strlen(out_str)-1); found = 1; /* we have something to look up */ } *** nethack-3.3.1/src/pickup.c Thu Feb 14 07:59:28 2002 --- nethack-3.4.0/src/pickup.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pickup.c 3.3 2000/03/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pickup.c 3.4 2001/03/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 9,16 **** --- 9,21 ---- #include "hack.h" STATIC_DCL void FDECL(simple_look, (struct obj *,BOOLEAN_P)); + #ifndef GOLDOBJ STATIC_DCL boolean FDECL(query_classes, (char *,boolean *,boolean *, const char *,struct obj *,BOOLEAN_P,BOOLEAN_P,int *)); + #else + STATIC_DCL boolean FDECL(query_classes, (char *,boolean *,boolean *, + const char *,struct obj *,BOOLEAN_P,int *)); + #endif STATIC_DCL void FDECL(check_here, (BOOLEAN_P)); STATIC_DCL boolean FDECL(n_or_more, (struct obj *)); STATIC_DCL boolean FDECL(all_but_uchain, (struct obj *)); *************** *** 80,97 **** --- 85,113 ---- } } + #ifndef GOLDOBJ int collect_obj_classes(ilets, otmp, here, incl_gold, filter) char ilets[]; register struct obj *otmp; boolean here, incl_gold; boolean FDECL((*filter),(OBJ_P)); + #else + int + collect_obj_classes(ilets, otmp, here, filter) + char ilets[]; + register struct obj *otmp; + boolean here; + boolean FDECL((*filter),(OBJ_P)); + #endif { register int iletct = 0; register char c; + #ifndef GOLDOBJ if (incl_gold) ilets[iletct++] = def_oc_syms[GOLD_CLASS]; + #endif ilets[iletct] = '\0'; /* terminate ilets so that index() will work */ while (otmp) { c = def_oc_syms[(int)otmp->oclass]; *************** *** 115,120 **** --- 131,137 ---- * "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/' * (ie, treated as if it had just been "?a"). */ + #ifndef GOLDOBJ STATIC_OVL boolean query_classes(oclasses, one_at_a_time, everything, action, objs, here, incl_gold, menu_on_demand) *************** *** 124,129 **** --- 141,157 ---- struct obj *objs; boolean here, incl_gold; int *menu_on_demand; + #else + STATIC_OVL boolean + query_classes(oclasses, one_at_a_time, everything, action, objs, + here, menu_on_demand) + char oclasses[]; + boolean *one_at_a_time, *everything; + const char *action; + struct obj *objs; + boolean here; + int *menu_on_demand; + #endif { char ilets[20], inbuf[BUFSZ]; int iletct, oclassct; *************** *** 133,139 **** oclasses[oclassct = 0] = '\0'; *one_at_a_time = *everything = m_seen = FALSE; ! iletct = collect_obj_classes(ilets, objs, here, incl_gold, (boolean FDECL((*),(OBJ_P))) 0); if (iletct == 0) { return FALSE; --- 161,170 ---- oclasses[oclassct = 0] = '\0'; *one_at_a_time = *everything = m_seen = FALSE; ! iletct = collect_obj_classes(ilets, objs, here, ! #ifndef GOLDOBJ ! incl_gold, ! #endif (boolean FDECL((*),(OBJ_P))) 0); if (iletct == 0) { return FALSE; *************** *** 284,289 **** --- 315,332 ---- if (((index(valid_menu_classes,'u') != (char *)0) && obj->unpaid) || (index(valid_menu_classes, obj->oclass) != (char *)0)) return TRUE; + else if (((index(valid_menu_classes,'U') != (char *)0) && + (obj->oclass != GOLD_CLASS && obj->bknown && !obj->blessed && !obj->cursed))) + return TRUE; + else if (((index(valid_menu_classes,'B') != (char *)0) && + (obj->oclass != GOLD_CLASS && obj->bknown && obj->blessed))) + return TRUE; + else if (((index(valid_menu_classes,'C') != (char *)0) && + (obj->oclass != GOLD_CLASS && obj->bknown && obj->cursed))) + return TRUE; + else if (((index(valid_menu_classes,'X') != (char *)0) && + (obj->oclass != GOLD_CLASS && !obj->bknown))) + return TRUE; else return FALSE; } *************** *** 314,320 **** } /* ! * Have the hero pick things from the ground. * * Arg what: * >0 autopickup --- 357,364 ---- } /* ! * Have the hero pick things from the ground ! * or a monster's inventory if swallowed. * * Arg what: * >0 autopickup *************** *** 331,377 **** int i, n, res, count, n_tried = 0, n_picked = 0; menu_item *pick_list = (menu_item *) 0; boolean autopickup = what > 0; if (what < 0) /* pick N of something */ count = -what; else /* pick anything */ count = 0; ! /* no auto-pick if no-pick move, nothing there, or in a pool */ ! if (autopickup && (flags.nopick || !OBJ_AT(u.ux, u.uy) || (is_pool(u.ux, u.uy) && !Underwater) || is_lava(u.ux, u.uy))) { ! read_engr_at(u.ux, u.uy); ! return (0); ! } ! /* no pickup if levitating & not on air or water level */ ! if (!can_reach_floor()) { ! if ((multi && !flags.run) || (autopickup && !flags.pickup)) ! read_engr_at(u.ux, u.uy); ! return (0); ! } ! /* multi && !flags.run means they are in the middle of some other ! * action, or possibly paralyzed, sleeping, etc.... and they just ! * teleported onto the object. They shouldn't pick it up. ! */ ! if ((multi && !flags.run) || (autopickup && !flags.pickup)) { ! check_here(FALSE); ! return (0); ! } ! if (notake(youmonst.data)) { ! if (!autopickup) ! You("are physically incapable of picking anything up."); ! else ! check_here(FALSE); ! return (0); } - /* if there's anything here, stop running */ - if (OBJ_AT(u.ux,u.uy) && flags.run && !flags.nopick) nomul(0); - add_valid_menu_class(0); /* reset */ /* * Start the actual pickup process. This is split into two main * sections, the newer menu and the older "traditional" methods. --- 375,431 ---- int i, n, res, count, n_tried = 0, n_picked = 0; menu_item *pick_list = (menu_item *) 0; boolean autopickup = what > 0; + struct obj *objchain; + int traverse_how; if (what < 0) /* pick N of something */ count = -what; else /* pick anything */ count = 0; ! if (!u.uswallow) { ! /* no auto-pick if no-pick move, nothing there, or in a pool */ ! if (autopickup && (flags.nopick || !OBJ_AT(u.ux, u.uy) || (is_pool(u.ux, u.uy) && !Underwater) || is_lava(u.ux, u.uy))) { ! read_engr_at(u.ux, u.uy); ! return (0); ! } ! /* no pickup if levitating & not on air or water level */ ! if (!can_reach_floor()) { ! if ((multi && !flags.run) || (autopickup && !flags.pickup)) ! read_engr_at(u.ux, u.uy); ! return (0); ! } ! /* multi && !flags.run means they are in the middle of some other ! * action, or possibly paralyzed, sleeping, etc.... and they just ! * teleported onto the object. They shouldn't pick it up. ! */ ! if ((multi && !flags.run) || (autopickup && !flags.pickup)) { ! check_here(FALSE); ! return (0); ! } ! if (notake(youmonst.data)) { ! if (!autopickup) ! You("are physically incapable of picking anything up."); ! else ! check_here(FALSE); ! return (0); ! } ! /* if there's anything here, stop running */ ! if (OBJ_AT(u.ux,u.uy) && flags.run && flags.run != 8 && !flags.nopick) nomul(0); } add_valid_menu_class(0); /* reset */ + if (!u.uswallow) { + objchain = level.objects[u.ux][u.uy]; + traverse_how = BY_NEXTHERE; + } else { + objchain = u.ustuck->minvent; + traverse_how = 0; /* nobj */ + } /* * Start the actual pickup process. This is split into two main * sections, the newer menu and the older "traditional" methods. *************** *** 379,385 **** * to make things less confusing. */ if (autopickup) { ! n = autopick(level.objects[u.ux][u.uy], BY_NEXTHERE, &pick_list); goto menu_pickup; } --- 433,439 ---- * to make things less confusing. */ if (autopickup) { ! n = autopick(objchain, traverse_how, &pick_list); goto menu_pickup; } *************** *** 390,404 **** char buf[QBUFSZ]; Sprintf(buf, "Pick %d of what?", count); val_for_n_or_more = count; /* set up callback selector */ ! n = query_objlist(buf, level.objects[u.ux][u.uy], ! BY_NEXTHERE|AUTOSELECT_SINGLE|INVORDER_SORT, &pick_list, PICK_ONE, n_or_more); /* correct counts, if any given */ for (i = 0; i < n; i++) pick_list[i].count = count; } else { ! n = query_objlist("Pick up what?", level.objects[u.ux][u.uy], ! BY_NEXTHERE|AUTOSELECT_SINGLE|INVORDER_SORT, &pick_list, PICK_ANY, all_but_uchain); } menu_pickup: --- 444,458 ---- char buf[QBUFSZ]; Sprintf(buf, "Pick %d of what?", count); val_for_n_or_more = count; /* set up callback selector */ ! n = query_objlist(buf, objchain, ! traverse_how|AUTOSELECT_SINGLE|INVORDER_SORT, &pick_list, PICK_ONE, n_or_more); /* correct counts, if any given */ for (i = 0; i < n; i++) pick_list[i].count = count; } else { ! n = query_objlist("Pick up what?", objchain, ! traverse_how|AUTOSELECT_SINGLE|INVORDER_SORT, &pick_list, PICK_ANY, all_but_uchain); } menu_pickup: *************** *** 424,435 **** selective = FALSE; /* ask for each item */ /* check for more than one object */ ! for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) ct++; if (ct == 1 && count) { /* if only one thing, then pick it */ ! obj = level.objects[u.ux][u.uy]; lcount = min(obj->quan, (long)count); n_tried++; if (pickup_object(obj, lcount, FALSE) > 0) --- 478,490 ---- selective = FALSE; /* ask for each item */ /* check for more than one object */ ! for (obj = objchain; ! obj; obj = (traverse_how == BY_NEXTHERE) ? obj->nexthere : obj->nobj) ct++; if (ct == 1 && count) { /* if only one thing, then pick it */ ! obj = objchain; lcount = min(obj->quan, (long)count); n_tried++; if (pickup_object(obj, lcount, FALSE) > 0) *************** *** 442,461 **** There("are %s objects here.", (ct <= 10) ? "several" : "many"); if (!query_classes(oclasses, &selective, &all_of_a_type, ! "pick up", level.objects[u.ux][u.uy], ! TRUE, FALSE, &via_menu)) { if (!via_menu) return (0); n = query_objlist("Pick up what?", ! level.objects[u.ux][u.uy], ! BY_NEXTHERE|(selective ? 0 : INVORDER_SORT), &pick_list, PICK_ANY, via_menu == -2 ? allow_all : allow_category); goto menu_pickup; } } ! for (obj = level.objects[u.ux][u.uy]; obj; obj = obj2) { ! obj2 = obj->nexthere; /* perhaps obj will be picked up */ lcount = -1L; if (!selective && oclasses[0] && !index(oclasses,obj->oclass)) --- 497,523 ---- There("are %s objects here.", (ct <= 10) ? "several" : "many"); if (!query_classes(oclasses, &selective, &all_of_a_type, ! "pick up", objchain, ! traverse_how == BY_NEXTHERE, ! #ifndef GOLDOBJ ! FALSE, ! #endif ! &via_menu)) { if (!via_menu) return (0); n = query_objlist("Pick up what?", ! objchain, ! traverse_how|(selective ? 0 : INVORDER_SORT), &pick_list, PICK_ANY, via_menu == -2 ? allow_all : allow_category); goto menu_pickup; } } ! for (obj = objchain; obj; obj = obj2) { ! if (traverse_how == BY_NEXTHERE) ! obj2 = obj->nexthere; /* perhaps obj will be picked up */ ! else ! obj2 = obj->nobj; lcount = -1L; if (!selective && oclasses[0] && !index(oclasses,obj->oclass)) *************** *** 494,504 **** ; /* semicolon needed by brain-damaged compilers */ } ! /* position may need updating (invisible hero) */ ! if (n_picked) newsym(u.ux,u.uy); ! /* see whether there's anything else here, after auto-pickup is done */ ! if (autopickup) check_here(n_picked > 0); return (n_tried > 0); } --- 556,570 ---- ; /* semicolon needed by brain-damaged compilers */ } ! if (!u.uswallow) { ! if (!OBJ_AT(u.ux,u.uy)) u.uundetected = 0; ! ! /* position may need updating (invisible hero) */ ! if (n_picked) newsym(u.ux,u.uy); ! /* see whether there's anything else here, after auto-pickup is done */ ! if (autopickup) check_here(n_picked > 0); ! } return (n_tried > 0); } *************** *** 662,675 **** char invlet; int ccount; boolean do_unpaid = FALSE; *pick_list = (menu_item *) 0; if (!olist) return 0; if ((qflags & UNPAID_TYPES) && count_unpaid(olist)) do_unpaid = TRUE; ccount = count_categories(olist, qflags); /* no point in actually showing a menu for a single category */ ! if (ccount == 1 && !do_unpaid && !(qflags & BILLED_TYPES)) { for (curr = olist; curr; curr = FOLLOW(curr, qflags)) { if ((qflags & WORN_TYPES) && !(curr->owornmask & (W_ARMOR|W_RING|W_AMUL|W_TOOL|W_WEP|W_SWAPWEP|W_QUIVER))) --- 728,760 ---- char invlet; int ccount; boolean do_unpaid = FALSE; + boolean do_blessed = FALSE, do_cursed = FALSE, do_uncursed = FALSE, + do_buc_unknown = FALSE; + int num_buc_types = 0; *pick_list = (menu_item *) 0; if (!olist) return 0; if ((qflags & UNPAID_TYPES) && count_unpaid(olist)) do_unpaid = TRUE; + if ((qflags & BUC_BLESSED) && count_buc(olist, BUC_BLESSED)) { + do_blessed = TRUE; + num_buc_types++; + } + if ((qflags & BUC_CURSED) && count_buc(olist, BUC_CURSED)) { + do_cursed = TRUE; + num_buc_types++; + } + if ((qflags & BUC_UNCURSED) && count_buc(olist, BUC_UNCURSED)) { + do_uncursed = TRUE; + num_buc_types++; + } + if ((qflags & BUC_UNKNOWN) && count_buc(olist, BUC_UNKNOWN)) { + do_buc_unknown = TRUE; + num_buc_types++; + } ccount = count_categories(olist, qflags); /* no point in actually showing a menu for a single category */ ! if (ccount == 1 && !do_unpaid && num_buc_types <= 1 && !(qflags & BILLED_TYPES)) { for (curr = olist; curr; curr = FOLLOW(curr, qflags)) { if ((qflags & WORN_TYPES) && !(curr->owornmask & (W_ARMOR|W_RING|W_AMUL|W_TOOL|W_WEP|W_SWAPWEP|W_QUIVER))) *************** *** 751,756 **** --- 836,871 ---- "Auto-select every item being worn" : "Auto-select every item", MENU_UNSELECTED); } + /* items with b/u/c/unknown if there are any */ + if (do_blessed) { + invlet = 'B'; + any.a_void = 0; + any.a_int = 'B'; + add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, + "Items known to be Blessed", MENU_UNSELECTED); + } + if (do_cursed) { + invlet = 'C'; + any.a_void = 0; + any.a_int = 'C'; + add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, + "Items known to be Cursed", MENU_UNSELECTED); + } + if (do_uncursed) { + invlet = 'U'; + any.a_void = 0; + any.a_int = 'U'; + add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, + "Items known to be Uncursed", MENU_UNSELECTED); + } + if (do_buc_unknown) { + invlet = 'X'; + any.a_void = 0; + any.a_int = 'X'; + add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, + "Items of unknown B/C/U status", + MENU_UNSELECTED); + } end_menu(win, qstr); n = select_menu(win, how, pick_list); destroy_nhwindow(win); *************** *** 801,813 **** --- 916,933 ---- is_gold = obj->oclass == GOLD_CLASS; int wt, iw, ow, oow; long qq, savequan; + #ifdef GOLDOBJ + long umoney = money_cnt(invent); + #endif unsigned saveowt; const char *verb, *prefx1, *prefx2, *suffx; char obj_nambuf[BUFSZ], where[BUFSZ]; savequan = obj->quan; saveowt = obj->owt; + iw = max_capacity(); + if (count != savequan) { obj->quan = count; obj->owt = (unsigned)weight(obj); *************** *** 816,845 **** --- 936,985 ---- if (adjust_wt) wt -= (container->otyp == BAG_OF_HOLDING) ? (int)DELTA_CWT(container, obj) : (int)obj->owt; + #ifndef GOLDOBJ if (is_gold) /* merged gold might affect cumulative weight */ wt -= (GOLD_WT(u.ugold) + GOLD_WT(count) - GOLD_WT(u.ugold + count)); + #else + /* This will go with silver+copper & new gold weight */ + if (is_gold) /* merged gold might affect cumulative weight */ + wt -= (GOLD_WT(umoney) + GOLD_WT(count) - GOLD_WT(umoney + count)); + #endif if (count != savequan) { obj->quan = savequan; obj->owt = saveowt; } *wt_before = iw; *wt_after = wt; + if (wt < 0) return count; /* see how many we can lift */ if (is_gold) { + #ifndef GOLDOBJ iw -= (int)GOLD_WT(u.ugold); if (!adjust_wt) { qq = GOLD_CAPACITY((long)iw, u.ugold); } else { oow = 0; qq = 50L - (u.ugold % 100L) - 1L; + #else + iw -= (int)GOLD_WT(umoney); + if (!adjust_wt) { + qq = GOLD_CAPACITY((long)iw, umoney); + } else { + oow = 0; + qq = 50L - (umoney % 100L) - 1L; + #endif if (qq < 0L) qq += 100L; for ( ; qq <= count; qq += 100L) { obj->quan = qq; obj->owt = (unsigned)GOLD_WT(qq); + #ifndef GOLDOBJ ow = (int)GOLD_WT(u.ugold + qq); + #else + ow = (int)GOLD_WT(umoney + qq); + #endif ow -= (container->otyp == BAG_OF_HOLDING) ? (int)DELTA_CWT(container, obj) : (int)obj->owt; if (iw + ow >= 0) break; *************** *** 850,856 **** --- 990,1000 ---- } if (qq < 0L) qq = 0L; else if (qq > count) qq = count; + #ifndef GOLDOBJ wt = iw + (int)GOLD_WT(u.ugold + qq); + #else + wt = iw + (int)GOLD_WT(umoney + qq); + #endif } else if (count > 1 || count < obj->quan) { /* * Ugh. Calc num to lift by changing the quan of of the *************** *** 902,908 **** --- 1046,1056 ---- } if (!container) Strcpy(where, "here"); /* slightly shorter form */ + #ifndef GOLDOBJ if (invent || u.ugold) { + #else + if (invent || umoney) { + #endif prefx1 = "you cannot "; prefx2 = ""; suffx = " any more"; *************** *** 912,918 **** suffx = ""; } There("%s %s %s, but %s%s%s%s.", ! (obj->quan == 1L) ? "is" : "are", obj_nambuf, where, prefx1, prefx2, verb, suffx); /* *wt_after = iw; */ --- 1060,1066 ---- suffx = ""; } There("%s %s %s, but %s%s%s%s.", ! otense(obj, "are"), obj_nambuf, where, prefx1, prefx2, verb, suffx); /* *wt_after = iw; */ *************** *** 921,934 **** /* determine whether character is able and player is willing to carry `obj' */ STATIC_OVL ! int lift_object(obj, container, cnt_p, telekinesis) struct obj *obj, *container; /* object to pick up, bag it's coming out of */ long *cnt_p; boolean telekinesis; { int result, old_wt, new_wt, prev_encumbr, next_encumbr; - if (obj->otyp == BOULDER && In_sokoban(&u.uz)) { You("cannot get your %s around this %s.", body_part(HAND), xname(obj)); --- 1069,1082 ---- /* determine whether character is able and player is willing to carry `obj' */ STATIC_OVL ! int ! lift_object(obj, container, cnt_p, telekinesis) struct obj *obj, *container; /* object to pick up, bag it's coming out of */ long *cnt_p; boolean telekinesis; { int result, old_wt, new_wt, prev_encumbr, next_encumbr; if (obj->otyp == BOULDER && In_sokoban(&u.uz)) { You("cannot get your %s around this %s.", body_part(HAND), xname(obj)); *************** *** 941,948 **** --- 1089,1100 ---- *cnt_p = carry_count(obj, container, *cnt_p, telekinesis, &old_wt, &new_wt); if (*cnt_p < 1L) { result = -1; /* nothing lifted */ + #ifndef GOLDOBJ } else if (obj->oclass != GOLD_CLASS && inv_cnt() >= 52 && !merge_choice(invent, obj)) { + #else + } else if (inv_cnt() >= 52 && !merge_choice(invent, obj)) { + #endif Your("knapsack cannot accommodate any more items."); result = -1; /* nothing lifted */ } else { *************** *** 990,997 **** --- 1142,1151 ---- boolean telekinesis; /* not picking it up directly by hand */ { int res, nearload; + #ifndef GOLDOBJ const char *where = (obj->ox == u.ux && obj->oy == u.uy) ? "here" : "there"; + #endif if (obj->quan < count) { impossible("pickup_object: count %ld > quan %ld?", *************** *** 1011,1016 **** --- 1165,1171 ---- return 0; } else if (obj->oartifact && !touch_artifact(obj,&youmonst)) { return 0; + #ifndef GOLDOBJ } else if (obj->oclass == GOLD_CLASS) { /* Special consideration for gold pieces... */ long iw = (long)max_capacity() - GOLD_WT(u.ugold); *************** *** 1019,1025 **** if (gold_capacity <= 0L) { pline( "There %s %ld gold piece%s %s, but you cannot carry any more.", ! (obj->quan == 1L) ? "is" : "are", obj->quan, plur(obj->quan), where); return 0; } else if (gold_capacity < count) { --- 1174,1180 ---- if (gold_capacity <= 0L) { pline( "There %s %ld gold piece%s %s, but you cannot carry any more.", ! otense(obj, "are"), obj->quan, plur(obj->quan), where); return 0; } else if (gold_capacity < count) { *************** *** 1049,1065 **** flags.botl = 1; if (flags.run) nomul(0); return 1; } else if (obj->otyp == CORPSE) { ! if ( (touch_petrifies(&mons[obj->corpsenm])) && !uarmg && !Stone_resistance && !telekinesis) { if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) display_nhwindow(WIN_MESSAGE, FALSE); else { char kbuf[BUFSZ]; ! pline("Touching %s corpse is a fatal mistake.", ! an(mons[obj->corpsenm].mname)); ! Sprintf(kbuf, "%s corpse", an(mons[obj->corpsenm].mname)); instapetrify(kbuf); return -1; } --- 1204,1220 ---- flags.botl = 1; if (flags.run) nomul(0); return 1; + #endif } else if (obj->otyp == CORPSE) { ! if ( (touch_petrifies(&mons[obj->corpsenm])) && !uarmg && !Stone_resistance && !telekinesis) { if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) display_nhwindow(WIN_MESSAGE, FALSE); else { char kbuf[BUFSZ]; ! Strcpy(kbuf, an(corpse_xname(obj, TRUE))); ! pline("Touching %s is a fatal mistake.", kbuf); instapetrify(kbuf); return -1; } *************** *** 1074,1081 **** if (obj->blessed) obj->blessed = 0; else if (!obj->spe && !obj->cursed) obj->spe = 1; else { ! pline_The("scroll%s turn%s to dust as you %s %s up.", ! plur(obj->quan), (obj->quan == 1L) ? "s" : "", telekinesis ? "raise" : "pick", (obj->quan == 1L) ? "it" : "them"); if (!(objects[SCR_SCARE_MONSTER].oc_name_known) && --- 1229,1236 ---- if (obj->blessed) obj->blessed = 0; else if (!obj->spe && !obj->cursed) obj->spe = 1; else { ! pline_The("scroll%s %s to dust as you %s %s up.", ! plur(obj->quan), otense(obj, "turn"), telekinesis ? "raise" : "pick", (obj->quan == 1L) ? "it" : "them"); if (!(objects[SCR_SCARE_MONSTER].oc_name_known) && *************** *** 1090,1103 **** if ((res = lift_object(obj, (struct obj *)0, &count, telekinesis)) <= 0) return res; if (obj->quan != count && obj->otyp != LOADSTONE) ! (void) splitobj(obj, count); obj = pick_obj(obj); if (uwep && uwep == obj) mrg_to_wielded = TRUE; nearload = near_capacity(); ! prinv(nearload == SLT_ENCUMBER ? moderateloadmsg : (char *) 0, obj, count); mrg_to_wielded = FALSE; return 1; } --- 1245,1263 ---- if ((res = lift_object(obj, (struct obj *)0, &count, telekinesis)) <= 0) return res; + #ifdef GOLDOBJ + /* Whats left of the special case for gold :-) */ + if (obj->oclass == GOLD_CLASS) flags.botl = 1; + #endif if (obj->quan != count && obj->otyp != LOADSTONE) ! obj = splitobj(obj, count); obj = pick_obj(obj); if (uwep && uwep == obj) mrg_to_wielded = TRUE; nearload = near_capacity(); ! prinv(nearload == SLT_ENCUMBER ? moderateloadmsg : (char *) 0, ! obj, count); mrg_to_wielded = FALSE; return 1; } *************** *** 1108,1126 **** * pointer to the object where otmp ends up. This may be different * from otmp because of merging. * ! * Gold never reaches this routine. */ struct obj * pick_obj(otmp) ! register struct obj *otmp; { obj_extract_self(otmp); ! if (*u.ushops && costly_spot(u.ux, u.uy) && ! otmp != uball) /* don't charge for this - kd, 1/17/90 */ ! /* sets obj->unpaid if necessary */ addtobill(otmp, TRUE, FALSE, FALSE); ! if(Invisible) newsym(u.ux,u.uy); ! return(addinv(otmp)); /* might merge it with other objects */ } /* --- 1268,1302 ---- * pointer to the object where otmp ends up. This may be different * from otmp because of merging. * ! * Gold never reaches this routine unless GOLDOBJ is defined. */ struct obj * pick_obj(otmp) ! struct obj *otmp; { obj_extract_self(otmp); ! if (otmp->no_charge) { ! /* this attribute only applies to objects outside invent */ ! otmp->no_charge = 0; ! } else if (otmp != uball && costly_spot(otmp->ox, otmp->oy)) { ! char saveushops[5], fakeshop[2]; ! ! /* addtobill cares about your location rather than the object's; ! usually they'll be the same, but not when using telekinesis ! (if ever implemented) or a grappling hook */ ! Strcpy(saveushops, u.ushops); ! fakeshop[0] = *in_rooms(otmp->ox, otmp->oy, SHOPBASE); ! fakeshop[1] = '\0'; ! Strcpy(u.ushops, fakeshop); ! /* sets obj->unpaid if necessary */ addtobill(otmp, TRUE, FALSE, FALSE); ! Strcpy(u.ushops, saveushops); ! /* if you're outside the shop, make shk notice */ ! if (!index(u.ushops, *fakeshop)) ! remote_burglary(otmp->ox, otmp->oy); ! } ! if (Invisible) newsym(otmp->ox, otmp->oy); ! return addinv(otmp); /* might merge it with other objects */ } /* *************** *** 1139,1145 **** break; case 2: You("rebalance your load. Movement is difficult."); break; ! case 3: You("stagger under your heavy load. Movement is very hard."); break; default: You("%s move a handspan with this load!", newcap == 4 ? "can barely" : "can't even"); --- 1315,1322 ---- break; case 2: You("rebalance your load. Movement is difficult."); break; ! case 3: You("%s under your heavy load. Movement is very hard.", ! stagger(youmonst.data, "stagger")); break; default: You("%s move a handspan with this load!", newcap == 4 ? "can barely" : "can't even"); *************** *** 1154,1160 **** break; case 2: You("rebalance your load. Movement is still difficult."); break; ! case 3: You("stagger under your load. Movement is still very hard."); break; } flags.botl = 1; --- 1331,1338 ---- break; case 2: You("rebalance your load. Movement is still difficult."); break; ! case 3: You("%s under your load. Movement is still very hard.", ! stagger(youmonst.data, "stagger")); break; } flags.botl = 1; *************** *** 1234,1249 **** const char *dont_find_anything = "don't find anything"; struct monst *mtmp; char qbuf[QBUFSZ]; ! #ifdef STEED ! struct obj *otmp; ! boolean saddled_there = FALSE; ! boolean got_saddle = FALSE; ! #endif if (check_capacity((char *)0)) { /* "Can't do that while carrying so much stuff." */ return 0; } x = u.ux; y = u.uy; lootcont: --- 1412,1428 ---- const char *dont_find_anything = "don't find anything"; struct monst *mtmp; char qbuf[QBUFSZ]; ! int prev_inquiry = 0; ! boolean prev_loot = FALSE; if (check_capacity((char *)0)) { /* "Can't do that while carrying so much stuff." */ return 0; } + if (nohands(youmonst.data)) { + You("have no hands!"); /* not `body_part(HAND)' */ + return 0; + } x = u.ux; y = u.uy; lootcont: *************** *** 1264,1274 **** continue; } if (cobj->otyp == BAG_OF_TRICKS) { You("carefully open the bag..."); pline("It develops a huge set of teeth and bites you!"); ! c = rnd(10); ! if (Half_physical_damage) c = (c+1) / 2; ! losehp(c, "carnivorous bag", KILLED_BY_AN); makeknown(BAG_OF_TRICKS); timepassed = 1; continue; --- 1443,1454 ---- continue; } if (cobj->otyp == BAG_OF_TRICKS) { + int tmp; You("carefully open the bag..."); pline("It develops a huge set of teeth and bites you!"); ! tmp = rnd(10); ! if (Half_physical_damage) tmp = (tmp+1) / 2; ! losehp(tmp, "carnivorous bag", KILLED_BY_AN); makeknown(BAG_OF_TRICKS); timepassed = 1; continue; *************** *** 1280,1288 **** --- 1460,1481 ---- } } } else if (Confusion) { + #ifndef GOLDOBJ if (u.ugold){ long contribution = rnd((int)min(LARGEST_INT,u.ugold)); struct obj *goldob = mkgoldobj(contribution); + #else + struct obj *goldob; + /* Find a money object to mess with */ + for (goldob = invent; goldob; goldob = goldob->nobj) { + if (goldob->oclass == GOLD_CLASS) break; + } + if (goldob){ + long contribution = rnd((int)min(LARGEST_INT, goldob->quan)); + if (contribution < goldob->quan) + goldob = splitobj(goldob, contribution); + freeinv(goldob); + #endif if (IS_THRONE(levl[u.ux][u.uy].typ)){ struct obj *coffers; int pass; *************** *** 1292,1313 **** if (coffers->otyp == CHEST && coffers->spe == pass) goto gotit; /* two level break */ gotit: ! if (coffers){ ! struct obj *tmp; verbalize("Thank you for your contribution to reduce the debt."); ! for (tmp = coffers->cobj; tmp; tmp = tmp->nobj) ! if (tmp->otyp == goldob->otyp) break; ! ! if (tmp) { ! tmp->quan += goldob->quan; ! delobj(goldob); ! } else { ! add_to_container(coffers, goldob); ! } } else { struct monst *mon = makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS); if (mon) { mon->mgold += goldob->quan; delobj(goldob); pline("The exchequer accepts your contribution."); --- 1485,1499 ---- if (coffers->otyp == CHEST && coffers->spe == pass) goto gotit; /* two level break */ gotit: ! if (coffers) { verbalize("Thank you for your contribution to reduce the debt."); ! (void) add_to_container(coffers, goldob); ! coffers->owt = weight(coffers); } else { struct monst *mon = makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS); if (mon) { + #ifndef GOLDOBJ mon->mgold += goldob->quan; delobj(goldob); pline("The exchequer accepts your contribution."); *************** *** 1317,1322 **** --- 1503,1518 ---- } } else { dropx(goldob); + #else + add_to_minv(mon, goldob); + pline("The exchequer accepts your contribution."); + } else { + dropy(goldob); + } + } + } else { + dropy(goldob); + #endif pline("Ok, now there is loot here."); } } *************** *** 1346,1359 **** return timepassed; } mtmp = m_at(x, y); #ifdef STEED ! /* 3.3.1 introduced the ability to remove saddle from a steed */ ! if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) { ! long unwornmask; ! saddled_there = TRUE; ! Sprintf(qbuf, "Do you want to remove the saddle from %s?", x_monnam(mtmp, ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); ! if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { if (nolimbs(youmonst.data)) { You_cant("do that without limbs."); /* not body_part(HAND) */ return (0); --- 1542,1598 ---- return timepassed; } mtmp = m_at(x, y); + if (mtmp) timepassed = loot_mon(mtmp, &prev_inquiry, &prev_loot); + + /* Preserve pre-3.3.1 behaviour for containers. + * Adjust this if-block to allow container looting + * from one square away to change that in the future. + */ + if (!underfoot) { + if (container_at(x, y, FALSE)) { + if (mtmp) { + You_cant("loot anything %sthere with %s in the way.", + prev_inquiry ? "else " : "", mon_nam(mtmp)); + return timepassed; + } else { + You("have to be at a container to loot it."); + } + } else { + You("%s %sthere to loot.", dont_find_anything, + (prev_inquiry || prev_loot) ? "else " : ""); + return timepassed; + } + } + } else if (c != 'y' && c != 'n') { + You("%s %s to loot.", dont_find_anything, + underfoot ? "here" : "there"); + } + return (timepassed); + } + + /* loot_mon() returns amount of time passed. + */ + int + loot_mon(mtmp, passed_info, prev_loot) + struct monst *mtmp; + int *passed_info; + boolean *prev_loot; + { + int c = -1; + int timepassed = 0; #ifdef STEED ! struct obj *otmp; ! char qbuf[QBUFSZ]; ! ! /* 3.3.1 introduced the ability to remove saddle from a steed */ ! /* *passed_info is set to TRUE if a loot query was given. */ ! /* *prev_loot is set to TRUE if something was actually acquired in here. */ ! if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) { ! long unwornmask; ! if (passed_info) *passed_info = 1; ! Sprintf(qbuf, "Do you want to remove the saddle from %s?", x_monnam(mtmp, ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); ! if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { if (nolimbs(youmonst.data)) { You_cant("do that without limbs."); /* not body_part(HAND) */ return (0); *************** *** 1375,1443 **** otmp = hold_another_object(otmp, "You drop %s!", doname(otmp), (const char *)0); timepassed = rnd(3); ! got_saddle = TRUE; ! } else if (c == 'q') { return (0); - } - } - # if 0 - /* Loot your steed, even if you can't reach the floor */ - if (u.usteed) { - Sprintf(qbuf, "Do you want to loot %s inventory?", - s_suffix(x_monnam(u.usteed, ARTICLE_YOUR, - (char *)0, SUPPRESS_SADDLE, FALSE))); - switch (c = ynq(qbuf)) { - case 'y': - if (!u.usteed->minvent) { - impossible("no saddle?"); - break; - } - /* TO DO: get and put things into the inventory */ - You("peek at %s inventory...", - s_suffix(x_monnam(u.usteed, ARTICLE_YOUR, - (char *)0, SUPPRESS_SADDLE, FALSE))); - (void) display_minventory(u.usteed, MINV_ALL); - timepassed = 1; - break; - case 'n': - break; - case 'q': - return (0); - } } ! # endif #endif /* STEED */ ! ! /* Preserve pre-3.3.1 behaviour for containers. ! * Adjust this if-block to allow container looting ! * from one square away to change that in the future. ! */ ! if (!underfoot) { ! if (container_at(x, y, FALSE)) { ! if (mtmp) { ! You("can't loot anything %sthere with %s in the way.", ! #ifdef STEED ! saddled_there ? "else " : ! #endif ! "", mon_nam(mtmp)); ! return timepassed; ! } else { ! You("have to be at a container to loot it."); ! } ! } else { ! You("%s %sthere to loot.", dont_find_anything, ! #ifdef STEED ! (saddled_there || got_saddle) ? "else " : ! #endif ! ""); ! return timepassed; ! } ! } ! } else if (c != 'y' && c != 'n') { ! You("%s %s to loot.", dont_find_anything, ! underfoot ? "here" : "there"); } ! return (timepassed); } /* --- 1614,1631 ---- otmp = hold_another_object(otmp, "You drop %s!", doname(otmp), (const char *)0); timepassed = rnd(3); ! if (prev_loot) *prev_loot = TRUE; ! } else if (c == 'q') { return (0); } ! } #endif /* STEED */ ! /* 3.4.0 introduced the ability to pick things up from within swallower's stomach */ ! if (u.uswallow) { ! int count = passed_info ? *passed_info : 0; ! timepassed = pickup(count); } ! return timepassed; } /* *************** *** 1477,1483 **** in_container(obj) register struct obj *obj; { - register struct obj *gold; boolean is_gold = (obj->oclass == GOLD_CLASS); boolean floor_container = !carried(current_container); char buf[BUFSZ]; --- 1665,1670 ---- *************** *** 1510,1516 **** pline("%s cannot be confined in such trappings.", The(xname(obj))); return 0; } else if (obj->otyp == LEASH && obj->leashmon != 0) { ! pline("%s is attached to your pet.", The(xname(obj))); return 0; } else if (obj == uwep) { if (welded(obj)) { --- 1697,1703 ---- pline("%s cannot be confined in such trappings.", The(xname(obj))); return 0; } else if (obj->otyp == LEASH && obj->leashmon != 0) { ! pline("%s attached to your pet.", Tobjnam(obj, "are")); return 0; } else if (obj == uwep) { if (welded(obj)) { *************** *** 1527,1532 **** --- 1714,1735 ---- if (uquiver) return 0; /* unwielded, died, rewielded */ } + if (obj->otyp == CORPSE) { + if ( (touch_petrifies(&mons[obj->corpsenm])) && !uarmg + && !Stone_resistance) { + if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) + display_nhwindow(WIN_MESSAGE, FALSE); + else { + char kbuf[BUFSZ]; + + Strcpy(kbuf, an(corpse_xname(obj, TRUE))); + pline("Touching %s is a fatal mistake.", kbuf); + instapetrify(kbuf); + return -1; + } + } + } + /* boxes, boulders, and big statues can't fit into any container */ if (obj->otyp == ICE_BOX || Is_box(obj) || obj->otyp == BOULDER || (obj->otyp == STATUE && bigmonst(&mons[obj->corpsenm]))) { *************** *** 1544,1582 **** freeinv(obj); - if (is_gold) { /* look for other money to merge within the container */ - for (gold = current_container->cobj; gold; gold = gold->nobj) - if (gold->otyp == obj->otyp) break; - } else - gold = 0; - - if (gold) { - gold->quan += obj->quan; - } else { - add_to_container(current_container, obj); - } - - current_container->owt = weight(current_container); - - Strcpy(buf, the(xname(current_container))); - You("put %s into %s.", doname(obj), buf); - if (obj_is_burning(obj)) /* this used to be part of freeinv() */ (void) snuff_lit(obj); if (floor_container && costly_spot(u.ux, u.uy)) { ! sellobj_state(TRUE); sellobj(obj, u.ux, u.uy); ! sellobj_state(FALSE); } if (Icebox && obj->otyp != OIL_LAMP && obj->otyp != BRASS_LANTERN && !Is_candle(obj)) { obj->age = monstermoves - obj->age; /* actual age */ /* stop any corpse timeouts when frozen */ if (obj->otyp == CORPSE && obj->timed) { ! (void) stop_timer(ROT_CORPSE, (genericptr_t)obj); (void) stop_timer(REVIVE_MON, (genericptr_t)obj); ! } } else if (Is_mbag(current_container) && mbag_explodes(obj, 0)) { --- 1747,1770 ---- freeinv(obj); if (obj_is_burning(obj)) /* this used to be part of freeinv() */ (void) snuff_lit(obj); if (floor_container && costly_spot(u.ux, u.uy)) { ! sellobj_state(SELL_DELIBERATE); sellobj(obj, u.ux, u.uy); ! sellobj_state(SELL_NORMAL); } if (Icebox && obj->otyp != OIL_LAMP && obj->otyp != BRASS_LANTERN && !Is_candle(obj)) { obj->age = monstermoves - obj->age; /* actual age */ /* stop any corpse timeouts when frozen */ if (obj->otyp == CORPSE && obj->timed) { ! long rot_alarm = stop_timer(ROT_CORPSE, (genericptr_t)obj); (void) stop_timer(REVIVE_MON, (genericptr_t)obj); ! /* mark a non-reviving corpse as such */ ! if (rot_alarm) obj->norevive = 1; ! } } else if (Is_mbag(current_container) && mbag_explodes(obj, 0)) { *************** *** 1590,1595 **** --- 1778,1785 ---- (void)stolen_value(current_container, u.ux, u.uy, (boolean)shkp->mpeaceful, FALSE); } + /* did not actually insert obj yet */ + obfree(obj, (struct obj *)0); delete_contents(current_container); if (!floor_container) useup(current_container); *************** *** 1602,1611 **** current_container = 0; /* baggone = TRUE; */ } ! if (is_gold) { ! if (gold) dealloc_obj(obj); ! bot(); /* update character's gold piece count immediately */ } return(current_container ? 1 : -1); } --- 1792,1805 ---- current_container = 0; /* baggone = TRUE; */ } ! if (current_container) { ! Strcpy(buf, the(xname(current_container))); ! You("put %s into %s.", doname(obj), buf); ! ! (void) add_to_container(current_container, obj); ! current_container->owt = weight(current_container); } + if (is_gold) bot(); /* update gold piece count immediately */ return(current_container ? 1 : -1); } *************** *** 1636,1647 **** if(obj->oartifact && !touch_artifact(obj,&youmonst)) return 0; count = obj->quan; if ((res = lift_object(obj, current_container, &count, FALSE)) <= 0) return res; if (obj->quan != count && obj->otyp != LOADSTONE) ! (void) splitobj(obj, count); /* Remove the object from the list. */ obj_extract_self(obj); --- 1830,1857 ---- if(obj->oartifact && !touch_artifact(obj,&youmonst)) return 0; + if (obj->otyp == CORPSE) { + if ( (touch_petrifies(&mons[obj->corpsenm])) && !uarmg + && !Stone_resistance) { + if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) + display_nhwindow(WIN_MESSAGE, FALSE); + else { + char kbuf[BUFSZ]; + + Strcpy(kbuf, an(corpse_xname(obj, TRUE))); + pline("Touching %s is a fatal mistake.", kbuf); + instapetrify(kbuf); + return -1; + } + } + } + count = obj->quan; if ((res = lift_object(obj, current_container, &count, FALSE)) <= 0) return res; if (obj->quan != count && obj->otyp != LOADSTONE) ! obj = splitobj(obj, count); /* Remove the object from the list. */ obj_extract_self(obj); *************** *** 1674,1680 **** --- 1884,1892 ---- otmp, count); if (is_gold) { + #ifndef GOLDOBJ dealloc_obj(obj); + #endif bot(); /* update character's gold piece count immediately */ } return 1; *************** *** 1687,1693 **** register struct obj *obj; register int held; { ! struct obj *curr, *otmp, *u_gold = (struct obj *)0; struct monst *shkp; boolean one_by_one, allflag, loot_out = FALSE, loot_in = FALSE; char select[MAXOCLASSES+1]; --- 1899,1908 ---- register struct obj *obj; register int held; { ! struct obj *curr, *otmp; ! #ifndef GOLDOBJ ! struct obj *u_gold = (struct obj *)0; ! #endif struct monst *shkp; boolean one_by_one, allflag, loot_out = FALSE, loot_in = FALSE; char select[MAXOCLASSES+1]; *************** *** 1697,1703 **** menu_on_request; if (obj->olocked) { ! pline("%s seems to be locked.", The(xname(obj))); if (held) You("must put it down to unlock."); return 0; } else if (obj->otrapped) { --- 1912,1918 ---- menu_on_request; if (obj->olocked) { ! pline("%s to be locked.", Tobjnam(obj, "seem")); if (held) You("must put it down to unlock."); return 0; } else if (obj->otrapped) { *************** *** 1738,1744 **** obj->ox, obj->oy, sc); if (ocat) { obj_extract_self(ocat); ! add_to_container(obj, ocat); /* weight handled below */ } pline_The("%s inside the box is dead!", Hallucination ? rndmonnam() : "housecat"); --- 1953,1960 ---- obj->ox, obj->oy, sc); if (ocat) { obj_extract_self(ocat); ! (void) add_to_container(obj, ocat); ! /* weight handled below */ } pline_The("%s inside the box is dead!", Hallucination ? rndmonnam() : "housecat"); *************** *** 1777,1789 **** } if (cnt && loss) ! You("owe %ld zorkmids for lost item%s.", ! loss, lcnt > 1 ? "s" : ""); obj->owt = weight(obj); if (!cnt) { ! pline("%s is empty.", Yname2(obj)); } else { Sprintf(qbuf, "Do you want to take %s out of %s?", something, yname(obj)); --- 1993,2005 ---- } if (cnt && loss) ! You("owe %ld %s for lost item%s.", ! loss, currency(loss), lcnt > 1 ? "s" : ""); obj->owt = weight(obj); if (!cnt) { ! pline("%s %s empty.", Yname2(obj), otense(obj, "are")); } else { Sprintf(qbuf, "Do you want to take %s out of %s?", something, yname(obj)); *************** *** 1812,1818 **** case 'y': if (query_classes(select, &one_by_one, &allflag, "take out", current_container->cobj, ! FALSE, FALSE, &menu_on_request)) { if (askchain((struct obj **)¤t_container->cobj, (one_by_one ? (char *)0 : select), allflag, out_container, --- 2028,2038 ---- case 'y': if (query_classes(select, &one_by_one, &allflag, "take out", current_container->cobj, ! FALSE, ! #ifndef GOLDOBJ ! FALSE, ! #endif ! &menu_on_request)) { if (askchain((struct obj **)¤t_container->cobj, (one_by_one ? (char *)0 : select), allflag, out_container, *************** *** 1833,1839 **** --- 2053,2063 ---- } } + #ifndef GOLDOBJ if (!invent && u.ugold == 0) { + #else + if (!invent) { + #endif /* nothing to put in, but some feedback is necessary */ You("don't have anything to put in."); return used; *************** *** 1847,1852 **** --- 2071,2077 ---- * putting things in an ice chest. */ if (loot_in) { + #ifndef GOLDOBJ if (u.ugold) { /* * Hack: gold is not in the inventory, so make a gold object *************** *** 1858,1863 **** --- 2083,2089 ---- u_gold->nobj = invent; invent = u_gold; } + #endif add_valid_menu_class(0); /* reset */ if (flags.menu_style != MENU_TRADITIONAL) { used |= menu_loot(0, current_container, TRUE) > 0; *************** *** 1865,1871 **** /* traditional code */ menu_on_request = 0; if (query_classes(select, &one_by_one, &allflag, "put in", ! invent, FALSE, (u.ugold != 0L), &menu_on_request)) { (void) askchain((struct obj **)&invent, (one_by_one ? (char *)0 : select), allflag, --- 2091,2100 ---- /* traditional code */ menu_on_request = 0; if (query_classes(select, &one_by_one, &allflag, "put in", ! invent, FALSE, ! #ifndef GOLDOBJ ! (u.ugold != 0L), ! #endif &menu_on_request)) { (void) askchain((struct obj **)&invent, (one_by_one ? (char *)0 : select), allflag, *************** *** 1878,1890 **** } } if (u_gold && invent && invent->oclass == GOLD_CLASS) { /* didn't stash [all of] it */ u_gold = invent; invent = u_gold->nobj; dealloc_obj(u_gold); } ! return used; } --- 2107,2120 ---- } } + #ifndef GOLDOBJ if (u_gold && invent && invent->oclass == GOLD_CLASS) { /* didn't stash [all of] it */ u_gold = invent; invent = u_gold->nobj; dealloc_obj(u_gold); } ! #endif return used; } *************** *** 1909,1915 **** } else if (flags.menu_style == MENU_FULL) { all_categories = FALSE; Sprintf(buf,"%s what type of objects?", put_in ? putin : takeout); ! mflags = put_in ? ALL_TYPES : ALL_TYPES|CHOOSE_ALL; n = query_category(buf, put_in ? invent : container->cobj, mflags, &pick_list, PICK_ANY); if (!n) return 0; --- 2139,2146 ---- } else if (flags.menu_style == MENU_FULL) { all_categories = FALSE; Sprintf(buf,"%s what type of objects?", put_in ? putin : takeout); ! mflags = put_in ? ALL_TYPES | BUC_ALLBKNOWN | BUC_UNKNOWN : ! ALL_TYPES | CHOOSE_ALL | BUC_ALLBKNOWN | BUC_UNKNOWN; n = query_category(buf, put_in ? invent : container->cobj, mflags, &pick_list, PICK_ANY); if (!n) return 0; *************** *** 1943,1953 **** otmp = pick_list[i].item.a_obj; count = pick_list[i].count; if (count > 0 && count < otmp->quan) { ! otmp2 = splitobj(otmp, count); /* special split case also handled by askchain() */ - if (otmp == uwep) setuwep(otmp2); - if (otmp == uquiver) setuqwep(otmp2); - if (otmp == uswapwep) setuswapwep(otmp2); } res = put_in ? in_container(otmp) : out_container(otmp); if (res < 0) --- 2174,2181 ---- otmp = pick_list[i].item.a_obj; count = pick_list[i].count; if (count > 0 && count < otmp->quan) { ! otmp = splitobj(otmp, count); /* special split case also handled by askchain() */ } res = put_in ? in_container(otmp) : out_container(otmp); if (res < 0) *************** *** 1975,1986 **** start_menu(win); any.a_int = 1; Sprintf(buf,"Take %s out of %s", something, the(xname(obj))); ! add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE, buf, MENU_UNSELECTED); any.a_int = 2; Sprintf(buf,"Put %s into %s", something, the(xname(obj))); ! add_menu(win, NO_GLYPH, &any, 'b', 0, ATR_NONE, buf, MENU_UNSELECTED); any.a_int = 3; ! add_menu(win, NO_GLYPH, &any, 'c', 0, ATR_NONE, "Both of the above", MENU_UNSELECTED); end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); --- 2203,2214 ---- start_menu(win); any.a_int = 1; Sprintf(buf,"Take %s out of %s", something, the(xname(obj))); ! add_menu(win, NO_GLYPH, &any, 'o', 0, ATR_NONE, buf, MENU_UNSELECTED); any.a_int = 2; Sprintf(buf,"Put %s into %s", something, the(xname(obj))); ! add_menu(win, NO_GLYPH, &any, 'i', 0, ATR_NONE, buf, MENU_UNSELECTED); any.a_int = 3; ! add_menu(win, NO_GLYPH, &any, 'b', 0, ATR_NONE, "Both of the above", MENU_UNSELECTED); end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); *** nethack-3.3.1/src/pline.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/pline.c Thu Mar 21 07:37:37 2002 *************** *** 1,10 **** ! /* SCCS Id: @(#)pline.c 3.3 1999/11/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #define NEED_VARARGS /* Uses ... */ /* comment line for pre-compiled headers */ #include "hack.h" #include "epri.h" #ifdef OVLB --- 1,13 ---- ! /* SCCS Id: @(#)pline.c 3.4 1999/11/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #define NEED_VARARGS /* Uses ... */ /* comment line for pre-compiled headers */ #include "hack.h" #include "epri.h" + #ifdef WIZARD + #include "edog.h" + #endif #ifdef OVLB *************** *** 282,288 **** info[0] = 0; if (mtmp->mtame) { Strcat(info, ", tame"); #ifdef WIZARD ! if (wizard) Sprintf(eos(info), " (%d)", mtmp->mtame); #endif } else if (mtmp->mpeaceful) Strcat(info, ", peaceful"); --- 285,297 ---- info[0] = 0; if (mtmp->mtame) { Strcat(info, ", tame"); #ifdef WIZARD ! if (wizard) { ! Sprintf(eos(info), " (%d", mtmp->mtame); ! if (!mtmp->isminion) ! Sprintf(eos(info), "; hungry %ld; apport %d", ! EDOG(mtmp)->hungrytime, EDOG(mtmp)->apport); ! Strcat(info, ")"); ! } #endif } else if (mtmp->mpeaceful) Strcat(info, ", peaceful"); *** nethack-3.3.1/src/polyself.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/polyself.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)polyself.c 3.3 2000/07/14 */ /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)polyself.c 3.4 2002/01/15 */ /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 16,22 **** STATIC_DCL void FDECL(polyman, (const char *,const char *)); STATIC_DCL void NDECL(break_armor); STATIC_DCL void FDECL(drop_weapon,(int)); - STATIC_DCL void NDECL(skinback); STATIC_DCL void NDECL(uunstick); STATIC_DCL int FDECL(armor_to_dragon,(int)); STATIC_DCL void NDECL(newman); --- 16,21 ---- *************** *** 48,54 **** u.mh = u.mhmax = 0; u.mtimedone = 0; ! skinback(); u.uundetected = 0; if (sticky) uunstick(); --- 47,53 ---- u.mh = u.mhmax = 0; u.mtimedone = 0; ! skinback(FALSE); u.uundetected = 0; if (sticky) uunstick(); *************** *** 104,116 **** boolean already_polyd = (boolean) Upolyd; /* Some monsters are always of one sex and their sex can't be changed */ ! /* succubi/incubi are handled below */ ! if (u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS && !is_male(youmonst.data) && !is_female(youmonst.data) && !is_neuter(youmonst.data)) flags.female = !flags.female; if (already_polyd) /* poly'd: also change saved sex */ u.mfemale = !u.mfemale; max_rank_sz(); /* [this appears to be superfluous] */ ! if (flags.female && urole.name.f) Strcpy(pl_character, urole.name.f); else Strcpy(pl_character, urole.name.m); --- 103,117 ---- boolean already_polyd = (boolean) Upolyd; /* Some monsters are always of one sex and their sex can't be changed */ ! /* succubi/incubi can change, but are handled below */ ! /* !already_polyd check necessary because is_male() and is_female() ! are true if the player is a priest/priestess */ ! if (!already_polyd || (!is_male(youmonst.data) && !is_female(youmonst.data) && !is_neuter(youmonst.data))) flags.female = !flags.female; if (already_polyd) /* poly'd: also change saved sex */ u.mfemale = !u.mfemale; max_rank_sz(); /* [this appears to be superfluous] */ ! if ((already_polyd ? u.mfemale : flags.female) && urole.name.f) Strcpy(pl_character, urole.name.f); else Strcpy(pl_character, urole.name.m); *************** *** 119,124 **** --- 120,126 ---- if (!already_polyd) { u.umonnum = u.umonster; } else if (u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS) { + flags.female = !flags.female; /* change monster type to match new sex */ u.umonnum = (u.umonnum == PM_SUCCUBUS) ? PM_INCUBUS : PM_SUCCUBUS; set_uasmon(); *************** *** 128,151 **** STATIC_OVL void newman() { ! int tmp, tmp2; ! ! if (!rn2(10)) change_sex(); tmp = u.uhpmax; ! tmp2 = u.ulevel; u.ulevel = u.ulevel + rn1(5, -2); ! if (u.ulevel > 127 || u.ulevel < 1) u.ulevel = 1; if (u.ulevel > MAXULEV) u.ulevel = MAXULEV; if (u.ulevelmax < u.ulevel) u.ulevelmax = u.ulevel; ! adjabil(tmp2, (int)u.ulevel); reset_rndmonst(NON_PM); /* new monster generation criteria */ /* random experience points for the new experience level */ u.uexp = rndexp(); ! /* u.uhpmax * u.ulevel / tmp2: proportionate hit points to new level * -10 and +10: don't apply proportionate HP to 10 of a starting * character's hit points (since a starting character's hit points * are not on the same scale with hit points obtained through level --- 130,163 ---- STATIC_OVL void newman() { ! int tmp, oldlvl; tmp = u.uhpmax; ! oldlvl = u.ulevel; u.ulevel = u.ulevel + rn1(5, -2); ! if (u.ulevel > 127 || u.ulevel < 1) { /* level went below 0? */ ! u.ulevel = oldlvl; /* restore old level in case they lifesave */ ! goto dead; ! } if (u.ulevel > MAXULEV) u.ulevel = MAXULEV; + /* If your level goes down, your peak level goes down by + the same amount so that you can't simply use blessed + full healing to undo the decrease. But if your level + goes up, your peak level does *not* undergo the same + adjustment; you might end up losing out on the chance + to regain some levels previously lost to other causes. */ + if (u.ulevel < oldlvl) u.ulevelmax -= (oldlvl - u.ulevel); if (u.ulevelmax < u.ulevel) u.ulevelmax = u.ulevel; ! if (!rn2(10)) change_sex(); ! ! adjabil(oldlvl, (int)u.ulevel); reset_rndmonst(NON_PM); /* new monster generation criteria */ /* random experience points for the new experience level */ u.uexp = rndexp(); ! /* u.uhpmax * u.ulevel / oldlvl: proportionate hit points to new level * -10 and +10: don't apply proportionate HP to 10 of a starting * character's hit points (since a starting character's hit points * are not on the same scale with hit points obtained through level *************** *** 153,159 **** * 9 - rn2(19): random change of -9 to +9 hit points */ #ifndef LINT ! u.uhpmax = ((u.uhpmax - 10) * (long)u.ulevel / tmp2 + 10) + (9 - rn2(19)); #endif --- 165,171 ---- * 9 - rn2(19): random change of -9 to +9 hit points */ #ifndef LINT ! u.uhpmax = ((u.uhpmax - 10) * (long)u.ulevel / oldlvl + 10) + (9 - rn2(19)); #endif *************** *** 165,171 **** tmp = u.uenmax; #ifndef LINT ! u.uenmax = u.uenmax * (long)u.ulevel / tmp2 + 9 - rn2(19); #endif if (u.uenmax < 0) u.uenmax = 0; #ifndef LINT --- 177,183 ---- tmp = u.uenmax; #ifndef LINT ! u.uenmax = u.uenmax * (long)u.ulevel / oldlvl + 9 - rn2(19); #endif if (u.uenmax < 0) u.uenmax = 0; #ifndef LINT *************** *** 174,180 **** redist_attr(); u.uhunger = rn1(500,500); - newuhs(FALSE); if (Sick) make_sick(0L, (char *) 0, FALSE, SICK_ALL); Stoned = 0; delayed_killer = 0; --- 186,191 ---- *************** *** 183,194 **** --- 194,209 ---- if (u.uhp <= 0) u.uhp = 1; if (u.uhpmax <= 0) u.uhpmax = 1; } else { + dead: /* we come directly here if their experience level went to 0 or less */ Your("new form doesn't seem healthy enough to survive."); killer_format = KILLED_BY_AN; killer="unsuccessful polymorph"; done(DIED); + newuhs(FALSE); + return; /* lifesaved */ } } + newuhs(FALSE); polyman("feel like a new %s!", (flags.female && urace.individual.f) ? urace.individual.f : (urace.individual.m) ? urace.individual.m : urace.noun); *************** *** 202,208 **** } void ! polyself() { char buf[BUFSZ]; int old_light, new_light; --- 217,224 ---- } void ! polyself(forcecontrol) ! boolean forcecontrol; { char buf[BUFSZ]; int old_light, new_light; *************** *** 214,220 **** boolean iswere = (u.ulycn >= LOW_PM || is_were(youmonst.data)); boolean isvamp = (youmonst.data->mlet == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT); ! if(!Polymorph_control && !draconian && !iswere && !isvamp) { if (rn2(20) > ACURR(A_CON)) { You(shudder_for_moment); losehp(rnd(30), "system shock", KILLED_BY_AN); --- 230,236 ---- boolean iswere = (u.ulycn >= LOW_PM || is_were(youmonst.data)); boolean isvamp = (youmonst.data->mlet == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT); ! if(!Polymorph_control && !forcecontrol && !draconian && !iswere && !isvamp) { if (rn2(20) > ACURR(A_CON)) { You(shudder_for_moment); losehp(rnd(30), "system shock", KILLED_BY_AN); *************** *** 224,230 **** } old_light = Upolyd ? emits_light(youmonst.data) : 0; ! if (Polymorph_control) { do { getlin("Become what kind of monster? [type the name]", buf); --- 240,246 ---- } old_light = Upolyd ? emits_light(youmonst.data) : 0; ! if (Polymorph_control || forcecontrol) { do { getlin("Become what kind of monster? [type the name]", buf); *************** *** 388,399 **** You("no longer feel sick."); } if (Slimed) { ! if (mntmp == PM_FIRE_VORTEX || mntmp == PM_FIRE_ELEMENTAL) { pline_The("slime burns away!"); ! Slimed = 0; } else if (mntmp == PM_GREEN_SLIME) { /* do it silently */ ! Slimed = 0; } } if (nohands(youmonst.data)) Glib = 0; --- 404,417 ---- You("no longer feel sick."); } if (Slimed) { ! if (mntmp == PM_FIRE_VORTEX || mntmp == PM_FIRE_ELEMENTAL || mntmp == PM_SALAMANDER) { pline_The("slime burns away!"); ! Slimed = 0L; ! flags.botl = 1; } else if (mntmp == PM_GREEN_SLIME) { /* do it silently */ ! Slimed = 0L; ! flags.botl = 1; } } if (nohands(youmonst.data)) Glib = 0; *************** *** 428,434 **** } if (uskin && mntmp != armor_to_dragon(uskin->otyp)) ! skinback(); break_armor(); drop_weapon(1); if (hides_under(youmonst.data)) --- 446,452 ---- } if (uskin && mntmp != armor_to_dragon(uskin->otyp)) ! skinback(FALSE); break_armor(); drop_weapon(1); if (hides_under(youmonst.data)) *************** *** 470,477 **** pline(use_thec,monsterc,"spit venom"); if (youmonst.data->mlet == S_NYMPH) pline(use_thec,monsterc,"remove an iron ball"); ! if (youmonst.data->mlet == S_UMBER) ! pline(use_thec,monsterc,"confuse monsters"); if (is_hider(youmonst.data)) pline(use_thec,monsterc,"hide"); if (is_were(youmonst.data)) --- 488,495 ---- pline(use_thec,monsterc,"spit venom"); if (youmonst.data->mlet == S_NYMPH) pline(use_thec,monsterc,"remove an iron ball"); ! if (attacktype(youmonst.data, AT_GAZE)) ! pline(use_thec,monsterc,"gaze at monsters"); if (is_hider(youmonst.data)) pline(use_thec,monsterc,"hide"); if (is_were(youmonst.data)) *************** *** 549,559 **** } if ((otmp = uarmc) != 0) { if(otmp->oartifact) { ! Your("cloak falls off!"); (void) Cloak_off(); dropx(otmp); } else { ! Your("cloak tears apart!"); (void) Cloak_off(); useup(otmp); } --- 567,577 ---- } if ((otmp = uarmc) != 0) { if(otmp->oartifact) { ! Your("%s falls off!", cloak_simple_name(otmp)); (void) Cloak_off(); dropx(otmp); } else { ! Your("%s tears apart!", cloak_simple_name(otmp)); (void) Cloak_off(); useup(otmp); } *************** *** 573,580 **** } if ((otmp = uarmc) != 0) { if (is_whirly(youmonst.data)) ! Your("cloak falls, unsupported!"); ! else You("shrink out of your cloak!"); (void) Cloak_off(); dropx(otmp); } --- 591,598 ---- } if ((otmp = uarmc) != 0) { if (is_whirly(youmonst.data)) ! Your("%s falls, unsupported!", cloak_simple_name(otmp)); ! else You("shrink out of your %s!", cloak_simple_name(otmp)); (void) Cloak_off(); dropx(otmp); } *************** *** 628,633 **** --- 646,653 ---- int alone; { struct obj *otmp; + struct obj *otmp2; + if ((otmp = uwep) != 0) { /* !alone check below is currently superfluous but in the * future it might not be so if there are monsters which cannot *************** *** 638,647 **** if (alone) You("find you must drop your weapon%s!", u.twoweap ? "s" : ""); uwepgone(); if (!wep->cursed || wep->otyp != LOADSTONE) dropx(otmp); ! untwoweapon(); } } } --- 658,673 ---- if (alone) You("find you must drop your weapon%s!", u.twoweap ? "s" : ""); + otmp2 = u.twoweap ? uswapwep : 0; uwepgone(); if (!wep->cursed || wep->otyp != LOADSTONE) dropx(otmp); ! if (otmp2 != 0) { ! uswapwepgone(); ! if (!otmp2->cursed || otmp2->otyp != LOADSTONE) ! dropx(otmp2); ! } ! untwoweapon(); } } } *************** *** 714,720 **** otmp = mksobj(u.umonnum==PM_COBRA ? BLINDING_VENOM : ACID_VENOM, TRUE, FALSE); otmp->spe = 1; /* to indicate it's yours */ ! throwit(otmp, 0L); return(1); } --- 740,746 ---- otmp = mksobj(u.umonnum==PM_COBRA ? BLINDING_VENOM : ACID_VENOM, TRUE, FALSE); otmp->spe = 1; /* to indicate it's yours */ ! throwit(otmp, 0L, FALSE); return(1); } *************** *** 806,814 **** --- 832,847 ---- deltrap(ttmp); if (Invisible) newsym(u.ux, u.uy); return 1; + case ROLLING_BOULDER_TRAP: + You("spin a web, jamming the trigger."); + deltrap(ttmp); + if (Invisible) newsym(u.ux, u.uy); + return(1); case ARROW_TRAP: case DART_TRAP: case BEAR_TRAP: + case ROCKTRAP: + case FIRE_TRAP: case LANDMINE: case SLP_GAS_TRAP: case RUST_TRAP: *************** *** 816,822 **** case ANTI_MAGIC: case POLY_TRAP: You("have triggered a trap!"); ! dotrap(ttmp); return(1); default: impossible("Webbing over trap type %d?", ttmp->ttyp); --- 849,855 ---- case ANTI_MAGIC: case POLY_TRAP: You("have triggered a trap!"); ! dotrap(ttmp, 0); return(1); default: impossible("Webbing over trap type %d?", ttmp->ttyp); *************** *** 849,863 **** } int ! doconfuse() { register struct monst *mtmp; int looked = 0; char qbuf[QBUFSZ]; if (Blind) { ! You_cant("see anything to gaze at."); ! return 0; } if (u.uen < 15) { You("lack the energy to use your special gaze!"); --- 882,910 ---- } int ! dogaze() { register struct monst *mtmp; int looked = 0; char qbuf[QBUFSZ]; + int i; + uchar adtyp = 0; + + for (i = 0; i < NATTK; i++) { + if(youmonst.data->mattk[i].aatyp == AT_GAZE) { + adtyp = youmonst.data->mattk[i].adtyp; + break; + } + } + if (adtyp != AD_CONF && adtyp != AD_FIRE) { + impossible("gaze attack %d?", adtyp); + return 0; + } + if (Blind) { ! You_cant("see anything to gaze at."); ! return 0; } if (u.uen < 15) { You("lack the energy to use your special gaze!"); *************** *** 868,874 **** for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; ! if (canseemon(mtmp)) { looked++; if (Invis && !perceives(mtmp->data)) pline("%s seems not to notice your gaze.", Monnam(mtmp)); --- 915,921 ---- for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; ! if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)) { looked++; if (Invis && !perceives(mtmp->data)) pline("%s seems not to notice your gaze.", Monnam(mtmp)); *************** *** 884,890 **** } else { if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination) { ! Sprintf(qbuf, "Really confuse %s?", mon_nam(mtmp)); if (yn(qbuf) != 'y') continue; setmangry(mtmp); } --- 931,939 ---- } else { if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination) { ! Sprintf(qbuf, "Really %s %s?", ! (adtyp == AD_CONF) ? "confuse" : "attack", ! mon_nam(mtmp)); if (yn(qbuf) != 'y') continue; setmangry(mtmp); } *************** *** 893,907 **** looked--; continue; } ! if (!mon_reflects(mtmp,"Your gaze is reflected by %s %s.")){ if (!mtmp->mconf) Your("gaze confuses %s!", mon_nam(mtmp)); else pline("%s is getting more and more confused.", ! Monnam(mtmp)); mtmp->mconf = 1; } ! if ((mtmp->data==&mons[PM_FLOATING_EYE]) && !mtmp->mcan) { if (!Free_action) { You("are frozen by %s gaze!", s_suffix(mon_nam(mtmp))); --- 942,978 ---- looked--; continue; } ! /* No reflection check for consistency with when a monster ! * gazes at *you*--only medusa gaze gets reflected then. ! */ ! if (adtyp == AD_CONF) { if (!mtmp->mconf) Your("gaze confuses %s!", mon_nam(mtmp)); else pline("%s is getting more and more confused.", ! Monnam(mtmp)); mtmp->mconf = 1; + } else if (adtyp == AD_FIRE) { + int dmg = d(2,6); + You("attack %s with a fiery gaze!", mon_nam(mtmp)); + if (resists_fire(mtmp)) { + pline_The("fire doesn't burn %s!", mon_nam(mtmp)); + dmg = 0; + } + if((int) u.ulevel > rn2(20)) + (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE); + if((int) u.ulevel > rn2(20)) + (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); + if((int) u.ulevel > rn2(25)) + (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); + if (dmg && !DEADMONSTER(mtmp)) mtmp->mhp -= dmg; + if (mtmp->mhp <= 0) killed(mtmp); } ! /* For consistency with passive() in uhitm.c, this only ! * affects you if the monster is still alive. ! */ ! if (!DEADMONSTER(mtmp) && ! (mtmp->data==&mons[PM_FLOATING_EYE]) && !mtmp->mcan) { if (!Free_action) { You("are frozen by %s gaze!", s_suffix(mon_nam(mtmp))); *************** *** 914,920 **** You("stiffen momentarily under %s gaze.", s_suffix(mon_nam(mtmp))); } ! if ((mtmp->data == &mons[PM_MEDUSA]) && !mtmp->mcan) { pline( "Gazing at the awake %s is not a very good idea.", l_monnam(mtmp)); --- 985,997 ---- You("stiffen momentarily under %s gaze.", s_suffix(mon_nam(mtmp))); } ! /* Technically this one shouldn't affect you at all because ! * the Medusa gaze is an active monster attack that only ! * works on the monster's turn, but for it to *not* have an ! * effect would be too weird. ! */ ! if (!DEADMONSTER(mtmp) && ! (mtmp->data == &mons[PM_MEDUSA]) && !mtmp->mcan) { pline( "Gazing at the awake %s is not a very good idea.", l_monnam(mtmp)); *************** *** 996,1006 **** u.ustuck = 0; } ! STATIC_OVL void ! skinback() { if (uskin) { ! Your("skin returns to its original form."); uarm = uskin; uskin = (struct obj *)0; /* undo save/restore hack */ --- 1073,1084 ---- u.ustuck = 0; } ! void ! skinback(silently) ! boolean silently; { if (uskin) { ! if (!silently) Your("skin returns to its original form."); uarm = uskin; uskin = (struct obj *)0; /* undo save/restore hack */ *************** *** 1019,1058 **** static NEARDATA const char *humanoid_parts[] = { "arm", "eye", "face", "finger", "fingertip", "foot", "hand", "handed", "head", "leg", ! "light headed", "neck", "spine", "toe", "hair", "blood", "lung"}, *jelly_parts[] = { "pseudopod", "dark spot", "front", "pseudopod extension", "pseudopod extremity", "pseudopod root", "grasp", "grasped", "cerebral area", "lower pseudopod", "viscous", "middle", "surface", ! "pseudopod extremity", "ripples", "juices", "surface" }, *animal_parts[] = { "forelimb", "eye", "face", "foreclaw", "claw tip", "rear claw", "foreclaw", "clawed", "head", "rear limb", "light headed", "neck", "spine", "rear claw tip", ! "fur", "blood", "lung" }, *horse_parts[] = { "foreleg", "eye", "face", "forehoof", "hoof tip", "rear hoof", "foreclaw", "hooved", "head", "rear leg", "light headed", "neck", "backbone", "rear hoof tip", ! "mane", "blood", "lung" }, *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle", "tentacle tip", "lower appendage", "tentacle", "tentacled", "body", "lower tentacle", "rotational", "equator", "body", ! "lower tentacle tip", "cilia", "life force", "retina" }, *fungus_parts[] = { "mycelium", "visual area", "front", "hypha", "hypha", "root", "strand", "stranded", "cap area", "rhizome", "sporulated", "stalk", "root", "rhizome tip", ! "spores", "juices", "gill" }, *vortex_parts[] = { "region", "eye", "front", "minor current", "minor current", "lower current", "swirl", "swirled", "central core", "lower current", "addled", "center", ! "currents", "edge", "currents", "life force", "center" }, *snake_parts[] = { "vestigial limb", "eye", "face", "large scale", "large scale tip", "rear region", "scale gap", "scale gapped", "head", "rear region", "light headed", "neck", "length", ! "rear scale", "scales", "blood", "lung" }, *fish_parts[] = { "fin", "eye", "premaxillary", "pelvic axillary", "pelvic fin", "anal fin", "pectoral fin", "finned", "head", "peduncle", "played out", "gills", "dorsal fin", "caudal fin", ! "scales", "blood", "gill" }; /* claw attacks are overloaded in mons[]; most humanoids with such attacks should still reference hands rather than claws */ static const char not_claws[] = { --- 1097,1140 ---- static NEARDATA const char *humanoid_parts[] = { "arm", "eye", "face", "finger", "fingertip", "foot", "hand", "handed", "head", "leg", ! "light headed", "neck", "spine", "toe", "hair", ! "blood", "lung", "nose", "stomach"}, *jelly_parts[] = { "pseudopod", "dark spot", "front", "pseudopod extension", "pseudopod extremity", "pseudopod root", "grasp", "grasped", "cerebral area", "lower pseudopod", "viscous", "middle", "surface", ! "pseudopod extremity", "ripples", "juices", ! "surface", "sensor", "stomach" }, *animal_parts[] = { "forelimb", "eye", "face", "foreclaw", "claw tip", "rear claw", "foreclaw", "clawed", "head", "rear limb", "light headed", "neck", "spine", "rear claw tip", ! "fur", "blood", "lung", "nose", "stomach" }, *horse_parts[] = { "foreleg", "eye", "face", "forehoof", "hoof tip", "rear hoof", "foreclaw", "hooved", "head", "rear leg", "light headed", "neck", "backbone", "rear hoof tip", ! "mane", "blood", "lung", "nose", "stomach"}, *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle", "tentacle tip", "lower appendage", "tentacle", "tentacled", "body", "lower tentacle", "rotational", "equator", "body", ! "lower tentacle tip", "cilia", "life force", "retina", ! "olfactory nerve", "interior" }, *fungus_parts[] = { "mycelium", "visual area", "front", "hypha", "hypha", "root", "strand", "stranded", "cap area", "rhizome", "sporulated", "stalk", "root", "rhizome tip", ! "spores", "juices", "gill", "gill", "interior" }, *vortex_parts[] = { "region", "eye", "front", "minor current", "minor current", "lower current", "swirl", "swirled", "central core", "lower current", "addled", "center", ! "currents", "edge", "currents", "life force", ! "center", "leading edge", "interior" }, *snake_parts[] = { "vestigial limb", "eye", "face", "large scale", "large scale tip", "rear region", "scale gap", "scale gapped", "head", "rear region", "light headed", "neck", "length", ! "rear scale", "scales", "blood", "lung", "forked tongue", "stomach" }, *fish_parts[] = { "fin", "eye", "premaxillary", "pelvic axillary", "pelvic fin", "anal fin", "pectoral fin", "finned", "head", "peduncle", "played out", "gills", "dorsal fin", "caudal fin", ! "scales", "blood", "gill", "nostril", "stomach" }; /* claw attacks are overloaded in mons[]; most humanoids with such attacks should still reference hands rather than claws */ static const char not_claws[] = { *************** *** 1073,1080 **** --- 1155,1170 ---- mptr != &mons[PM_INCUBUS] && mptr != &mons[PM_SUCCUBUS]) return part == HAND ? "claw" : "clawed"; } + if ((mptr == &mons[PM_MUMAK] || mptr == &mons[PM_MASTODON]) && + part == NOSE) + return "trunk"; if (mptr == &mons[PM_SHARK] && part == HAIR) return "skin"; /* sharks don't have scales */ + if (mptr == &mons[PM_JELLYFISH] && (part == ARM || part == FINGER || + part == HAND || part == FOOT || part == TOE)) + return "tentacle"; + if (mptr == &mons[PM_FLOATING_EYE] && part == EYE) + return "cornea"; if (humanoid(mptr) && (part == ARM || part == FINGER || part == FINGERTIP || part == HAND || part == HANDED)) *************** *** 1084,1090 **** return horse_parts[part]; if (mptr->mlet == S_EEL && mptr != &mons[PM_JELLYFISH]) return fish_parts[part]; ! if (slithy(mptr)) return snake_parts[part]; if (mptr->mlet == S_EYE) return sphere_parts[part]; --- 1174,1180 ---- return horse_parts[part]; if (mptr->mlet == S_EEL && mptr != &mons[PM_JELLYFISH]) return fish_parts[part]; ! if (slithy(mptr) || (mptr->mlet == S_DRAGON && part == HAIR)) return snake_parts[part]; if (mptr->mlet == S_EYE) return sphere_parts[part]; *** nethack-3.3.1/src/potion.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/potion.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)potion.c 3.3 2000/06/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)potion.c 3.4 2002/03/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 83,89 **** Hallucination ? "less wobbly" : "a bit steadier"); } if (xtime && !old) { ! if (talk) You("stagger..."); } if ((!xtime && old) || (xtime && !old)) flags.botl = TRUE; --- 83,96 ---- Hallucination ? "less wobbly" : "a bit steadier"); } if (xtime && !old) { ! if (talk) { ! #ifdef STEED ! if (u.usteed) ! You("wobble in the saddle."); ! else ! #endif ! You("%s...", stagger(youmonst.data, "stagger")); ! } } if ((!xtime && old) || (xtime && !old)) flags.botl = TRUE; *************** *** 157,190 **** boolean talk; { long old = Blinded; ! boolean changed = FALSE; if (u.usleep) talk = FALSE; ! if (!xtime && old && !Blindfolded && haseyes(youmonst.data)) { if (talk) { if (Hallucination) pline("Far out! Everything is all cosmic again!"); ! else You("can see again."); } - changed = TRUE; } ! if (xtime && !old && !Blindfolded && haseyes(youmonst.data)) { if (talk) { if (Hallucination) ! pline("Oh, bummer! Everything is dark! Help!"); else ! pline("A cloud of darkness falls upon you."); } - changed = TRUE; - /* Before the hero goes blind, set the ball&chain variables. */ if (Punished) set_bc(0); } set_itimeout(&Blinded, xtime); ! if (changed) { flags.botl = 1; ! vision_full_recalc = 1; if (Blind_telepat || Infravision) see_monsters(); } } --- 164,240 ---- boolean talk; { long old = Blinded; ! boolean u_could_see, can_see_now; ! int eyecnt; ! char buf[BUFSZ]; ! static const char ! vismsg[] = "vision seems to %s for a moment but is %s now.", ! eyemsg[] = "%s momentarily %s."; ! ! /* we need to probe ahead in case the Eyes of the Overworld ! are or will be overriding blindness */ ! u_could_see = !Blind; ! Blinded = xtime ? 1L : 0L; ! can_see_now = !Blind; ! Blinded = old; /* restore */ if (u.usleep) talk = FALSE; ! if (can_see_now && !u_could_see) { /* regaining sight */ if (talk) { if (Hallucination) pline("Far out! Everything is all cosmic again!"); ! else ! You("can see again."); ! } ! } else if (old && !xtime) { ! /* clearing temporary blindness without toggling blindness */ ! if (talk) { ! if (!haseyes(youmonst.data)) { ! strange_feeling((struct obj *)0, (char *)0); ! } else if (Blindfolded) { ! Strcpy(buf, body_part(EYE)); ! eyecnt = eyecount(youmonst.data); ! Your(eyemsg, (eyecnt == 1) ? buf : makeplural(buf), ! (eyecnt == 1) ? "itches" : "itch"); ! } else { /* Eyes of the Overworld */ ! Your(vismsg, "brighten", ! Hallucination ? "sadder" : "normal"); ! } } } ! ! if (u_could_see && !can_see_now) { /* losing sight */ if (talk) { if (Hallucination) ! pline("Oh, bummer! Everything is dark! Help!"); else ! pline("A cloud of darkness falls upon you."); } /* Before the hero goes blind, set the ball&chain variables. */ if (Punished) set_bc(0); + } else if (!old && xtime) { + /* setting temporary blindness without toggling blindness */ + if (talk) { + if (!haseyes(youmonst.data)) { + strange_feeling((struct obj *)0, (char *)0); + } else if (Blindfolded) { + Strcpy(buf, body_part(EYE)); + eyecnt = eyecount(youmonst.data); + Your(eyemsg, (eyecnt == 1) ? buf : makeplural(buf), + (eyecnt == 1) ? "twitches" : "twitch"); + } else { /* Eyes of the Overworld */ + Your(vismsg, "dim", + Hallucination ? "happier" : "normal"); + } + } } + set_itimeout(&Blinded, xtime); ! ! if (u_could_see ^ can_see_now) { /* one or the other but not both */ flags.botl = 1; ! vision_full_recalc = 1; /* blindness just got toggled */ if (Blind_telepat || Infravision) see_monsters(); } } *************** *** 352,358 **** break; } else { pline("Wow! This makes you feel %s!", ! (otmp->blessed) ? "great" : "good"); i = rn2(A_MAX); /* start at a random point */ for (ii = 0; ii < A_MAX; ii++) { lim = AMAX(i); --- 402,410 ---- break; } else { pline("Wow! This makes you feel %s!", ! (otmp->blessed) ? ! (unfixable_trouble_count(FALSE) ? "better" : "great") ! : "good"); i = rn2(A_MAX); /* start at a random point */ for (ii = 0; ii < A_MAX; ii++) { lim = AMAX(i); *************** *** 517,523 **** } case POT_PARALYSIS: if (Free_action) ! You("stiffen momentarily."); else { if (Levitation||Is_airlevel(&u.uz)||Is_waterlevel(&u.uz)) You("are motionlessly suspended."); --- 569,575 ---- } case POT_PARALYSIS: if (Free_action) ! You("stiffen momentarily."); else { if (Levitation||Is_airlevel(&u.uz)||Is_waterlevel(&u.uz)) You("are motionlessly suspended."); *************** *** 533,539 **** exercise(A_DEX, FALSE); } break; ! case POT_SLEEPING: if(Sleep_resistance || Free_action) You("yawn."); else { --- 585,591 ---- exercise(A_DEX, FALSE); } break; ! case POT_SLEEPING: if(Sleep_resistance || Free_action) You("yawn."); else { *************** *** 548,554 **** if (Detect_monsters) nothing++; unkn++; ! incr_itimeout(&HDetect_monsters, 20+rnd(40)); for (x = 1; x < COLNO; x++) { for (y = 0; y < ROWNO; y++) { if (levl[x][y].glyph == GLYPH_INVISIBLE) { --- 600,611 ---- if (Detect_monsters) nothing++; unkn++; ! /* after a while, repeated uses become less effective */ ! if (HDetect_monsters >= 300L) ! i = 1; ! else ! i = rn1(40,21); ! incr_itimeout(&HDetect_monsters, i); for (x = 1; x < COLNO; x++) { for (y = 0; y < ROWNO; y++) { if (levl[x][y].glyph == GLYPH_INVISIBLE) { *************** *** 577,584 **** if (otmp->blessed) { pline("(But in fact it was mildly stale %s juice.)", pl_fruit); ! if (!Role_if(PM_HEALER)) ! losehp(1, "mildly contaminated potion", KILLED_BY_AN); } else { if(Poison_resistance) pline( --- 634,647 ---- if (otmp->blessed) { pline("(But in fact it was mildly stale %s juice.)", pl_fruit); ! if (!Role_if(PM_HEALER)) { ! if (otmp->corpsenm) ! losehp(1, ! "mildly contaminated tap water", KILLED_BY); ! else ! losehp(1, ! "mildly contaminated potion", KILLED_BY_AN); ! } } else { if(Poison_resistance) pline( *************** *** 595,603 **** Poison_resistance ? -1 : -rn1(4,3), TRUE); } ! if(!Poison_resistance) losehp(rnd(10)+5*!!(otmp->cursed), "contaminated potion", KILLED_BY_AN); exercise(A_CON, FALSE); } } --- 658,671 ---- Poison_resistance ? -1 : -rn1(4,3), TRUE); } ! if(!Poison_resistance) { ! if (otmp->corpsenm) ! losehp(rnd(10)+5*!!(otmp->cursed), ! "contaminated tap water", KILLED_BY); ! else losehp(rnd(10)+5*!!(otmp->cursed), "contaminated potion", KILLED_BY_AN); + } exercise(A_CON, FALSE); } } *************** *** 622,627 **** --- 690,697 ---- if(otmp->cursed) { pline("Ulch! That potion tasted foul!"); unkn++; + } else if (Fixed_abil) { + nothing++; } else { /* If blessed, increase all; if not, try up to */ int itmp; /* 6 times to find one which can be increased. */ i = -1; /* increment to 0 */ *************** *** 636,646 **** } break; case POT_SPEED: ! if(Wounded_legs && !otmp->cursed) { heal_legs(); unkn++; break; ! } /* and fall through */ case SPE_HASTE_SELF: if(!Very_fast) /* wwf@doe.carleton.ca */ You("are suddenly moving %sfaster.", --- 706,720 ---- } break; case POT_SPEED: ! if(Wounded_legs && !otmp->cursed ! #ifdef STEED ! && !u.usteed /* heal_legs() would heal steeds legs */ ! #endif ! ) { heal_legs(); unkn++; break; ! } /* and fall through */ case SPE_HASTE_SELF: if(!Very_fast) /* wwf@doe.carleton.ca */ You("are suddenly moving %sfaster.", *************** *** 657,663 **** if(Blind) nothing++; make_blinded(itimeout_incr(Blinded, rn1(200, 250 - 125 * bcsign(otmp))), ! TRUE); break; case POT_GAIN_LEVEL: if (otmp->cursed) { --- 731,737 ---- if(Blind) nothing++; make_blinded(itimeout_incr(Blinded, rn1(200, 250 - 125 * bcsign(otmp))), ! (boolean)!Blind); break; case POT_GAIN_LEVEL: if (otmp->cursed) { *************** *** 706,717 **** exercise(A_CON, TRUE); exercise(A_STR, TRUE); break; ! case POT_FULL_HEALING: You_feel("completely healed."); healup(400, 4+4*bcsign(otmp), !otmp->cursed, TRUE); /* Restore one lost level if blessed */ ! if (otmp->blessed && (u.ulevel < u.ulevelmax)) ! pluslvl(FALSE); make_hallucinated(0L,TRUE,0L); exercise(A_STR, TRUE); exercise(A_CON, TRUE); --- 780,795 ---- exercise(A_CON, TRUE); exercise(A_STR, TRUE); break; ! case POT_FULL_HEALING: You_feel("completely healed."); healup(400, 4+4*bcsign(otmp), !otmp->cursed, TRUE); /* Restore one lost level if blessed */ ! if (otmp->blessed && u.ulevel < u.ulevelmax) { ! /* when multiple levels have been lost, drinking ! multiple potions will only get half of them back */ ! u.ulevelmax -= 1; ! pluslvl(FALSE); ! } make_hallucinated(0L,TRUE,0L); exercise(A_STR, TRUE); exercise(A_CON, TRUE); *************** *** 744,749 **** --- 822,828 ---- incr_itimeout(&HLevitation, rn1(50,250)); HLevitation |= I_SPECIAL; } else incr_itimeout(&HLevitation, rn1(140,10)); + spoteffects(FALSE); /* for sinks */ break; case POT_GAIN_ENERGY: /* M. Stephenson */ { register int num; *************** *** 786,801 **** pline("This tastes %s.", Hallucination ? "tangy" : "sour"); else { pline("This burns%s!", otmp->blessed ? " a little" : ! otmp->cursed ? " a lot" : ""); losehp(d(otmp->cursed ? 2 : 1, otmp->blessed ? 4 : 8), "potion of acid", KILLED_BY_AN); exercise(A_CON, FALSE); } if (Stoned) fix_petrification(); break; case POT_POLYMORPH: You_feel("a little %s.", Hallucination ? "normal" : "strange"); ! if (!Unchanging) polyself(); break; default: impossible("What a funny potion! (%u)", otmp->otyp); --- 865,881 ---- pline("This tastes %s.", Hallucination ? "tangy" : "sour"); else { pline("This burns%s!", otmp->blessed ? " a little" : ! otmp->cursed ? " a lot" : " like acid"); losehp(d(otmp->cursed ? 2 : 1, otmp->blessed ? 4 : 8), "potion of acid", KILLED_BY_AN); exercise(A_CON, FALSE); } if (Stoned) fix_petrification(); + unkn++; /* holy/unholy water can burn like acid too */ break; case POT_POLYMORPH: You_feel("a little %s.", Hallucination ? "normal" : "strange"); ! if (!Unchanging) polyself(FALSE); break; default: impossible("What a funny potion! (%u)", otmp->otyp); *************** *** 829,835 **** register struct obj *obj; register const char *txt; { ! if(flags.beginner) You("have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "strange"); else --- 909,915 ---- register struct obj *obj; register const char *txt; { ! if (flags.beginner || !txt) You("have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "strange"); else *************** *** 848,860 **** "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial" }; void potionhit(mon, obj, your_fault) register struct monst *mon; register struct obj *obj; boolean your_fault; { ! register const char *botlnam = bottlenames[rn2(SIZE(bottlenames))]; boolean isyou = (mon == &youmonst); int distance; --- 928,947 ---- "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial" }; + + const char * + bottlename() + { + return bottlenames[rn2(SIZE(bottlenames))]; + } + void potionhit(mon, obj, your_fault) register struct monst *mon; register struct obj *obj; boolean your_fault; { ! register const char *botlnam = bottlename(); boolean isyou = (mon == &youmonst); int distance; *************** *** 886,892 **** /* oil doesn't instantly evaporate */ if (obj->otyp != POT_OIL && cansee(mon->mx,mon->my)) ! pline("%s evaporates.", The(xname(obj))); if (isyou) { switch (obj->otyp) { --- 973,979 ---- /* oil doesn't instantly evaporate */ if (obj->otyp != POT_OIL && cansee(mon->mx,mon->my)) ! pline("%s.", Tobjnam(obj, "evaporate")); if (isyou) { switch (obj->otyp) { *************** *** 896,902 **** break; case POT_POLYMORPH: You_feel("a little %s.", Hallucination ? "normal" : "strange"); ! if (!Unchanging && !Antimagic) polyself(); break; case POT_ACID: if (!Acid_resistance) { --- 983,989 ---- break; case POT_POLYMORPH: You_feel("a little %s.", Hallucination ? "normal" : "strange"); ! if (!Unchanging && !Antimagic) polyself(FALSE); break; case POT_ACID: if (!Acid_resistance) { *************** *** 930,936 **** case POT_SICKNESS: if (mon->data == &mons[PM_PESTILENCE]) goto do_healing; if (dmgtype(mon->data, AD_DISE) || ! dmgtype(mon->data, AD_PEST) || resists_poison(mon)) { if (canseemon(mon)) pline("%s looks unharmed.", Monnam(mon)); --- 1017,1023 ---- case POT_SICKNESS: if (mon->data == &mons[PM_PESTILENCE]) goto do_healing; if (dmgtype(mon->data, AD_DISE) || ! dmgtype(mon->data, AD_PEST) || /* won't happen, see prior goto */ resists_poison(mon)) { if (canseemon(mon)) pline("%s looks unharmed.", Monnam(mon)); *************** *** 971,977 **** break; case POT_SPEED: angermon = FALSE; ! mon_adjust_speed(mon, 1); break; case POT_BLINDNESS: if(haseyes(mon->data)) { --- 1058,1064 ---- break; case POT_SPEED: angermon = FALSE; ! mon_adjust_speed(mon, 1, obj); break; case POT_BLINDNESS: if(haseyes(mon->data)) { *************** *** 986,992 **** if (is_undead(mon->data) || is_demon(mon->data) || is_were(mon->data)) { if (obj->blessed) { ! pline("%s shrieks in pain!", Monnam(mon)); mon->mhp -= d(2,6); /* should only be by you */ if (mon->mhp < 1) killed(mon); --- 1073,1080 ---- if (is_undead(mon->data) || is_demon(mon->data) || is_were(mon->data)) { if (obj->blessed) { ! pline("%s %s in pain!", Monnam(mon), ! is_silent(mon->data) ? "writhes" : "shrieks"); mon->mhp -= d(2,6); /* should only be by you */ if (mon->mhp < 1) killed(mon); *************** *** 1019,1025 **** break; case POT_ACID: if (!resists_acid(mon) && !resist(mon, POTION_CLASS, 0, NOTELL)) { ! pline("%s shrieks in pain!", Monnam(mon)); mon->mhp -= d(obj->cursed ? 2 : 1, obj->blessed ? 4 : 8); if (mon->mhp < 1) { if (your_fault) --- 1107,1114 ---- break; case POT_ACID: if (!resists_acid(mon) && !resist(mon, POTION_CLASS, 0, NOTELL)) { ! pline("%s %s in pain!", Monnam(mon), ! is_silent(mon->data) ? "writhes" : "shrieks"); mon->mhp -= d(obj->cursed ? 2 : 1, obj->blessed ? 4 : 8); if (mon->mhp < 1) { if (your_fault) *************** *** 1048,1054 **** } /* Note: potionbreathe() does its own docall() */ ! if (distance==0 || ((distance < 3) && rn2(5))) potionbreathe(obj); else if (obj->dknown && !objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname && cansee(mon->mx,mon->my)) --- 1137,1144 ---- } /* Note: potionbreathe() does its own docall() */ ! if ((distance==0 || ((distance < 3) && rn2(5))) && ! (!breathless(youmonst.data) || haseyes(youmonst.data))) potionbreathe(obj); else if (obj->dknown && !objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname && cansee(mon->mx,mon->my)) *************** *** 1068,1073 **** --- 1158,1164 ---- obfree(obj, (struct obj *)0); } + /* vapors are inhaled or get in your eyes */ void potionbreathe(obj) register struct obj *obj; *************** *** 1078,1084 **** case POT_RESTORE_ABILITY: case POT_GAIN_ABILITY: if(obj->cursed) { ! pline("Ulch! That potion smells terrible!"); break; } else { i = rn2(A_MAX); /* start at a random point */ --- 1169,1182 ---- case POT_RESTORE_ABILITY: case POT_GAIN_ABILITY: if(obj->cursed) { ! if (!breathless(youmonst.data)) ! pline("Ulch! That potion smells terrible!"); ! else if (haseyes(youmonst.data)) { ! int numeyes = eyecount(youmonst.data); ! Your("%s sting%s!", ! (numeyes == 1) ? body_part(EYE) : makeplural(body_part(EYE)), ! (numeyes == 1) ? "s" : ""); ! } break; } else { i = rn2(A_MAX); /* start at a random point */ *************** *** 1136,1151 **** break; case POT_PARALYSIS: kn++; ! if (!Free_action) { pline("%s seems to be holding you.", Something); nomul(-rnd(5)); nomovemsg = You_can_move_again; exercise(A_DEX, FALSE); ! } else You("stiffen momentarily."); break; case POT_SLEEPING: kn++; ! if (!Free_action && !Sleep_resistance) { You_feel("rather tired."); nomul(-rnd(5)); nomovemsg = You_can_move_again; --- 1234,1249 ---- break; case POT_PARALYSIS: kn++; ! if (!Free_action) { pline("%s seems to be holding you.", Something); nomul(-rnd(5)); nomovemsg = You_can_move_again; exercise(A_DEX, FALSE); ! } else You("stiffen momentarily."); break; case POT_SLEEPING: kn++; ! if (!Free_action && !Sleep_resistance) { You_feel("rather tired."); nomul(-rnd(5)); nomovemsg = You_can_move_again; *************** *** 1163,1168 **** --- 1261,1267 ---- pline("It suddenly gets dark."); } make_blinded(itimeout_incr(Blinded, rnd(5)), FALSE); + if (!Blind && !u.usleep) Your(vision_clears); break; case POT_WATER: if(u.umonnum == PM_GREMLIN) { *************** *** 1175,1180 **** --- 1274,1280 ---- else if (obj->cursed && !Upolyd) you_were(); } + break; case POT_ACID: case POT_POLYMORPH: exercise(A_CON, FALSE); *************** *** 1232,1238 **** case POT_GAIN_ENERGY: return POT_FULL_HEALING; } ! case POT_FULL_HEALING: switch (o2->otyp) { case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: --- 1332,1338 ---- case POT_GAIN_ENERGY: return POT_FULL_HEALING; } ! case POT_FULL_HEALING: switch (o2->otyp) { case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: *************** *** 1307,1313 **** if (snuff_lit(obj)) return(TRUE); if (obj->greased) { ! grease_protect(obj,(char *)0,FALSE,&youmonst); return(FALSE); } (void) Shk_Your(Your_buf, obj); --- 1407,1413 ---- if (snuff_lit(obj)) return(TRUE); if (obj->greased) { ! grease_protect(obj,(char *)0,&youmonst); return(FALSE); } (void) Shk_Your(Your_buf, obj); *************** *** 1359,1367 **** ) { if (!Blind) { boolean oq1 = obj->quan == 1L; ! pline_The("scroll%s fade%s.", ! oq1 ? "" : "s", ! oq1 ? "s" : ""); } if(obj->unpaid && costly_spot(u.ux, u.uy)) { You("erase it, you pay for it."); --- 1459,1466 ---- ) { if (!Blind) { boolean oq1 = obj->quan == 1L; ! pline_The("scroll%s %s.", ! oq1 ? "" : "s", otense(obj, "fade")); } if(obj->unpaid && costly_spot(u.ux, u.uy)) { You("erase it, you pay for it."); *************** *** 1382,1388 **** if (!Blind) { boolean oq1 = obj->quan == 1L; pline_The("spellbook%s fade%s.", ! oq1 ? "" : "s", oq1 ? "s" : ""); } if(obj->unpaid && costly_spot(u.ux, u.uy)) { You("erase it, you pay for it."); --- 1481,1487 ---- if (!Blind) { boolean oq1 = obj->quan == 1L; pline_The("spellbook%s fade%s.", ! oq1 ? "" : "s", otense(obj, "fade")); } if(obj->unpaid && costly_spot(u.ux, u.uy)) { You("erase it, you pay for it."); *************** *** 1402,1407 **** --- 1501,1507 ---- dodip() { register struct obj *potion, *obj; + struct obj *singlepotion; const char *tmp; uchar here; char allowall[2]; *************** *** 1500,1515 **** if (obj->otyp == potion->otyp || /* both POT_POLY */ obj->otyp == WAN_POLYMORPH || obj->otyp == SPE_POLYMORPH || obj_resists(obj->otyp == POT_POLYMORPH ? potion : obj, 5, 95)) { pline(nothing_happens); } else { /* KMH, conduct */ u.uconduct.polypiles++; ! poly_obj(obj, STRANGE_OBJECT); ! makeknown(POT_POLYMORPH); ! useup(potion); } return(1); } else if(obj->oclass == POTION_CLASS && obj->otyp != potion->otyp) { --- 1600,1633 ---- if (obj->otyp == potion->otyp || /* both POT_POLY */ obj->otyp == WAN_POLYMORPH || obj->otyp == SPE_POLYMORPH || + obj == uball || obj == uskin || obj_resists(obj->otyp == POT_POLYMORPH ? potion : obj, 5, 95)) { pline(nothing_happens); } else { + boolean was_wep = FALSE, was_swapwep = FALSE, was_quiver = FALSE; + short save_otyp = obj->otyp; /* KMH, conduct */ u.uconduct.polypiles++; ! if (obj == uwep) was_wep = TRUE; ! else if (obj == uswapwep) was_swapwep = TRUE; ! else if (obj == uquiver) was_quiver = TRUE; ! ! obj = poly_obj(obj, STRANGE_OBJECT); ! ! if (was_wep) setuwep(obj); ! else if (was_swapwep) setuswapwep(obj); ! else if (was_quiver) setuqwep(obj); ! ! if (obj->otyp != save_otyp) { ! makeknown(POT_POLYMORPH); ! useup(potion); ! prinv((char *)0, obj, 0L); ! } else { ! pline("Nothing seems to happen."); ! useup(potion); ! } } return(1); } else if(obj->oclass == POTION_CLASS && obj->otyp != potion->otyp) { *************** *** 1519,1525 **** if (obj->cursed || obj->otyp == POT_ACID || !rn2(10)) { pline("BOOM! They explode!"); exercise(A_STR, FALSE); ! potionbreathe(obj); useup(obj); useup(potion); losehp(rnd(10), "alchemic blast", KILLED_BY_AN); --- 1637,1644 ---- if (obj->cursed || obj->otyp == POT_ACID || !rn2(10)) { pline("BOOM! They explode!"); exercise(A_STR, FALSE); ! if (!breathless(youmonst.data) || haseyes(youmonst.data)) ! potionbreathe(obj); useup(obj); useup(potion); losehp(rnd(10), "alchemic blast", KILLED_BY_AN); *************** *** 1596,1604 **** if(is_poisonable(obj)) { if(potion->otyp == POT_SICKNESS && !obj->opoisoned) { char buf[BUFSZ]; ! Strcpy(buf, The(xname(potion))); ! pline("%s form%s a coating on %s.", ! buf, potion->quan == 1L ? "s" : "", the(xname(obj))); obj->opoisoned = TRUE; goto poof; } else if(obj->opoisoned && --- 1715,1726 ---- if(is_poisonable(obj)) { if(potion->otyp == POT_SICKNESS && !obj->opoisoned) { char buf[BUFSZ]; ! if (potion->quan > 1L) ! Sprintf(buf, "One of %s", the(xname(potion))); ! else ! Strcpy(buf, The(xname(potion))); ! pline("%s forms a coating on %s.", ! buf, the(xname(obj))); obj->opoisoned = TRUE; goto poof; } else if(obj->opoisoned && *************** *** 1611,1629 **** } } ! if (potion->otyp == POT_OIL && ! (obj->oclass == WEAPON_CLASS || is_weptool(obj))) { boolean wisx = FALSE; if (potion->lamplit) { /* burning */ int omat = objects[obj->otyp].oc_material; ! if (obj->oerodeproof || obj_resists(obj, 5, 95) || ! /* `METAL' should not be confused with is_metallic() */ ! omat == METAL || omat == MITHRIL || omat == BONE) { ! pline("%s seem%s to burn for a moment.", ! Yname2(obj), ! (obj->quan > 1L) ? "" : "s"); } else { ! if (omat == PLASTIC) obj->oeroded = MAX_ERODE; pline_The("burning oil %s %s.", obj->oeroded == MAX_ERODE ? "destroys" : "damages", yname(obj)); --- 1733,1752 ---- } } ! if (potion->otyp == POT_OIL) { boolean wisx = FALSE; if (potion->lamplit) { /* burning */ int omat = objects[obj->otyp].oc_material; ! /* the code here should be merged with fire_damage */ ! if (catch_lit(obj)) { ! /* catch_lit does all the work if true */ ! } else if (obj->oerodeproof || obj_resists(obj, 5, 95) || ! !is_flammable(obj) || obj->oclass == FOOD_CLASS) { ! pline("%s %s to burn for a moment.", ! Yname2(obj), otense(obj, "seem")); } else { ! if ((omat == PLASTIC || omat == PAPER) && !obj->oartifact) ! obj->oeroded = MAX_ERODE; pline_The("burning oil %s %s.", obj->oeroded == MAX_ERODE ? "destroys" : "damages", yname(obj)); *************** *** 1632,1639 **** obfree(obj, (struct obj *)0); obj = (struct obj *) 0; } else { ! /* should check for and do something about ! damaging unpaid shop goods here */ obj->oeroded++; } } --- 1755,1766 ---- obfree(obj, (struct obj *)0); obj = (struct obj *) 0; } else { ! /* we know it's carried */ ! if (obj->unpaid) { ! /* create a dummy duplicate to put on bill */ ! verbalize("You burnt it, you bought it!"); ! bill_dummy_object(obj); ! } obj->oeroded++; } } *************** *** 1641,1660 **** pline_The("potion spills and covers your %s with oil.", makeplural(body_part(FINGER))); incr_itimeout(&Glib, d(2,10)); /* Oil removes rust and corrosion, but doesn't unburn. * Arrows, etc are classed as metallic due to arrowhead * material, but dipping in oil shouldn't repair them. */ } else if ((!is_rustprone(obj) && !is_corrodeable(obj)) || ! is_ammo(obj) || (!obj->oeroded && !obj->oeroded2)) { /* uses up potion, doesn't set obj->greased */ ! pline("%s gleam%s with an oily sheen.", ! Yname2(obj), ! (obj->quan > 1L) ? "" : "s"); } else { pline("%s %s less %s.", ! Yname2(obj), ! (obj->quan > 1L) ? "are" : "is", (obj->oeroded && obj->oeroded2) ? "corroded and rusty" : obj->oeroded ? "rusty" : "corroded"); if (obj->oeroded > 0) obj->oeroded--; --- 1768,1788 ---- pline_The("potion spills and covers your %s with oil.", makeplural(body_part(FINGER))); incr_itimeout(&Glib, d(2,10)); + } else if (obj->oclass != WEAPON_CLASS && !is_weptool(obj)) { + /* the following cases apply only to weapons */ + goto more_dips; /* Oil removes rust and corrosion, but doesn't unburn. * Arrows, etc are classed as metallic due to arrowhead * material, but dipping in oil shouldn't repair them. */ } else if ((!is_rustprone(obj) && !is_corrodeable(obj)) || ! is_ammo(obj) || (!obj->oeroded && !obj->oeroded2)) { /* uses up potion, doesn't set obj->greased */ ! pline("%s %s with an oily sheen.", ! Yname2(obj), otense(obj, "gleam")); } else { pline("%s %s less %s.", ! Yname2(obj), otense(obj, "are"), (obj->oeroded && obj->oeroded2) ? "corroded and rusty" : obj->oeroded ? "rusty" : "corroded"); if (obj->oeroded > 0) obj->oeroded--; *************** *** 1666,1671 **** --- 1794,1800 ---- useup(potion); return 1; } + more_dips: /* Allow filling of MAGIC_LAMPs to prevent identification by player */ if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP) && *************** *** 1673,1679 **** /* Turn off engine before fueling, turn off fuel too :-) */ if (obj->lamplit || potion->lamplit) { useup(potion); ! explode(u.ux, u.uy, 11, d(6,6), 0); exercise(A_WIS, FALSE); return 1; } --- 1802,1808 ---- /* Turn off engine before fueling, turn off fuel too :-) */ if (obj->lamplit || potion->lamplit) { useup(potion); ! explode(u.ux, u.uy, 11, d(6,6), 0, EXPL_FIERY); exercise(A_WIS, FALSE); return 1; } *************** *** 1683,1689 **** obj->age = 0; } if (obj->age > 1000L) { ! pline("%s is full.", Yname2(obj)); } else { You("fill %s with oil.", yname(obj)); check_unpaid(potion); /* Yendorian Fuel Tax */ --- 1812,1818 ---- obj->age = 0; } if (obj->age > 1000L) { ! pline("%s %s full.", Yname2(obj), otense(obj, "are")); } else { You("fill %s with oil.", yname(obj)); check_unpaid(potion); /* Yendorian Fuel Tax */ *************** *** 1692,1697 **** --- 1821,1827 ---- useup(potion); exercise(A_WIS, TRUE); } + makeknown(POT_OIL); obj->spe = 1; update_inventory(); return 1; *************** *** 1699,1732 **** if ((obj->otyp == UNICORN_HORN || obj->otyp == AMETHYST) && (mixture = mixtype(obj, potion)) != 0) { ! /* with multiple merged potions, we should split off one and ! just clear it, but clearing them all together is easier */ ! boolean more_than_one = potion->quan > 1L; ! potion->otyp = mixture; ! potion->blessed = 0; if (mixture == POT_WATER) ! potion->cursed = potion->odiluted = 0; else ! potion->cursed = obj->cursed; /* odiluted left as-is */ if (Blind) ! potion->dknown = FALSE; else { if (mixture == POT_WATER && #ifdef DCC30_BUG ! (potion->dknown = !Hallucination, ! potion->dknown != 0)) #else ! (potion->dknown = !Hallucination) != 0) #endif ! pline_The("potion%s clear%s.", ! more_than_one ? "s" : "", ! more_than_one ? "" : "s"); else ! pline_The("potion%s turn%s %s.", ! more_than_one ? "s" : "", ! more_than_one ? "" : "s", hcolor(OBJ_DESCR(objects[mixture]))); } update_inventory(); return(1); } --- 1829,1873 ---- if ((obj->otyp == UNICORN_HORN || obj->otyp == AMETHYST) && (mixture = mixtype(obj, potion)) != 0) { ! boolean more_than_one = potion->quan > 1; ! /* with multiple merged potions, split off one and ! just clear it */ ! if (potion->quan > 1L) { ! singlepotion = splitobj(potion, 1L); ! } else singlepotion = potion; ! ! if(singlepotion->unpaid && costly_spot(u.ux, u.uy)) { ! You("use it, you pay for it."); ! bill_dummy_object(singlepotion); ! } ! singlepotion->otyp = mixture; ! singlepotion->blessed = 0; if (mixture == POT_WATER) ! singlepotion->cursed = singlepotion->odiluted = 0; else ! singlepotion->cursed = obj->cursed; /* odiluted left as-is */ ! singlepotion->bknown = FALSE; if (Blind) ! singlepotion->dknown = FALSE; else { if (mixture == POT_WATER && #ifdef DCC30_BUG ! (singlepotion->dknown = !Hallucination, ! singlepotion->dknown != 0)) #else ! (singlepotion->dknown = !Hallucination) != 0) #endif ! pline_The("potion%s clears.", ! more_than_one ? " that you dipped into" : ""); else ! pline_The("potion%s turns %s.", ! more_than_one ? " that you dipped into" : "", hcolor(OBJ_DESCR(objects[mixture]))); } + obj_extract_self(singlepotion); + singlepotion = hold_another_object(singlepotion, + "You juggle and drop %s!", + doname(singlepotion), (const char *)0); update_inventory(); return(1); } *** nethack-3.3.1/src/pray.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/pray.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pray.c 3.3 2000/06/29 */ /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pray.c 3.4 2002/03/02 */ /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 9,14 **** --- 9,18 ---- STATIC_DCL int NDECL(in_trouble); STATIC_DCL void FDECL(fix_worst_trouble,(int)); STATIC_DCL void FDECL(angrygods,(ALIGNTYP_P)); + STATIC_DCL void FDECL(at_your_feet, (const char *)); + #ifdef ELBERETH + STATIC_DCL void NDECL(gcrownu); + #endif /*ELBERETH*/ STATIC_DCL void FDECL(pleased,(ALIGNTYP_P)); STATIC_DCL void FDECL(godvoice,(ALIGNTYP_P,const char*)); STATIC_DCL void FDECL(god_zaps_you,(ALIGNTYP_P)); *************** *** 164,170 **** if(Blinded > 1) return(TROUBLE_BLIND); for(i=0; i= HUNGRY) return(TROUBLE_HUNGRY); if(HStun) return (TROUBLE_STUNNED); if(HConfusion) return (TROUBLE_CONFUSED); --- 168,178 ---- if(Blinded > 1) return(TROUBLE_BLIND); for(i=0; i= HUNGRY) return(TROUBLE_HUNGRY); if(HStun) return (TROUBLE_STUNNED); if(HConfusion) return (TROUBLE_CONFUSED); *************** *** 188,198 **** --- 196,208 ---- case TROUBLE_STONED: You_feel("more limber."); Stoned = 0; + flags.botl = 1; delayed_killer = 0; break; case TROUBLE_SLIMED: pline_The("slime disappears."); Slimed = 0; + flags.botl = 1; delayed_killer = 0; break; case TROUBLE_STRANGLED: *************** *** 202,207 **** --- 212,218 ---- } You("can breathe again."); Strangled = 0; + flags.botl = 1; break; case TROUBLE_LAVA: You("are back on solid ground."); *************** *** 215,221 **** losestr(-1); /* fall into... */ case TROUBLE_HUNGRY: ! Your("stomach feels content."); init_uhunger(); flags.botl = 1; break; --- 226,232 ---- losestr(-1); /* fall into... */ case TROUBLE_HUNGRY: ! Your("%s feels content.", body_part(STOMACH)); init_uhunger(); flags.botl = 1; break; *************** *** 325,332 **** if (!Blind) Your("%s %s.", what ? what : ! (const char *)aobjnam (otmp, "softly glow"), hcolor(amber)); break; case TROUBLE_POISONED: if (Hallucination) --- 336,344 ---- if (!Blind) Your("%s %s.", what ? what : ! (const char *)aobjnam(otmp, "softly glow"), hcolor(amber)); + update_inventory(); break; case TROUBLE_POISONED: if (Hallucination) *************** *** 342,350 **** (void) encumber_msg(); break; case TROUBLE_BLIND: ! Your("%s feel better.", makeplural(body_part(EYE))); ! make_blinded(0L,FALSE); ! break; case TROUBLE_WOUNDED_LEGS: heal_legs(); break; --- 354,367 ---- (void) encumber_msg(); break; case TROUBLE_BLIND: ! { ! int num_eyes = eyecount(youmonst.data); ! Your("%s feel%s better.", ! (num_eyes == 1) ? body_part(EYE) : makeplural(body_part(EYE)), ! (num_eyes == 1) ? "s" : ""); ! make_blinded(0L,FALSE); ! break; ! } case TROUBLE_WOUNDED_LEGS: heal_legs(); break; *************** *** 437,443 **** summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); ! verbalize("Destroy %s, my servants!", him[flags.female]); } } } --- 454,460 ---- summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); ! verbalize("Destroy %s, my servants!", uhim()); } } } *************** *** 522,532 **** return; } STATIC_OVL void pleased(g_align) aligntyp g_align; { ! int trouble = p_trouble; /* what's your worst difficulty? */ int pat_on_head = 0, kick_on_butt; You_feel("that %s is %s.", align_gname(g_align), --- 539,718 ---- return; } + /* helper to print "str appears at your feet", or appropriate */ + static void + at_your_feet(str) + const char *str; + { + if (Blind) str = Something; + if (u.uswallow) { + /* barrier between you and the floor */ + pline("%s %s into %s %s.", str, vtense(str, "drop"), + s_suffix(mon_nam(u.ustuck)), mbodypart(u.ustuck, STOMACH)); + } else { + pline("%s %s %s your %s!", str, + Blind ? "lands" : vtense(str, "appear"), + Levitation ? "beneath" : "at", + makeplural(body_part(FOOT))); + } + } + + #ifdef ELBERETH + STATIC_OVL void + gcrownu() + { + struct obj *obj; + boolean already_exists, in_hand; + short class_gift; + int sp_no; + #define ok_wep(o) ((o) && ((o)->oclass == WEAPON_CLASS || is_weptool(o))) + + HSee_invisible |= FROMOUTSIDE; + HFire_resistance |= FROMOUTSIDE; + HCold_resistance |= FROMOUTSIDE; + HShock_resistance |= FROMOUTSIDE; + HSleep_resistance |= FROMOUTSIDE; + HPoison_resistance |= FROMOUTSIDE; + godvoice(u.ualign.type, (char *)0); + + obj = ok_wep(uwep) ? uwep : 0; + already_exists = in_hand = FALSE; /* lint suppression */ + switch (u.ualign.type) { + case A_LAWFUL: + u.uevent.uhand_of_elbereth = 1; + verbalize("I crown thee... The Hand of Elbereth!"); + break; + case A_NEUTRAL: + u.uevent.uhand_of_elbereth = 2; + in_hand = (uwep && uwep->oartifact == ART_VORPAL_BLADE); + already_exists = exist_artifact(LONG_SWORD, artiname(ART_VORPAL_BLADE)); + verbalize("Thou shalt be my Envoy of Balance!"); + break; + case A_CHAOTIC: + u.uevent.uhand_of_elbereth = 3; + in_hand = (uwep && uwep->oartifact == ART_STORMBRINGER); + already_exists = exist_artifact(RUNESWORD, artiname(ART_STORMBRINGER)); + verbalize("Thou art chosen to %s for My Glory!", + already_exists && !in_hand ? "take lives" : "steal souls"); + break; + } + + class_gift = STRANGE_OBJECT; + /* 3.3.[01] had this in the A_NEUTRAL case below, + preventing chaotic wizards from receiving a spellbook */ + if (Role_if(PM_WIZARD) && + (!uwep || (uwep->oartifact != ART_VORPAL_BLADE && + uwep->oartifact != ART_STORMBRINGER)) && + !carrying(SPE_FINGER_OF_DEATH)) { + class_gift = SPE_FINGER_OF_DEATH; + make_splbk: + obj = mksobj(class_gift, TRUE, FALSE); + bless(obj); + obj->bknown = TRUE; + at_your_feet("A spellbook"); + dropy(obj); + u.ugifts++; + /* when getting a new book for known spell, enhance + currently wielded weapon rather than the book */ + for (sp_no = 0; sp_no < MAXSPELL; sp_no++) + if (spl_book[sp_no].sp_id == class_gift) { + if (ok_wep(uwep)) obj = uwep; /* to be blessed,&c */ + break; + } + } else if (Role_if(PM_MONK) && + (!uwep || !uwep->oartifact) && + !carrying(SPE_RESTORE_ABILITY)) { + /* monks rarely wield a weapon */ + class_gift = SPE_RESTORE_ABILITY; + goto make_splbk; + } + + switch (u.ualign.type) { + case A_LAWFUL: + if (class_gift != STRANGE_OBJECT) { + ; /* already got bonus above */ + } else if (obj && obj->otyp == LONG_SWORD && !obj->oartifact) { + if (!Blind) Your("sword shines brightly for a moment."); + obj = oname(obj, artiname(ART_EXCALIBUR)); + if (obj && obj->oartifact == ART_EXCALIBUR) u.ugifts++; + } + /* acquire Excalibur's skill regardless of weapon or gift */ + unrestrict_weapon_skill(P_LONG_SWORD); + if (obj && obj->oartifact == ART_EXCALIBUR) + discover_artifact(ART_EXCALIBUR); + break; + case A_NEUTRAL: + if (class_gift != STRANGE_OBJECT) { + ; /* already got bonus above */ + } else if (in_hand) { + Your("%s goes snicker-snack!", xname(obj)); + obj->dknown = TRUE; + } else if (!already_exists) { + obj = mksobj(LONG_SWORD, FALSE, FALSE); + obj = oname(obj, artiname(ART_VORPAL_BLADE)); + obj->spe = 1; + at_your_feet("A sword"); + dropy(obj); + u.ugifts++; + } + /* acquire Vorpal Blade's skill regardless of weapon or gift */ + unrestrict_weapon_skill(P_LONG_SWORD); + if (obj && obj->oartifact == ART_VORPAL_BLADE) + discover_artifact(ART_VORPAL_BLADE); + break; + case A_CHAOTIC: + { + char swordbuf[BUFSZ]; + + Sprintf(swordbuf, "%s sword", hcolor(Black)); + if (class_gift != STRANGE_OBJECT) { + ; /* already got bonus above */ + } else if (in_hand) { + Your("%s hums ominously!", swordbuf); + obj->dknown = TRUE; + } else if (!already_exists) { + obj = mksobj(RUNESWORD, FALSE, FALSE); + obj = oname(obj, artiname(ART_STORMBRINGER)); + at_your_feet(An(swordbuf)); + obj->spe = 1; + dropy(obj); + u.ugifts++; + } + /* acquire Stormbringer's skill regardless of weapon or gift */ + unrestrict_weapon_skill(P_BROAD_SWORD); + if (obj && obj->oartifact == ART_STORMBRINGER) + discover_artifact(ART_STORMBRINGER); + break; + } + default: + obj = 0; /* lint */ + break; + } + + /* enhance weapon regardless of alignment or artifact status */ + if (ok_wep(obj)) { + bless(obj); + obj->oeroded = obj->oeroded2 = 0; + obj->oerodeproof = TRUE; + obj->bknown = obj->rknown = TRUE; + if (obj->spe < 1) obj->spe = 1; + /* acquire skill in this weapon */ + unrestrict_weapon_skill(weapon_type(obj)); + } else if (class_gift == STRANGE_OBJECT) { + /* opportunity knocked, but there was nobody home... */ + You_feel("unworthy."); + } + update_inventory(); + return; + } + #endif /*ELBERETH*/ + STATIC_OVL void pleased(g_align) aligntyp g_align; { ! /* don't use p_trouble, worst trouble may get fixed while praying */ ! int trouble = in_trouble(); /* what's your worst difficulty? */ int pat_on_head = 0, kick_on_butt; You_feel("that %s is %s.", align_gname(g_align), *************** *** 555,562 **** If your luck is at least 0, then you are guaranteed rescued from your worst major problem. */ ! if (!trouble && u.ualign.record >= DEVOUT) pat_on_head = 1; ! else { int action = rn1(on_altar() ? 3 + on_shrine() : 2, Luck+1); if (!on_altar()) action = max(action,2); --- 741,750 ---- If your luck is at least 0, then you are guaranteed rescued from your worst major problem. */ ! if (!trouble && u.ualign.record >= DEVOUT) { ! /* if hero was in trouble, but got better, no special favor */ ! if (p_trouble == 0) pat_on_head = 1; ! } else { int action = rn1(on_altar() ? 3 + on_shrine() : 2, Luck+1); if (!on_altar()) action = max(action,2); *************** *** 590,596 **** *repair_buf = '\0'; if (uwep->oeroded || uwep->oeroded2) Sprintf(repair_buf, " and %s now as good as new", ! uwep->quan == 1L ? "is" : "are"); if (uwep->cursed) { uncurse(uwep); --- 778,784 ---- *repair_buf = '\0'; if (uwep->oeroded || uwep->oeroded2) Sprintf(repair_buf, " and %s now as good as new", ! otense(uwep, "are")); if (uwep->cursed) { uncurse(uwep); *************** *** 623,628 **** --- 811,817 ---- Your("%s as good as new!", aobjnam(uwep, Blind ? "feel" : "look")); } + update_inventory(); } break; case 3: *************** *** 646,655 **** /* Otherwise, falls into next case */ case 2: if (!Blind) ! You("are surrounded by %s glow.", ! an(hcolor(golden))); ! if (Upolyd) u.mh = u.mhmax += 5; ! u.uhp = u.uhpmax += 5; ABASE(A_STR) = AMAX(A_STR); if (u.uhunger < 900) init_uhunger(); if (u.uluck < 0) u.uluck = 0; --- 835,852 ---- /* Otherwise, falls into next case */ case 2: if (!Blind) ! You("are surrounded by %s glow.", an(hcolor(golden))); ! /* if any levels have been lost (and not yet regained), ! treat this effect like blessed full healing */ ! if (u.ulevel < u.ulevelmax) { ! u.ulevelmax -= 1; /* see potion.c */ ! pluslvl(FALSE); ! } else { ! u.uhpmax += 5; ! if (Upolyd) u.mhmax += 5; ! } ! u.uhp = u.uhpmax; ! if (Upolyd) u.mh = u.mhmax; ABASE(A_STR) = AMAX(A_STR); if (u.uhunger < 900) init_uhunger(); if (u.uluck < 0) u.uluck = 0; *************** *** 658,663 **** --- 855,861 ---- break; case 4: { register struct obj *otmp; + int any = 0; if (Blind) You_feel("the power of %s.", u_gname()); *************** *** 670,678 **** --- 868,878 ---- Your("%s %s.", aobjnam(otmp, "softly glow"), hcolor(amber)); otmp->bknown = TRUE; + ++any; } } } + if (any) update_inventory(); break; } case 5: { *************** *** 703,835 **** case 9: /* KMH -- can occur during full moons */ #ifdef ELBERETH if (u.ualign.record >= PIOUS && !u.uevent.uhand_of_elbereth) { ! register struct obj *obj = uwep; /* to be blessed */ ! boolean already_exists, in_hand; ! const char *dropped_item; ! int sp_no; ! ! HSee_invisible |= FROMOUTSIDE; ! HFire_resistance |= FROMOUTSIDE; ! HCold_resistance |= FROMOUTSIDE; ! HPoison_resistance |= FROMOUTSIDE; ! godvoice(u.ualign.type,(char *)0); ! ! switch(u.ualign.type) { ! case A_LAWFUL: ! u.uevent.uhand_of_elbereth = 1; ! verbalize("I crown thee... The Hand of Elbereth!"); ! if (obj && (obj->otyp == LONG_SWORD) && !obj->oartifact) { ! obj = oname(obj, artiname(ART_EXCALIBUR)); ! if (obj && obj->oartifact == ART_EXCALIBUR) u.ugifts++; ! } ! /* acquire this skill regardless of weapon */ ! unrestrict_weapon_skill(P_LONG_SWORD); ! if (obj && obj->oartifact == ART_EXCALIBUR) ! discover_artifact(ART_EXCALIBUR); ! break; ! case A_NEUTRAL: ! u.uevent.uhand_of_elbereth = 2; ! verbalize("Thou shalt be my Envoy of Balance!"); ! dropped_item = 0; ! if (uwep && uwep->oartifact == ART_VORPAL_BLADE) { ! obj = uwep; /* to be blessed and rustproofed */ ! Your("%s goes snicker-snack!", xname(obj)); ! obj->dknown = TRUE; ! } else if (Role_if(PM_WIZARD) && ! !carrying(SPE_FINGER_OF_DEATH)) { ! obj = mksobj(SPE_FINGER_OF_DEATH, TRUE, FALSE); ! bless(obj); ! dropped_item = "A spellbook appears"; ! } else if (!exist_artifact(LONG_SWORD, ! artiname(ART_VORPAL_BLADE))) { ! obj = mksobj(LONG_SWORD, FALSE, FALSE); ! obj = oname(obj, artiname(ART_VORPAL_BLADE)); ! obj->spe = 1; ! dropped_item = "A sword appears"; ! } ! if (dropped_item) { ! if (Blind) dropped_item = "Something lands"; ! pline("%s %s your %s!", dropped_item, ! Levitation ? "beneath" : "at", ! makeplural(body_part(FOOT))); ! dropy(obj); ! u.ugifts++; ! } ! /* acquire this skill regardless of weapon (or book) */ ! unrestrict_weapon_skill(P_LONG_SWORD); ! if (obj && obj->oartifact == ART_VORPAL_BLADE) ! discover_artifact(ART_VORPAL_BLADE); ! /* when getting a new book for known spell, enhance ! currently wielded weapon rather than the book */ ! if (obj && obj->otyp == SPE_FINGER_OF_DEATH) { ! for (sp_no = 0; sp_no < MAXSPELL; sp_no++) ! if (spl_book[sp_no].sp_id == SPE_FINGER_OF_DEATH) { ! if (uwep) obj = uwep; /* to be blessed,&c */ ! break; ! } ! } ! break; ! case A_CHAOTIC: ! u.uevent.uhand_of_elbereth = 3; ! in_hand = (uwep && uwep->oartifact == ART_STORMBRINGER); ! already_exists = exist_artifact(RUNESWORD, ! artiname(ART_STORMBRINGER)); ! verbalize("Thou art chosen to %s for My Glory!", ! already_exists && !in_hand ? ! "take lives" : "steal souls"); ! if (in_hand) { ! obj = uwep; /* to be blessed and rustproofed */ ! } else if (!already_exists) { ! obj = mksobj(RUNESWORD, FALSE, FALSE); ! obj = oname(obj, artiname(ART_STORMBRINGER)); ! pline("%s %s %s your %s!", Blind ? Something : ! An(hcolor(Black)), ! Blind ? "lands" : "sword appears", ! Levitation ? "beneath" : "at", ! makeplural(body_part(FOOT))); ! obj->spe = 1; ! dropy(obj); ! u.ugifts++; ! } ! /* acquire this skill regardless of weapon */ ! unrestrict_weapon_skill(P_BROAD_SWORD); ! if (obj && obj->oartifact == ART_STORMBRINGER) ! discover_artifact(ART_STORMBRINGER); ! break; ! default: ! obj = 0; /* lint */ ! break; ! } ! /* enhance weapon regardless of alignment or artifact status */ ! if (obj && (obj->oclass == WEAPON_CLASS || is_weptool(obj))) { ! bless(obj); ! obj->oeroded = obj->oeroded2 = 0; ! obj->oerodeproof = TRUE; ! obj->bknown = obj->rknown = TRUE; ! if (obj->spe < 1) obj->spe = 1; ! /* acquire skill in this weapon */ ! unrestrict_weapon_skill(weapon_type(obj)); ! } else if (obj && (obj->oclass == SPBOOK_CLASS)) { ! obj->bknown = TRUE; ! } else /* opportunity knocked, but there was nobody home... */ ! You_feel("unworthy."); break; ! } #endif /*ELBERETH*/ - case 6: { struct obj *otmp; int sp_no, trycnt = u.ulevel + 1; ! pline("An object appears at your %s!", ! makeplural(body_part(FOOT))); /* not yet known spells given preference over already known ones */ otmp = mkobj(SPBOOK_CLASS, TRUE); while (--trycnt > 0) { if (otmp->otyp != SPE_BLANK_PAPER) { for (sp_no = 0; sp_no < MAXSPELL; sp_no++) if (spl_book[sp_no].sp_id == otmp->otyp) break; ! if (sp_no == MAXSPELL) break; /* not yet known */ } else { if (!objects[SPE_BLANK_PAPER].oc_name_known || carrying(MAGIC_MARKER)) break; --- 903,927 ---- case 9: /* KMH -- can occur during full moons */ #ifdef ELBERETH if (u.ualign.record >= PIOUS && !u.uevent.uhand_of_elbereth) { ! gcrownu(); break; ! } /* else FALLTHRU */ #endif /*ELBERETH*/ case 6: { struct obj *otmp; int sp_no, trycnt = u.ulevel + 1; ! at_your_feet("An object"); /* not yet known spells given preference over already known ones */ + /* Also, try to grant a spell for which there is a skill slot */ otmp = mkobj(SPBOOK_CLASS, TRUE); while (--trycnt > 0) { if (otmp->otyp != SPE_BLANK_PAPER) { for (sp_no = 0; sp_no < MAXSPELL; sp_no++) if (spl_book[sp_no].sp_id == otmp->otyp) break; ! if (sp_no == MAXSPELL && ! !P_RESTRICTED(spell_skilltype(otmp->otyp))) ! break; /* usable, but not yet known */ } else { if (!objects[SPE_BLANK_PAPER].oc_name_known || carrying(MAGIC_MARKER)) break; *************** *** 867,873 **** for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) { /* turn water into (un)holy water */ ! if (otmp->otyp == POT_WATER && (boolean)otmp->blessed != bless_water) { otmp->blessed = bless_water; otmp->cursed = !bless_water; otmp->bknown = bc_known; --- 959,966 ---- for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) { /* turn water into (un)holy water */ ! if (otmp->otyp == POT_WATER && ! (bless_water ? !otmp->blessed : !otmp->cursed)) { otmp->blessed = bless_water; otmp->cursed = !bless_water; otmp->bknown = bc_known; *************** *** 1089,1095 **** } /* corpse */ if (otmp->otyp == AMULET_OF_YENDOR) { ! if (!In_endgame(&u.uz)) { if (Hallucination) You_feel("homesick."); else --- 1182,1188 ---- } /* corpse */ if (otmp->otyp == AMULET_OF_YENDOR) { ! if (!Is_astralevel(&u.uz)) { if (Hallucination) You_feel("homesick."); else *************** *** 1294,1307 **** /* you were already in pretty good standing */ /* The player can gain an artifact */ /* The chance goes down as the number of artifacts goes up */ ! if (u.ulevel > 2 && !rn2(10 + (2 * u.ugifts * nartifacts))) { otmp = mk_artifact((struct obj *)0, a_align(u.ux,u.uy)); if (otmp) { if (otmp->spe < 0) otmp->spe = 0; if (otmp->cursed) uncurse(otmp); dropy(otmp); ! pline("An object appears at your %s!", ! makeplural(body_part(FOOT))); godvoice(u.ualign.type, "Use my gift wisely!"); u.ugifts++; u.ublesscnt = rnz(300 + (50 * nartifacts)); --- 1387,1401 ---- /* you were already in pretty good standing */ /* The player can gain an artifact */ /* The chance goes down as the number of artifacts goes up */ ! if (u.ulevel > 2 && u.uluck >= 0 && ! !rn2(10 + (2 * u.ugifts * nartifacts))) { otmp = mk_artifact((struct obj *)0, a_align(u.ux,u.uy)); if (otmp) { if (otmp->spe < 0) otmp->spe = 0; if (otmp->cursed) uncurse(otmp); + otmp->oerodeproof = TRUE; dropy(otmp); ! at_your_feet("An object"); godvoice(u.ualign.type, "Use my gift wisely!"); u.ugifts++; u.ublesscnt = rnz(300 + (50 * nartifacts)); *************** *** 1313,1318 **** --- 1407,1413 ---- } } change_luck((value * LUCKMAX) / (MAXVALUE * 2)); + if ((int)u.uluck < 0) u.uluck = 0; if (u.uluck != saved_luck) { if (Blind) You("think %s brushed your %s.",something, body_part(FOOT)); *************** *** 1379,1389 **** int dopray() { ! /* Confirm accidental slips of Alt-P */ ! if (flags.prayconfirm) ! if (yn("Are you sure you want to pray?") == 'n') ! return (0); ! u.uconduct.gnostic++; /* set up p_type and p_alignment */ if (!can_pray(TRUE)) return 0; --- 1474,1490 ---- int dopray() { ! /* Confirm accidental slips of Alt-P */ ! if (flags.prayconfirm) ! if (yn("Are you sure you want to pray?") == 'n') ! return 0; ! ! u.uconduct.gnostic++; ! /* Praying implies that the hero is conscious and since we have ! no deafness attribute this implies that all verbalized messages ! can be heard. So, in case the player has used the 'O' command ! to toggle this accessible flag off, force it to be on. */ ! flags.soundok = 1; /* set up p_type and p_alignment */ if (!can_pray(TRUE)) return 0; *************** *** 1489,1494 **** --- 1590,1597 ---- You("don't know how to turn undead!"); return(0); } + u.uconduct.gnostic++; + if ((u.ualign.type != A_CHAOTIC && (is_demon(youmonst.data) || is_undead(youmonst.data))) || u.ugangr > 6 /* "Die, mortal!" */) { *************** *** 1506,1512 **** } pline("Calling upon %s, you chant an arcane formula.", u_gname()); exercise(A_WIS, TRUE); - u.uconduct.gnostic++; /* note: does not perform unturn_dead() on victims' inventories */ range = BOLT_LIM + (u.ulevel / 5); /* 5 to 11 */ --- 1609,1614 ---- *************** *** 1534,1556 **** switch (mtmp->data->mlet) { /* this is intentional, lichs are tougher than zombies. */ ! case S_LICH: xlev += 2; ! case S_GHOST: xlev += 2; ! case S_VAMPIRE: xlev += 2; ! case S_WRAITH: xlev += 2; ! case S_MUMMY: xlev += 2; case S_ZOMBIE: ! mtmp->mflee = 1; /* at least */ ! if(u.ulevel >= xlev && ! !resist(mtmp, '\0', 0, NOTELL)) { ! if(u.ualign.type == A_CHAOTIC) { mtmp->mpeaceful = 1; } else { /* damn them */ killed(mtmp); } ! } ! break; ! default: mtmp->mflee = 1; break; } } --- 1636,1660 ---- switch (mtmp->data->mlet) { /* this is intentional, lichs are tougher than zombies. */ ! case S_LICH: xlev += 2; /*FALLTHRU*/ ! case S_GHOST: xlev += 2; /*FALLTHRU*/ ! case S_VAMPIRE: xlev += 2; /*FALLTHRU*/ ! case S_WRAITH: xlev += 2; /*FALLTHRU*/ ! case S_MUMMY: xlev += 2; /*FALLTHRU*/ case S_ZOMBIE: ! if (u.ulevel >= xlev && ! !resist(mtmp, '\0', 0, NOTELL)) { ! if (u.ualign.type == A_CHAOTIC) { mtmp->mpeaceful = 1; + set_malign(mtmp); } else { /* damn them */ killed(mtmp); } ! break; ! } /* else flee */ ! /*FALLTHRU*/ ! default: ! monflee(mtmp, 0, FALSE, TRUE); break; } } *** nethack-3.3.1/src/priest.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/priest.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)priest.c 3.3 2000/02/19 */ /* Copyright (c) Izchak Miller, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)priest.c 3.4 2001/11/07 */ /* Copyright (c) Izchak Miller, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,13 **** --- 8,16 ---- #include "epri.h" #include "emin.h" + /* this matches the categorizations shown by enlightenment */ + #define ALGN_SINNED (-4) /* worse than strayed */ + #ifdef OVLB STATIC_DCL boolean FDECL(histemple_at,(struct monst *,XCHAR_P,XCHAR_P)); *************** *** 190,198 **** int sx, sy; boolean sanctum; /* is it the seat of the high priest? */ { ! register struct monst *priest; ! register struct obj *otmp; ! register int cnt; if(MON_AT(sx+1, sy)) rloc(m_at(sx+1, sy)); /* insurance */ --- 193,201 ---- int sx, sy; boolean sanctum; /* is it the seat of the high priest? */ { ! struct monst *priest; ! struct obj *otmp; ! int cnt; if(MON_AT(sx+1, sy)) rloc(m_at(sx+1, sy)); /* insurance */ *************** *** 216,240 **** on_level(&sanctum_level, &u.uz)) { (void) mongets(priest, AMULET_OF_YENDOR); } ! /* Do NOT put the rest in m_initinv. */ ! /* Priests created elsewhere than in a */ ! /* temple should not carry these items, */ ! cnt = rn1(2,3); ! while(cnt) { ! otmp = mkobj(SPBOOK_CLASS, FALSE); ! if(otmp) (void) mpickobj(priest, otmp); ! cnt--; ! } ! if(p_coaligned(priest)) ! (void) mongets(priest, ROBE); ! else { ! otmp = mksobj(ROBE, TRUE, FALSE); ! if(otmp) { ! if(!rn2(2)) curse(otmp); ! (void) mpickobj(priest, otmp); ! } } - m_dowear(priest, TRUE); } } --- 219,235 ---- on_level(&sanctum_level, &u.uz)) { (void) mongets(priest, AMULET_OF_YENDOR); } ! /* 2 to 4 spellbooks */ ! for (cnt = rn1(3,2); cnt > 0; --cnt) { ! (void) mpickobj(priest, mkobj(SPBOOK_CLASS, FALSE)); ! } ! /* robe [via makemon()] */ ! if (rn2(2) && (otmp = which_armor(priest, W_ARMC)) != 0) { ! if (p_coaligned(priest)) ! uncurse(otmp); ! else ! curse(otmp); } } } *************** *** 368,375 **** } if(!sanctum) { /* !tended -> !shrined */ ! if(!shrined || !p_coaligned(priest) || ! u.ualign.record < -5) You("have a%s forbidding feeling...", (!shrined) ? "" : " strange"); else You("experience a strange sense of peace."); --- 363,370 ---- } if(!sanctum) { /* !tended -> !shrined */ ! if (!shrined || !p_coaligned(priest) || ! u.ualign.record <= ALGN_SINNED) You("have a%s forbidding feeling...", (!shrined) ? "" : " strange"); else You("experience a strange sense of peace."); *************** *** 405,411 **** boolean coaligned = p_coaligned(priest); boolean strayed = (u.ualign.record < 0); - /* KMH, conduct */ u.uconduct.gnostic++; --- 400,405 ---- *************** *** 427,433 **** if(!priest->mcanmove || priest->msleeping) { pline("%s breaks out of %s reverie!", ! Monnam(priest), his[pronoun_gender(priest)]); priest->mfrozen = priest->msleeping = 0; priest->mcanmove = 1; } --- 421,427 ---- if(!priest->mcanmove || priest->msleeping) { pline("%s breaks out of %s reverie!", ! Monnam(priest), mhis(priest)); priest->mfrozen = priest->msleeping = 0; priest->mcanmove = 1; } *************** *** 443,449 **** priest->mpeaceful = 0; return; } ! if(!u.ugold) { if(coaligned && !strayed) { if (priest->mgold > 0L) { --- 437,443 ---- priest->mpeaceful = 0; return; } ! #ifndef GOLDOBJ if(!u.ugold) { if(coaligned && !strayed) { if (priest->mgold > 0L) { *************** *** 456,461 **** --- 450,465 ---- u.ugold = 1L; priest->mgold -= u.ugold; flags.botl = 1; + #else + if(!money_cnt(invent)) { + if(coaligned && !strayed) { + long pmoney = money_cnt(priest->minvent); + if (pmoney > 0L) { + /* Note: two bits is actually 25 cents. Hmm. */ + pline("%s gives you %s for an ale.", Monnam(priest), + (pmoney == 1L) ? "one bit" : "two bits"); + money2u(priest, pmoney > 1L ? 2 : 1); + #endif } else pline("%s preaches the virtues of poverty.", Monnam(priest)); exercise(A_WIS, TRUE); *************** *** 471,477 **** --- 475,485 ---- verbalize("Thou shalt regret thine action!"); if(coaligned) adjalign(-1); } else if(offer < (u.ulevel * 200)) { + #ifndef GOLDOBJ if(u.ugold > (offer * 2L)) verbalize("Cheapskate."); + #else + if(money_cnt(invent) > (offer * 2L)) verbalize("Cheapskate."); + #endif else { verbalize("I thank thee for thy contribution."); /* give player some token */ *************** *** 479,486 **** } } else if(offer < (u.ulevel * 400)) { verbalize("Thou art indeed a pious individual."); if(u.ugold < (offer * 2L)) { ! if(coaligned && u.ualign.record < -5) adjalign(1); verbalize("I bestow upon thee a blessing."); incr_itimeout(&HClairvoyant, rn1(500,500)); } --- 487,499 ---- } } else if(offer < (u.ulevel * 400)) { verbalize("Thou art indeed a pious individual."); + #ifndef GOLDOBJ if(u.ugold < (offer * 2L)) { ! #else ! if(money_cnt(invent) < (offer * 2L)) { ! #endif ! if (coaligned && u.ualign.record <= ALGN_SINNED) ! adjalign(1); verbalize("I bestow upon thee a blessing."); incr_itimeout(&HClairvoyant, rn1(500,500)); } *************** *** 494,500 **** --- 507,517 ---- } else u.ublessed++; } else { verbalize("Thy selfless generosity is deeply appreciated."); + #ifndef GOLDOBJ if(u.ugold < (offer * 2L) && coaligned) { + #else + if(money_cnt(invent) < (offer * 2L) && coaligned) { + #endif if(strayed && (moves - u.ucleansed) > 5000L) { u.ualign.record = 0; /* cleanse thee */ u.ucleansed = moves; *************** *** 565,571 **** if (is_minion(mon->data) || is_rider(mon->data)) return FALSE; x = mon->mx, y = mon->my; } ! if (u.ualign.record < -3) /* sinned or worse */ return FALSE; if ((roomno = temple_occupied(u.urooms)) == 0 || roomno != *in_rooms(x, y, TEMPLE)) --- 582,588 ---- if (is_minion(mon->data) || is_rider(mon->data)) return FALSE; x = mon->mx, y = mon->my; } ! if (u.ualign.record <= ALGN_SINNED) /* sinned or worse */ return FALSE; if ((roomno = temple_occupied(u.urooms)) == 0 || roomno != *in_rooms(x, y, TEMPLE)) *** nethack-3.3.1/src/quest.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/quest.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)quest.c 3.3 2000/05/05 */ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)quest.c 3.4 2000/05/05 */ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 152,157 **** --- 152,158 ---- !seal ? 1 : -1; schedule_goto(dest, FALSE, FALSE, portal_flag, (char *)0, (char *)0); if (seal) { /* remove the portal to the quest - sealing it off */ + int reexpelled = u.uevent.qexpelled; u.uevent.qexpelled = 1; /* Delete the near portal now; the far (main dungeon side) portal will be deleted as part of arrival on that level. *************** *** 160,166 **** for (t = ftrap; t; t = t->ntrap) if (t->ttyp == MAGIC_PORTAL) break; if (t) deltrap(t); /* (display might be briefly out of sync) */ ! else impossible("quest portal already gone?"); } } --- 161,167 ---- for (t = ftrap; t; t = t->ntrap) if (t->ttyp == MAGIC_PORTAL) break; if (t) deltrap(t); /* (display might be briefly out of sync) */ ! else if (!reexpelled) impossible("quest portal already gone?"); } } *************** *** 194,199 **** --- 195,201 ---- /* behave as if leader imparts sufficient info about the quest artifact */ fully_identify_obj(obj); + update_inventory(); } } *************** *** 293,299 **** { if(!Qstat(in_battle)) { if(u.uhave.questart) qt_pager(QT_NEMWANTSIT); ! else if(Qstat(made_goal) == 1) qt_pager(QT_FIRSTNEMESIS); else if(Qstat(made_goal) < 4) qt_pager(QT_NEXTNEMESIS); else if(Qstat(made_goal) < 7) qt_pager(QT_OTHERNEMESIS); else if(!rn2(5)) qt_pager(rn1(10, QT_DISCOURAGE)); --- 295,302 ---- { if(!Qstat(in_battle)) { if(u.uhave.questart) qt_pager(QT_NEMWANTSIT); ! else if(Qstat(made_goal) == 1 || !Qstat(met_nemesis)) ! qt_pager(QT_FIRSTNEMESIS); else if(Qstat(made_goal) < 4) qt_pager(QT_NEXTNEMESIS); else if(Qstat(made_goal) < 7) qt_pager(QT_OTHERNEMESIS); else if(!rn2(5)) qt_pager(rn1(10, QT_DISCOURAGE)); *************** *** 307,313 **** chat_with_guardian() { /* These guys/gals really don't have much to say... */ ! qt_pager(rn1(5, QT_GUARDTALK)); } STATIC_OVL void --- 310,319 ---- chat_with_guardian() { /* These guys/gals really don't have much to say... */ ! if (u.uhave.questart && Qstat(killed_nemesis)) ! qt_pager(rn1(5, QT_GUARDTALK2)); ! else ! qt_pager(rn1(5, QT_GUARDTALK)); } STATIC_OVL void *************** *** 336,343 **** quest_chat(mtmp) register struct monst *mtmp; { switch(mtmp->data->msound) { - case MS_LEADER: chat_with_leader(); break; case MS_NEMESIS: chat_with_nemesis(); break; case MS_GUARDIAN: chat_with_guardian(); break; default: impossible("quest_chat: Unknown quest character %s.", --- 342,352 ---- quest_chat(mtmp) register struct monst *mtmp; { + if (mtmp->m_id == Qstat(leader_m_id)) { + chat_with_leader(); + return; + } switch(mtmp->data->msound) { case MS_NEMESIS: chat_with_nemesis(); break; case MS_GUARDIAN: chat_with_guardian(); break; default: impossible("quest_chat: Unknown quest character %s.", *************** *** 349,356 **** quest_talk(mtmp) register struct monst *mtmp; { switch(mtmp->data->msound) { - case MS_LEADER: leader_speaks(mtmp); break; case MS_NEMESIS: nemesis_speaks(); break; case MS_DJINNI: prisoner_speaks(mtmp); break; default: break; --- 358,368 ---- quest_talk(mtmp) register struct monst *mtmp; { + if (mtmp->m_id == Qstat(leader_m_id)) { + leader_speaks(mtmp); + return; + } switch(mtmp->data->msound) { case MS_NEMESIS: nemesis_speaks(); break; case MS_DJINNI: prisoner_speaks(mtmp); break; default: break; *** nethack-3.3.1/src/questpgr.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/questpgr.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)questpgr.c 3.3 2000/05/05 */ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)questpgr.c 3.4 2000/05/05 */ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 207,221 **** homebase() /* return your role leader's location */ { return(urole.homebase); - } - - boolean - leaderless() /* return true iff leader is dead */ - { - int i = urole.ldrnum; - /* BUG: This doesn't take the possibility of resurrection - via wand or spell of undead turning into account. */ - return (boolean)(mvitals[i].died > 0); } STATIC_OVL struct qtmsg * --- 207,212 ---- *** nethack-3.3.1/src/read.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/read.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)read.c 3.3 2000/03/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)read.c 3.4 2001/12/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 38,43 **** --- 38,44 ---- static void FDECL(randomize,(int *, int)); static void FDECL(forget_single_object, (int)); static void FDECL(forget, (int)); + static void FDECL(maybe_tame, (struct monst *,struct obj *)); STATIC_PTR void FDECL(set_lit, (int,int,genericptr_t)); *************** *** 62,67 **** --- 63,86 ---- return(1); #ifdef TOURIST } else if (scroll->otyp == T_SHIRT) { + static const char *shirt_msgs[] = { /* Scott Bigham */ + "I explored the Dungeons of Doom and all I got was this lousy T-shirt!", + "Is that Mjollnir in your pocket or are you just happy to see me?", + "It's not the size of your sword, it's how #enhance'd you are with it.", + "Madame Elvira's House O' Succubi Lifetime Customer", + "Madame Elvira's House O' Succubi Employee of the Month", + "Ludios Vault Guards Do It In Small, Dark Rooms", + "Yendor Military Soldiers Do It In Large Groups", + "I survived Yendor Military Boot Camp", + "Ludios Accounting School Intra-Mural Lacrosse Team", + "Oracle(TM) Fountains 10th Annual Wet T-Shirt Contest", + "Hey, black dragon! Disintegrate THIS!", + "I'm With Stupid -->", + "Don't blame me, I voted for Izchak!", + "Don't Panic", /* HHGTTG */ + "Furinkan High School Athletic Dept.", /* Ranma 1/2 */ + "Hel-LOOO, Nurse!", /* Animaniacs */ + }; char buf[BUFSZ]; int erosion; *************** *** 72,84 **** u.uconduct.literate++; if(flags.verbose) pline("It reads:"); ! Sprintf(buf, "I explored the Dungeons of Doom, %s.", ! Hallucination ? ! (scroll == uarmu ? ! /* (force these two to have identical length) */ ! "and never did any laundry..." : ! "and couldn't find my way out") : ! "but all I got was this lousy T-shirt"); erosion = greatest_erosion(scroll); if (erosion) wipeout_text(buf, --- 91,97 ---- u.uconduct.literate++; if(flags.verbose) pline("It reads:"); ! Strcpy(buf, shirt_msgs[scroll->o_id % SIZE(shirt_msgs)]); erosion = greatest_erosion(scroll); if (erosion) wipeout_text(buf, *************** *** 123,136 **** scroll->in_use = TRUE; /* scroll, not spellbook, now being read */ if(scroll->otyp != SCR_BLANK_PAPER) { if(Blind) ! pline("As you pronounce the formula on it, the scroll disappears."); else pline("As you read the scroll, it disappears."); if(confused) { if (Hallucination) pline("Being so trippy, you screw up..."); else ! pline("Being confused, you mispronounce the magic words..."); } } if(!seffects(scroll)) { --- 136,151 ---- scroll->in_use = TRUE; /* scroll, not spellbook, now being read */ if(scroll->otyp != SCR_BLANK_PAPER) { if(Blind) ! pline("As you %s the formula on it, the scroll disappears.", ! is_silent(youmonst.data) ? "cogitate" : "pronounce"); else pline("As you read the scroll, it disappears."); if(confused) { if (Hallucination) pline("Being so trippy, you screw up..."); else ! pline("Being confused, you mis%s the magic words...", ! is_silent(youmonst.data) ? "understand" : "pronounce"); } } if(!seffects(scroll)) { *************** *** 158,164 **** obj->spe = 0; if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN) obj->age = 0; ! Your("%s vibrates briefly.",xname(obj)); } else pline(nothing_happens); } } --- 173,179 ---- obj->spe = 0; if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN) obj->age = 0; ! Your("%s %s briefly.",xname(obj), otense(obj, "vibrate")); } else pline(nothing_happens); } } *************** *** 168,174 **** register struct obj *otmp; { Your("%s %s briefly.", xname(otmp), ! Blind ? "vibrates" : "glows"); } static void --- 183,189 ---- register struct obj *otmp; { Your("%s %s briefly.", xname(otmp), ! otense(otmp, Blind ? "vibrate" : "glow")); } static void *************** *** 176,185 **** register struct obj *otmp; register const char *color; { ! Your("%s %s%s for a moment.", xname(otmp), ! Blind ? "vibrates" : "glows ", ! Blind ? (const char *)"" : hcolor(color)); } /* Is the object chargeable? For purposes of inventory display; it is */ --- 191,201 ---- register struct obj *otmp; register const char *color; { ! Your("%s %s%s%s for a moment.", xname(otmp), ! otense(otmp, Blind ? "vibrate" : "glow"), ! Blind ? "" : " ", ! Blind ? nul : hcolor(color)); } /* Is the object chargeable? For purposes of inventory display; it is */ *************** *** 270,277 **** /* destruction depends on current state, not adjustment */ if (obj->spe > rn2(7) || obj->spe <= -5) { ! Your("%s pulsates momentarily, then explodes!", ! xname(obj)); if (is_on) Ring_gone(obj); s = rnd(3 * abs(obj->spe)); /* amount of damage */ useup(obj); --- 286,293 ---- /* destruction depends on current state, not adjustment */ if (obj->spe > rn2(7) || obj->spe <= -5) { ! Your("%s %s momentarily, then %s!", ! xname(obj), otense(obj,"pulsate"), otense(obj,"explode")); if (is_on) Ring_gone(obj); s = rnd(3 * abs(obj->spe)); /* amount of damage */ useup(obj); *************** *** 350,356 **** stripspe(obj); if (obj->lamplit) { if (!Blind) ! pline("%s goes out!", The(xname(obj))); end_burn(obj, TRUE); } } else if (is_blessed) { --- 366,372 ---- stripspe(obj); if (obj->lamplit) { if (!Blind) ! pline("%s out!", Tobjnam(obj, "go")); end_burn(obj, TRUE); } } else if (is_blessed) { *************** *** 430,441 **** objects[obj_id].oc_name_known = 0; objects[obj_id].oc_pre_discovered = 0; /* a discovery when relearned */ if (objects[obj_id].oc_uname) { - /* this only works if oc_name_known is false */ - undiscover_object(obj_id); - free((genericptr_t)objects[obj_id].oc_uname); objects[obj_id].oc_uname = 0; } /* clear & free object names from matching inventory items too? */ } --- 446,456 ---- objects[obj_id].oc_name_known = 0; objects[obj_id].oc_pre_discovered = 0; /* a discovery when relearned */ if (objects[obj_id].oc_uname) { free((genericptr_t)objects[obj_id].oc_uname); objects[obj_id].oc_uname = 0; } + undiscover_object(obj_id); /* after clearing oc_name_known */ + /* clear & free object names from matching inventory items too? */ } *************** *** 623,628 **** --- 638,659 ---- docrt(); /* this correctly will reset vision */ } + /* monster is hit by scroll of taming's effect */ + static void + maybe_tame(mtmp, sobj) + struct monst *mtmp; + struct obj *sobj; + { + if (sobj->cursed) { + setmangry(mtmp); + } else { + if (mtmp->isshk) + make_happy_shk(mtmp, FALSE); + else if (!resist(mtmp, sobj->oclass, 0, NOTELL)) + (void) tamedog(mtmp, (struct obj *) 0); + } + } + int seffects(sobj) register struct obj *sobj; *************** *** 664,689 **** otmp->oerodeproof = !(sobj->cursed); if(Blind) { otmp->rknown = FALSE; ! Your("%s feels warm for a moment.", ! xname(otmp)); } else { otmp->rknown = TRUE; ! Your("%s is covered by a %s %s %s!", ! xname(otmp), sobj->cursed ? "mottled" : "shimmering", hcolor(sobj->cursed ? Black : golden), sobj->cursed ? "glow" : (is_shield(otmp) ? "layer" : "shield")); } ! if (otmp->oerodeproof && (otmp->oeroded || otmp->oeroded2)) { otmp->oeroded = otmp->oeroded2 = 0; Your("%s %s as good as new!", ! xname(otmp), Blind ? "feels" : "looks"); } break; } special_armor = is_elven_armor(otmp) || ! (Role_if(PM_WIZARD) && otmp->otyp == CORNUTHAUM); if (sobj->cursed) same_color = (otmp->otyp == BLACK_DRAGON_SCALE_MAIL || --- 695,722 ---- otmp->oerodeproof = !(sobj->cursed); if(Blind) { otmp->rknown = FALSE; ! Your("%s %s warm for a moment.", ! xname(otmp), otense(otmp, "feel")); } else { otmp->rknown = TRUE; ! Your("%s %s covered by a %s %s %s!", ! xname(otmp), otense(otmp, "are"), sobj->cursed ? "mottled" : "shimmering", hcolor(sobj->cursed ? Black : golden), sobj->cursed ? "glow" : (is_shield(otmp) ? "layer" : "shield")); } ! if (otmp->oerodeproof && ! (otmp->oeroded || otmp->oeroded2)) { otmp->oeroded = otmp->oeroded2 = 0; Your("%s %s as good as new!", ! xname(otmp), ! otense(otmp, Blind ? "feel" : "look")); } break; } special_armor = is_elven_armor(otmp) || ! (Role_if(PM_WIZARD) && otmp->otyp == CORNUTHAUM); if (sobj->cursed) same_color = (otmp->otyp == BLACK_DRAGON_SCALE_MAIL || *************** *** 698,708 **** /* KMH -- catch underflow */ s = sobj->cursed ? -otmp->spe : otmp->spe; if (s > (special_armor ? 5 : 3) && rn2(s)) { ! Your("%s violently %s%s%s for a while, then evaporates.", ! xname(otmp), ! Blind ? "vibrates" : "glows", ! (!Blind && !same_color) ? " " : nul, ! (Blind || same_color) ? nul : hcolor(sobj->cursed ? Black : silver)); if(is_cloak(otmp)) (void) Cloak_off(); if(is_boots(otmp)) (void) Boots_off(); if(is_helmet(otmp)) (void) Helmet_off(); --- 731,743 ---- /* KMH -- catch underflow */ s = sobj->cursed ? -otmp->spe : otmp->spe; if (s > (special_armor ? 5 : 3) && rn2(s)) { ! Your("%s violently %s%s%s for a while, then %s.", ! xname(otmp), ! otense(otmp, Blind ? "vibrate" : "glow"), ! (!Blind && !same_color) ? " " : nul, ! (Blind || same_color) ? nul : ! hcolor(sobj->cursed ? Black : silver), ! otense(otmp, "evaporate")); if(is_cloak(otmp)) (void) Cloak_off(); if(is_boots(otmp)) (void) Boots_off(); if(is_helmet(otmp)) (void) Helmet_off(); *************** *** 735,741 **** Your("%s %s%s%s%s for a %s.", xname(otmp), s == 0 ? "violently " : nul, ! Blind ? "vibrates" : "glows", (!Blind && !same_color) ? " " : nul, (Blind || same_color) ? nul : hcolor(sobj->cursed ? Black : silver), (s*s>1) ? "while" : "moment"); --- 770,776 ---- Your("%s %s%s%s%s for a %s.", xname(otmp), s == 0 ? "violently " : nul, ! otense(otmp, Blind ? "vibrate" : "glow"), (!Blind && !same_color) ? " " : nul, (Blind || same_color) ? nul : hcolor(sobj->cursed ? Black : silver), (s*s>1) ? "while" : "moment"); *************** *** 750,757 **** if ((otmp->spe > (special_armor ? 5 : 3)) && (special_armor || !rn2(7))) ! Your("%s suddenly vibrates %s.", ! xname(otmp), Blind ? "again" : "unexpectedly"); break; } --- 785,792 ---- if ((otmp->spe > (special_armor ? 5 : 3)) && (special_armor || !rn2(7))) ! Your("%s suddenly %s %s.", ! xname(otmp), otense(otmp, "vibrate"), Blind ? "again" : "unexpectedly"); break; } *************** *** 778,784 **** } else known = TRUE; } else { /* armor and scroll both cursed */ ! Your("%s vibrates.", xname(otmp)); if (otmp->spe >= -6) otmp->spe--; make_stunned(HStun + rn1(10, 10), TRUE); } --- 813,819 ---- } else known = TRUE; } else { /* armor and scroll both cursed */ ! Your("%s %s.", xname(otmp), otense(otmp, "vibrate")); if (otmp->spe >= -6) otmp->spe--; make_stunned(HStun + rn1(10, 10), TRUE); } *************** *** 821,827 **** makeplural(body_part(HAND)), u.umconf ? "n even more" : "", hcolor(red)); ! u.umconf += rn1(8, 2); } } break; --- 856,866 ---- makeplural(body_part(HAND)), u.umconf ? "n even more" : "", hcolor(red)); ! /* after a while, repeated uses become less effective */ ! if (u.umconf >= 40) ! u.umconf++; ! else ! u.umconf += rn1(8, 2); } } break; *************** *** 838,844 **** mtmp->mcanmove = 1; } else if (! resist(mtmp, sobj->oclass, 0, NOTELL)) ! mtmp->mflee = 1; if(!mtmp->mtame) ct++; /* pets don't laugh at you */ } } --- 877,883 ---- mtmp->mcanmove = 1; } else if (! resist(mtmp, sobj->oclass, 0, NOTELL)) ! monflee(mtmp, 0, FALSE, FALSE); if(!mtmp->mtame) ct++; /* pets don't laugh at you */ } } *************** *** 873,888 **** else You_feel("like someone is helping you."); ! if(sobj->cursed) pline_The("scroll disintegrates."); ! else { ! for(obj = invent; obj ; obj = obj->nobj) ! if(sobj->blessed || obj->owornmask || ! (obj->otyp == LOADSTONE)) { if(confused) blessorcurse(obj, 2); else uncurse(obj); } } if(Punished && !confused) unpunish(); break; } case SCR_CREATE_MONSTER: --- 912,932 ---- else You_feel("like someone is helping you."); ! if (sobj->cursed) { ! pline_The("scroll disintegrates."); ! } else { ! for (obj = invent; obj; obj = obj->nobj) ! if (sobj->blessed || ! (obj->owornmask && ! ((obj->owornmask & ~W_SWAPWEP) || u.twoweap)) || ! obj->otyp == LOADSTONE || ! (obj->otyp == LEASH && obj->leashmon)) { if(confused) blessorcurse(obj, 2); else uncurse(obj); } } if(Punished && !confused) unpunish(); + update_inventory(); break; } case SCR_CREATE_MONSTER: *************** *** 924,946 **** break; case SCR_TAMING: case SPE_CHARM_MONSTER: ! { register int i,j; ! register int bd = confused ? 5 : 1; ! register struct monst *mtmp; ! for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++) ! if(isok(u.ux+i, u.uy+j) && (mtmp = m_at(u.ux+i, u.uy+j))) { ! if(sobj->cursed) { ! setmangry(mtmp); ! } else { ! if (mtmp->isshk) ! make_happy_shk(mtmp, FALSE); ! else if (!resist(mtmp, sobj->oclass, 0, NOTELL)) ! (void) tamedog(mtmp, (struct obj *) 0); } } break; - } case SCR_GENOCIDE: You("have found a scroll of genocide!"); known = TRUE; --- 968,986 ---- break; case SCR_TAMING: case SPE_CHARM_MONSTER: ! if (u.uswallow) { ! maybe_tame(u.ustuck, sobj); ! } else { ! int i, j, bd = confused ? 5 : 1; ! struct monst *mtmp; ! for (i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++) { ! if (!isok(u.ux + i, u.uy + j)) continue; ! if ((mtmp = m_at(u.ux + i, u.uy + j)) != 0) ! maybe_tame(mtmp, sobj); } } break; case SCR_GENOCIDE: You("have found a scroll of genocide!"); known = TRUE; *************** *** 987,992 **** --- 1027,1033 ---- /* Note: if rn2(5)==0, identify all items */ if (cval == 1 && sobj->blessed && Luck > 0) ++cval; } else cval = 1; + if(!objects[sobj->otyp].oc_name_known) more_experienced(0,10); useup(sobj); makeknown(SCR_IDENTIFY); id: *************** *** 1065,1070 **** --- 1106,1112 ---- * some damage under all potential cases. */ cval = bcsign(sobj); + if(!objects[sobj->otyp].oc_name_known) more_experienced(0,10); useup(sobj); makeknown(SCR_FIRE); if(confused) { *************** *** 1089,1095 **** burn_away_slime(); } explode(u.ux, u.uy, 11, (2*(rn1(3, 3) + 2 * cval) + 1)/3, ! SCROLL_CLASS); return(1); case SCR_EARTH: /* TODO: handle steeds */ --- 1131,1137 ---- burn_away_slime(); } explode(u.ux, u.uy, 11, (2*(rn1(3, 3) + 2 * cval) + 1)/3, ! SCROLL_CLASS, EXPL_FIERY); return(1); case SCR_EARTH: /* TODO: handle steeds */ *************** *** 1153,1159 **** if (canspotmon(mtmp)) pline("%s's %s does not protect %s.", Monnam(mtmp), xname(helmet), ! him[pronoun_gender(mtmp)]); } } mtmp->mhp -= mdmg; --- 1195,1201 ---- if (canspotmon(mtmp)) pline("%s's %s does not protect %s.", Monnam(mtmp), xname(helmet), ! mhim(mtmp)); } } mtmp->mhp -= mdmg; *************** *** 1286,1292 **** pline("It seems even darker in here than before."); return; } ! You("are surrounded by darkness!"); } /* the magic douses lamps, et al, too */ --- 1328,1338 ---- pline("It seems even darker in here than before."); return; } ! if (uwep && artifact_light(uwep) && uwep->lamplit) ! pline("Suddenly, the only light left comes from %s!", ! the(xname(uwep))); ! else ! You("are surrounded by darkness!"); } /* the magic douses lamps, et al, too */ *************** *** 1298,1305 **** if (Blind) goto do_it; if(u.uswallow){ if (is_animal(u.ustuck->data)) ! pline("%s stomach is lit.", ! s_suffix(Monnam(u.ustuck))); else if (is_whirly(u.ustuck->data)) pline("%s shines briefly.", --- 1344,1352 ---- if (Blind) goto do_it; if(u.uswallow){ if (is_animal(u.ustuck->data)) ! pline("%s %s is lit.", ! s_suffix(Monnam(u.ustuck)), ! mbodypart(u.ustuck, STOMACH)); else if (is_whirly(u.ustuck->data)) pline("%s shines briefly.", *************** *** 1376,1381 **** --- 1423,1431 ---- buf); (void)mungspaces(buf); } while (buf[0]=='\033' || !buf[0]); + /* choosing "none" preserves genocideless conduct */ + if (!strcmpi(buf, "none")) return; + if (strlen(buf) == 1) { if (buf[0] == ILLOBJ_SYM) buf[0] = def_monsyms[S_MIMIC]; *************** *** 1499,1510 **** --- 1549,1562 ---- #define REALLY 1 #define PLAYER 2 + #define ONTHRONE 4 void do_genocide(how) int how; /* 0 = no genocide; create monsters (cursed scroll) */ /* 1 = normal genocide */ /* 3 = forced genocide of player */ + /* 5 (4 | 1) = normal genocide from throne */ { char buf[BUFSZ]; register int i, killplayer = 0; *************** *** 1525,1530 **** --- 1577,1593 ---- } getlin("What monster do you want to genocide? [type the name]", buf); + (void)mungspaces(buf); + /* choosing "none" preserves genocideless conduct */ + if (!strcmpi(buf, "none")) { + /* ... but no free pass if cursed */ + if (!(how & REALLY)) { + ptr = rndmonst(); + if (!ptr) return; /* no message, like normal case */ + mndx = monsndx(ptr); + break; /* remaining checks don't apply */ + } else return; + } mndx = name_to_mon(buf); if (mndx == NON_PM || (mvitals[mndx].mvflags & G_GENOD)) { *************** *** 1591,1601 **** mvitals[urace.malenum].mvflags |= (G_GENOD | G_NOCORPSE); u.uhp = -1; ! killer_format = KILLED_BY_AN; ! if (how & PLAYER) ! killer = "genocidal confusion"; ! else /* selected player deliberately, not confused */ ! killer = "scroll of genocide"; /* Polymorphed characters will die as soon as they're rehumanized. */ /* KMH -- Unchanging prevents rehumanization */ --- 1654,1670 ---- mvitals[urace.malenum].mvflags |= (G_GENOD | G_NOCORPSE); u.uhp = -1; ! if (how & PLAYER) { ! killer_format = KILLED_BY; ! killer = "genocidal confusion"; ! } else if (how & ONTHRONE) { ! /* player selected while on a throne */ ! killer_format = KILLED_BY_AN; ! killer = "imperious order"; ! } else { /* selected player deliberately, not confused */ ! killer_format = KILLED_BY_AN; ! killer = "scroll of genocide"; ! } /* Polymorphed characters will die as soon as they're rehumanized. */ /* KMH -- Unchanging prevents rehumanization */ *************** *** 1700,1722 **** boolean create_particular() { ! char buf[BUFSZ]; ! int which, tries = 0; do { ! getlin("Create what kind of monster? [type the name]", buf); if (buf[0] == '\033') return FALSE; ! which = name_to_mon(buf); ! if (which < LOW_PM) pline("I've never heard of such monsters."); ! else break; } while (++tries < 5); if (tries == 5) pline(thats_enough_tries); else { (void) cant_create(&which, FALSE); ! return((boolean)(makemon(&mons[which], ! u.ux, u.uy, NO_MM_FLAGS) != 0)); } ! return FALSE; } #endif /* WIZARD */ --- 1769,1824 ---- boolean create_particular() { ! char buf[BUFSZ], monclass = MAXMCLASSES; ! int which = PM_PLAYERMON, tries = 0, i; ! struct permonst *whichpm = 0; ! struct monst *mtmp; ! boolean madeany = FALSE; ! boolean maketame = FALSE; do { ! getlin("Create what kind of monster? [type the name or symbol]", ! buf); if (buf[0] == '\033') return FALSE; ! (void)mungspaces(buf); ! if (strlen(buf) == 1) { ! monclass = def_char_to_monclass(buf[0]); ! if (monclass == MAXMCLASSES) ! pline("I've never heard of such monsters."); ! else break; ! } else { ! if (!strncmpi(buf, "tame ", 5)) { ! which = name_to_mon(buf+5); ! maketame = TRUE; ! } else { ! which = name_to_mon(buf); ! maketame = FALSE; ! } ! if (which < LOW_PM) pline("I've never heard of such monsters."); ! else { ! whichpm = &mons[which]; ! break; ! } ! } } while (++tries < 5); if (tries == 5) pline(thats_enough_tries); else { (void) cant_create(&which, FALSE); ! for (i = 0; i <= multi; i++) { ! if (monclass != MAXMCLASSES) ! whichpm = mkclass(monclass, 0); ! if (maketame) { ! mtmp = makemon(whichpm, u.ux, u.uy, MM_EDOG); ! if (mtmp) { ! initedog(mtmp); ! set_malign(mtmp); ! } ! } else ! mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS); ! if (mtmp) madeany = TRUE; ! } } ! return madeany; } #endif /* WIZARD */ *** nethack-3.3.1/src/rect.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/rect.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)rect.c 3.3 90/02/22 */ /* Copyright (c) 1990 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)rect.c 3.4 1990/02/22 */ /* Copyright (c) 1990 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/src/region.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/region.c Thu Mar 21 07:37:37 2002 *************** *** 1,8 **** ! /* SCCS Id: @(#)region.c 3.3 1999/12/29 */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* * This should really go into the level structure, but --- 1,9 ---- ! /* SCCS Id: @(#)region.c 3.4 1999/12/29 */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" + #include "lev.h" /* * This should really go into the level structure, but *************** *** 391,397 **** /* Check if any monster is inside region */ if (f_indx != NO_CALLBACK) { for (j = 0; j < regions[i]->n_monst; j++) { ! struct monst *mtmp = find_mid(regions[i]->monsters[j], FM_EVERYWHERE); if (!mtmp || mtmp->mhp <= 0 || (*callbacks[f_indx])(regions[i], mtmp)) { --- 392,398 ---- /* Check if any monster is inside region */ if (f_indx != NO_CALLBACK) { for (j = 0; j < regions[i]->n_monst; j++) { ! struct monst *mtmp = find_mid(regions[i]->monsters[j], FM_FMON); if (!mtmp || mtmp->mhp <= 0 || (*callbacks[f_indx])(regions[i], mtmp)) { *************** *** 613,618 **** --- 614,621 ---- int i, j; unsigned n; + if (!perform_bwrite(mode)) goto skip_lots; + bwrite(fd, (genericptr_t) &moves, sizeof (moves)); /* timestamp */ bwrite(fd, (genericptr_t) &n_regions, sizeof (n_regions)); for (i = 0; i < n_regions; i++) { *************** *** 647,652 **** --- 650,659 ---- bwrite(fd, (genericptr_t) ®ions[i]->glyph, sizeof (int)); bwrite(fd, (genericptr_t) ®ions[i]->arg, sizeof (genericptr_t)); } + + skip_lots: + if (release_data(mode)) + clear_regions(); } void *************** *** 883,888 **** --- 890,899 ---- if (cansee(mtmp->mx, mtmp->my)) pline("%s coughs!", Monnam(mtmp)); setmangry(mtmp); + if (haseyes(mtmp->data) && mtmp->mcansee) { + mtmp->mblinded = 1; + mtmp->mcansee = 0; + } if (resists_poison(mtmp)) return FALSE; mtmp->mhp -= rnd(dam) + 5; *** nethack-3.3.1/src/restore.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/restore.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)restore.c 3.3 1999/11/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)restore.c 3.4 1999/11/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,13 **** --- 8,14 ---- #ifdef MICRO extern int dotcnt; /* shared with save */ + extern int dotrow; /* shared with save */ #endif #ifdef USE_TILES *************** *** 220,225 **** --- 221,227 ---- for (otmp3 = otmp->cobj; otmp3; otmp3 = otmp3->nobj) otmp3->ocontainer = otmp; } + if (otmp->bypass) otmp->bypass = 0; otmp2 = otmp; } *************** *** 338,346 **** STATIC_OVL boolean ! restgamestate(fd, mid, steedid) register int fd; ! unsigned int *mid, *steedid; /* STEED */ { struct obj *otmp; int uid; --- 340,348 ---- STATIC_OVL boolean ! restgamestate(fd, stuckid, steedid) register int fd; ! unsigned int *stuckid, *steedid; /* STEED */ { struct obj *otmp; int uid; *************** *** 357,362 **** --- 359,366 ---- } mread(fd, (genericptr_t) &flags, sizeof(struct flag)); + flags.bypasses = 0; /* never use the saved value of bypasses */ + role_init(); /* Reset the initial role, race, gender, and alignment */ #ifdef AMII_GRAPHICS amii_setpens(amii_numcolors); /* use colors from save file */ *************** *** 366,372 **** #ifdef CLIPPING cliparound(u.ux, u.uy); #endif ! if(u.uhp <= 0) { u.ux = u.uy = 0; /* affects pline() [hence You()] */ You("were not healthy enough to survive restoration."); /* wiz1_level.dlevel is used by mklev.c to see if lots of stuff is --- 370,376 ---- #ifdef CLIPPING cliparound(u.ux, u.uy); #endif ! if(u.uhp <= 0 && (!Upolyd || u.mh <= 0)) { u.ux = u.uy = 0; /* affects pline() [hence You()] */ You("were not healthy enough to survive restoration."); /* wiz1_level.dlevel is used by mklev.c to see if lots of stuff is *************** *** 409,418 **** sizeof(struct spell) * (MAXSPELL + 1)); restore_artifacts(fd); restore_oracles(fd); ! if(u.ustuck) ! mread(fd, (genericptr_t) mid, sizeof (*mid)); #ifdef STEED ! if(u.usteed) mread(fd, (genericptr_t) steedid, sizeof (*steedid)); #endif mread(fd, (genericptr_t) pl_character, sizeof pl_character); --- 413,422 ---- sizeof(struct spell) * (MAXSPELL + 1)); restore_artifacts(fd); restore_oracles(fd); ! if (u.ustuck) ! mread(fd, (genericptr_t) stuckid, sizeof (*stuckid)); #ifdef STEED ! if (u.usteed) mread(fd, (genericptr_t) steedid, sizeof (*steedid)); #endif mread(fd, (genericptr_t) pl_character, sizeof pl_character); *************** *** 434,452 **** * don't dereference a wild u.ustuck when saving the game state, for instance) */ STATIC_OVL void ! restlevelstate(mid, steedid) ! unsigned int mid, steedid; /* STEED */ { register struct monst *mtmp; ! if (u.ustuck) { for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) ! if (mtmp->m_id == mid) break; if (!mtmp) panic("Cannot find the monster ustuck."); u.ustuck = mtmp; } #ifdef STEED ! if (u.usteed) { for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (mtmp->m_id == steedid) break; if (!mtmp) panic("Cannot find the monster usteed."); --- 438,456 ---- * don't dereference a wild u.ustuck when saving the game state, for instance) */ STATIC_OVL void ! restlevelstate(stuckid, steedid) ! unsigned int stuckid, steedid; /* STEED */ { register struct monst *mtmp; ! if (stuckid) { for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) ! if (mtmp->m_id == stuckid) break; if (!mtmp) panic("Cannot find the monster ustuck."); u.ustuck = mtmp; } #ifdef STEED ! if (steedid) { for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (mtmp->m_id == steedid) break; if (!mtmp) panic("Cannot find the monster usteed."); *************** *** 461,467 **** restlevelfile(fd, ltmp) register int fd; xchar ltmp; ! #ifdef applec # pragma unused(fd) #endif { --- 465,471 ---- restlevelfile(fd, ltmp) register int fd; xchar ltmp; ! #if defined(macintosh) && (defined(__SC__) || defined(__MRC__)) # pragma unused(fd) #endif { *************** *** 519,532 **** dorecover(fd) register int fd; { ! unsigned int mid = 0, steedid = 0; /* not a register */ xchar ltmp; int rtmp; struct obj *otmp; restoring = TRUE; getlev(fd, 0, (xchar)0, FALSE); ! if (!restgamestate(fd, &mid, &steedid)) { display_nhwindow(WIN_MESSAGE, TRUE); savelev(-1, 0, FREE_SAVE); /* discard current level */ (void) close(fd); --- 523,536 ---- dorecover(fd) register int fd; { ! unsigned int stuckid = 0, steedid = 0; /* not a register */ xchar ltmp; int rtmp; struct obj *otmp; restoring = TRUE; getlev(fd, 0, (xchar)0, FALSE); ! if (!restgamestate(fd, &stuckid, &steedid)) { display_nhwindow(WIN_MESSAGE, TRUE); savelev(-1, 0, FREE_SAVE); /* discard current level */ (void) close(fd); *************** *** 534,546 **** restoring = FALSE; return(0); } ! restlevelstate(mid, steedid); #ifdef INSURANCE savestateinlock(); #endif rtmp = restlevelfile(fd, ledger_no(&u.uz)); if (rtmp < 2) return(rtmp); /* dorecover called recursively */ #ifdef MICRO # ifdef AMII_GRAPHICS { --- 538,560 ---- restoring = FALSE; return(0); } ! restlevelstate(stuckid, steedid); #ifdef INSURANCE savestateinlock(); #endif rtmp = restlevelfile(fd, ledger_no(&u.uz)); if (rtmp < 2) return(rtmp); /* dorecover called recursively */ + /* these pointers won't be valid while we're processing the + * other levels, but they'll be reset again by restlevelstate() + * afterwards, and in the meantime at least u.usteed may mislead + * place_monster() on other levels + */ + u.ustuck = (struct monst *)0; + #ifdef STEED + u.usteed = (struct monst *)0; + #endif + #ifdef MICRO # ifdef AMII_GRAPHICS { *************** *** 560,565 **** --- 574,580 ---- flags.explore ? " while in explore mode" : ""); curs(WIN_MAP, 1, 1); dotcnt = 0; + dotrow = 2; if (strncmpi("X11", windowprocs.name, 3)) putstr(WIN_MAP, 0, "Restoring:"); #endif *************** *** 572,578 **** break; getlev(fd, 0, ltmp, FALSE); #ifdef MICRO ! curs(WIN_MAP, 1+dotcnt++, 2); if (strncmpi("X11", windowprocs.name, 3)){ putstr(WIN_MAP, 0, "."); } --- 587,597 ---- break; getlev(fd, 0, ltmp, FALSE); #ifdef MICRO ! curs(WIN_MAP, 1+dotcnt++, dotrow); ! if (dotcnt >= (COLNO - 1)) { ! dotrow++; ! dotcnt = 0; ! } if (strncmpi("X11", windowprocs.name, 3)){ putstr(WIN_MAP, 0, "."); } *************** *** 599,605 **** #ifdef USE_TILES substitute_tiles(&u.uz); #endif ! restlevelstate(mid, steedid); #ifdef MFLOPPY gameDiskPrompt(); #endif --- 618,624 ---- #ifdef USE_TILES substitute_tiles(&u.uz); #endif ! restlevelstate(stuckid, steedid); #ifdef MFLOPPY gameDiskPrompt(); #endif *************** *** 732,737 **** --- 751,760 ---- mread(fd, (genericptr_t)&level.flags, sizeof(level.flags)); mread(fd, (genericptr_t)doors, sizeof(doors)); rest_rooms(fd); /* No joke :-) */ + if (nroom) + doorindex = rooms[nroom - 1].fdoor + rooms[nroom - 1].doorct; + else + doorindex = 0; restore_timers(fd, RANGE_LEVEL, ghostly, monstermoves - omoves); restore_light_sources(fd); *************** *** 920,926 **** { struct obj *otmp; unsigned oldid, nid; ! for (otmp = fobj; otmp; otmp = otmp->nobj) if (ghostly && otmp->oattached == OATTACHED_M_ID) { (void) memcpy((genericptr_t)&oldid, (genericptr_t)otmp->oextra, sizeof(oldid)); --- 943,954 ---- { struct obj *otmp; unsigned oldid, nid; ! for (otmp = fobj; otmp; otmp = otmp->nobj) { ! if (ghostly && otmp->oattached == OATTACHED_MONST && otmp->oxlth) { ! struct monst *mtmp = (struct monst *)otmp->oextra; ! ! mtmp->m_id = 0; ! } if (ghostly && otmp->oattached == OATTACHED_M_ID) { (void) memcpy((genericptr_t)&oldid, (genericptr_t)otmp->oextra, sizeof(oldid)); *************** *** 930,935 **** --- 958,964 ---- else otmp->oattached = OATTACHED_NOTHING; } + } } *** nethack-3.3.1/src/rip.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/rip.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)rip.c 3.3 97/11/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)rip.c 3.4 2001/09/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,14 **** extern const char *killed_by_prefix[]; ! #if defined(TTY_GRAPHICS) || defined(X11_GRAPHICS) || defined(GEM_GRAPHICS) # define TEXT_TOMBSTONE #endif #if defined(mac) || defined(__BEOS__) || defined(WIN32_GRAPHICS) --- 8,14 ---- extern const char *killed_by_prefix[]; ! #if defined(TTY_GRAPHICS) || defined(X11_GRAPHICS) || defined(GEM_GRAPHICS) || defined(MSWIN_GRAPHICS) # define TEXT_TOMBSTONE #endif #if defined(mac) || defined(__BEOS__) || defined(WIN32_GRAPHICS) *************** *** 108,114 **** --- 108,118 ---- center(NAME_LINE, buf); /* Put $ on stone */ + #ifndef GOLDOBJ Sprintf(buf, "%ld Au", u.ugold); + #else + Sprintf(buf, "%ld Au", done_money); + #endif buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */ center(GOLD_LINE, buf); *** nethack-3.3.1/src/rnd.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/rnd.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)rnd.c 3.3 96/02/07 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" --- 1,4 ---- ! /* SCCS Id: @(#)rnd.c 3.4 1996/02/07 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" *** nethack-3.3.1/src/role.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/role.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)role.c 3.3 2000/05/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985-1999. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)role.c 3.4 2000/08/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985-1999. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 108,116 **** {"Empiric", 0}, {"Embalmer", 0}, {"Dresser", 0}, ! {"Medici ossium", 0}, {"Herbalist", 0}, ! {"Magister", 0}, {"Physician", 0}, {"Chirurgeon", 0} }, "_Athena", "Hermes", "Poseidon", /* Greek */ --- 108,116 ---- {"Empiric", 0}, {"Embalmer", 0}, {"Dresser", 0}, ! {"Medicus ossium", "Medica ossium"}, {"Herbalist", 0}, ! {"Magister", "Magistra"}, {"Physician", 0}, {"Chirurgeon", 0} }, "_Athena", "Hermes", "Poseidon", /* Greek */ *************** *** 122,128 **** MH_HUMAN|MH_GNOME | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL, /* Str Int Wis Dex Con Cha */ { 7, 7, 13, 7, 11, 16 }, ! { 15, 20, 20, 15, 25, 10 }, /* Init Lower Higher */ { 11, 0, 0, 8, 1, 0 }, /* Hit points */ { 1, 4, 0, 1, 0, 2 },20, /* Energy */ --- 122,128 ---- MH_HUMAN|MH_GNOME | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL, /* Str Int Wis Dex Con Cha */ { 7, 7, 13, 7, 11, 16 }, ! { 15, 20, 20, 15, 25, 5 }, /* Init Lower Higher */ { 11, 0, 0, 8, 1, 0 }, /* Hit points */ { 1, 4, 0, 1, 0, 2 },20, /* Energy */ *************** *** 135,142 **** {"Sergeant", 0}, {"Knight", 0}, {"Banneret", 0}, ! {"Chevalier", 0}, ! {"Seignieur", 0}, {"Paladin", 0} }, "Lugh", "_Brigit", "Manannan Mac Lir", /* Celtic */ "Kni", "Camelot Castle", "the Isle of Glass", --- 135,142 ---- {"Sergeant", 0}, {"Knight", 0}, {"Banneret", 0}, ! {"Chevalier", "Chevaliere"}, ! {"Seignieur", "Dame"}, {"Paladin", 0} }, "Lugh", "_Brigit", "Manannan Mac Lir", /* Celtic */ "Kni", "Camelot Castle", "the Isle of Glass", *************** *** 147,153 **** MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL, /* Str Int Wis Dex Con Cha */ { 13, 7, 14, 8, 10, 17 }, ! { 20, 15, 15, 10, 20, 10 }, /* Init Lower Higher */ { 14, 0, 0, 8, 2, 0 }, /* Hit points */ { 1, 4, 0, 1, 0, 2 },10, /* Energy */ --- 147,153 ---- MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL, /* Str Int Wis Dex Con Cha */ { 13, 7, 14, 8, 10, 17 }, ! { 30, 15, 15, 10, 20, 10 }, /* Init Lower Higher */ { 14, 0, 0, 8, 2, 0 }, /* Hit points */ { 1, 4, 0, 1, 0, 2 },10, /* Energy */ *************** *** 277,283 **** { {"Samurai", 0}, { {"Hatamoto", 0}, /* Banner Knight */ {"Ronin", 0}, /* no allegiance */ ! {"Ninja", 0}, /* secret society */ {"Joshu", 0}, /* heads a castle */ {"Ryoshu", 0}, /* has a territory */ {"Kokushu", 0}, /* heads a province */ --- 277,283 ---- { {"Samurai", 0}, { {"Hatamoto", 0}, /* Banner Knight */ {"Ronin", 0}, /* no allegiance */ ! {"Ninja", "Kunoichi"}, /* secret society */ {"Joshu", 0}, /* heads a castle */ {"Ryoshu", 0}, /* has a territory */ {"Kokushu", 0}, /* heads a province */ *************** *** 293,299 **** MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL, /* Str Int Wis Dex Con Cha */ { 10, 8, 7, 10, 17, 6 }, ! { 30, 10, 10, 30, 14, 10 }, /* Init Lower Higher */ { 13, 0, 0, 8, 1, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },11, /* Energy */ --- 293,299 ---- MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL, /* Str Int Wis Dex Con Cha */ { 10, 8, 7, 10, 17, 6 }, ! { 30, 10, 8, 30, 14, 8 }, /* Init Lower Higher */ { 13, 0, 0, 8, 1, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },11, /* Energy */ *************** *** 362,370 **** {"Wizard", 0}, {"Mage", 0} }, "Ptah", "Thoth", "Anhur", /* Egyptian */ ! "Wiz", "the Tower of the Balance", "the Tower of Darkness", PM_WIZARD, NON_PM, PM_KITTEN, ! PM_WIZARD_OF_BALANCE, PM_APPRENTICE, PM_DARK_ONE, PM_VAMPIRE_BAT, PM_XORN, S_BAT, S_WRAITH, ART_EYE_OF_THE_AETHIOPICA, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC | ROLE_MALE|ROLE_FEMALE | --- 362,370 ---- {"Wizard", 0}, {"Mage", 0} }, "Ptah", "Thoth", "Anhur", /* Egyptian */ ! "Wiz", "the Lonely Tower", "the Tower of Darkness", PM_WIZARD, NON_PM, PM_KITTEN, ! PM_NEFERET_THE_GREEN, PM_APPRENTICE, PM_DARK_ONE, PM_VAMPIRE_BAT, PM_XORN, S_BAT, S_WRAITH, ART_EYE_OF_THE_AETHIOPICA, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC | ROLE_MALE|ROLE_FEMALE | *************** *** 502,507 **** --- 502,511 ---- {"evil", "unaligned", "Una", 0, A_NONE} }; + STATIC_DCL char * FDECL(promptsep, (char *, int)); + STATIC_DCL int FDECL(role_gendercount, (int)); + STATIC_DCL int FDECL(race_alignmentcount, (int)); + /* used by str2XXX() */ static char NEARDATA randomstr[] = "random"; *************** *** 789,797 **** } /* pick a random role subject to any racenum/gendnum/alignnum constraints */ int ! pick_role(racenum, gendnum, alignnum) ! int racenum, gendnum, alignnum; { int i; int roles_ok = 0; --- 793,803 ---- } /* pick a random role subject to any racenum/gendnum/alignnum constraints */ + /* If pickhow == PICK_RIGID a role is returned only if there is */ + /* a single possibility */ int ! pick_role(racenum, gendnum, alignnum, pickhow) ! int racenum, gendnum, alignnum, pickhow; { int i; int roles_ok = 0; *************** *** 800,806 **** if (ok_role(i, racenum, gendnum, alignnum)) roles_ok++; } ! if (roles_ok == 0) return ROLE_NONE; roles_ok = rn2(roles_ok); for (i = 0; i < SIZE(roles)-1; i++) { --- 806,812 ---- if (ok_role(i, racenum, gendnum, alignnum)) roles_ok++; } ! if (roles_ok == 0 || (roles_ok > 1 && pickhow == PICK_RIGID)) return ROLE_NONE; roles_ok = rn2(roles_ok); for (i = 0; i < SIZE(roles)-1; i++) { *************** *** 853,861 **** } /* pick a random race subject to any rolenum/gendnum/alignnum constraints */ int ! pick_race(rolenum, gendnum, alignnum) ! int rolenum, gendnum, alignnum; { int i; int races_ok = 0; --- 859,869 ---- } /* pick a random race subject to any rolenum/gendnum/alignnum constraints */ + /* If pickhow == PICK_RIGID a race is returned only if there is */ + /* a single possibility */ int ! pick_race(rolenum, gendnum, alignnum, pickhow) ! int rolenum, gendnum, alignnum, pickhow; { int i; int races_ok = 0; *************** *** 864,870 **** if (ok_race(rolenum, i, gendnum, alignnum)) races_ok++; } ! if (races_ok == 0) return ROLE_NONE; races_ok = rn2(races_ok); for (i = 0; i < SIZE(races)-1; i++) { --- 872,878 ---- if (ok_race(rolenum, i, gendnum, alignnum)) races_ok++; } ! if (races_ok == 0 || (races_ok > 1 && pickhow == PICK_RIGID)) return ROLE_NONE; races_ok = rn2(races_ok); for (i = 0; i < SIZE(races)-1; i++) { *************** *** 913,921 **** /* pick a random gender subject to any rolenum/racenum/alignnum constraints */ /* gender and alignment are not comparable (and also not constrainable) */ int ! pick_gend(rolenum, racenum, alignnum) ! int rolenum, racenum, alignnum; { int i; int gends_ok = 0; --- 921,931 ---- /* pick a random gender subject to any rolenum/racenum/alignnum constraints */ /* gender and alignment are not comparable (and also not constrainable) */ + /* If pickhow == PICK_RIGID a gender is returned only if there is */ + /* a single possibility */ int ! pick_gend(rolenum, racenum, alignnum, pickhow) ! int rolenum, racenum, alignnum, pickhow; { int i; int gends_ok = 0; *************** *** 924,930 **** if (ok_gend(rolenum, racenum, i, alignnum)) gends_ok++; } ! if (gends_ok == 0) return ROLE_NONE; gends_ok = rn2(gends_ok); for (i = 0; i < ROLE_GENDERS; i++) { --- 934,940 ---- if (ok_gend(rolenum, racenum, i, alignnum)) gends_ok++; } ! if (gends_ok == 0 || (gends_ok > 1 && pickhow == PICK_RIGID)) return ROLE_NONE; gends_ok = rn2(gends_ok); for (i = 0; i < ROLE_GENDERS; i++) { *************** *** 973,981 **** /* pick a random alignment subject to any rolenum/racenum/gendnum constraints */ /* alignment and gender are not comparable (and also not constrainable) */ int ! pick_align(rolenum, racenum, gendnum) ! int rolenum, racenum, gendnum; { int i; int aligns_ok = 0; --- 983,993 ---- /* pick a random alignment subject to any rolenum/racenum/gendnum constraints */ /* alignment and gender are not comparable (and also not constrainable) */ + /* If pickhow == PICK_RIGID an alignment is returned only if there is */ + /* a single possibility */ int ! pick_align(rolenum, racenum, gendnum, pickhow) ! int rolenum, racenum, gendnum, pickhow; { int i; int aligns_ok = 0; *************** *** 984,990 **** if (ok_align(rolenum, racenum, gendnum, i)) aligns_ok++; } ! if (aligns_ok == 0) return ROLE_NONE; aligns_ok = rn2(aligns_ok); for (i = 0; i < ROLE_ALIGNS; i++) { --- 996,1002 ---- if (ok_align(rolenum, racenum, gendnum, i)) aligns_ok++; } ! if (aligns_ok == 0 || (aligns_ok > 1 && pickhow == PICK_RIGID)) return ROLE_NONE; aligns_ok = rn2(aligns_ok); for (i = 0; i < ROLE_ALIGNS; i++) { *************** *** 998,1003 **** --- 1010,1292 ---- return ROLE_NONE; } + void + rigid_role_checks() + { + /* Some roles are limited to a single race, alignment, or gender and + * calling this routine prior to XXX_player_selection() will help + * prevent an extraneous prompt that actually doesn't allow + * you to choose anything further. Note the use of PICK_RIGID which + * causes the pick_XX() routine to return a value only if there is one + * single possible selection, otherwise it returns ROLE_NONE. + * + */ + if (flags.initrole == ROLE_RANDOM) { + /* If the role was explicitly specified as ROLE_RANDOM + * via -uXXXX-@ then choose the role in here to narrow down + * later choices. Pick a random role in this case. + */ + flags.initrole = pick_role(flags.initrace, flags.initgend, + flags.initalign, PICK_RANDOM); + if (flags.initrole < 0) + flags.initrole = randrole(); + } + if (flags.initrole != ROLE_NONE) { + if (flags.initrace == ROLE_NONE) + flags.initrace = pick_race(flags.initrole, flags.initgend, + flags.initalign, PICK_RIGID); + if (flags.initalign == ROLE_NONE) + flags.initalign = pick_align(flags.initrole, flags.initrace, + flags.initgend, PICK_RIGID); + if (flags.initgend == ROLE_NONE) + flags.initgend = pick_gend(flags.initrole, flags.initrace, + flags.initalign, PICK_RIGID); + } + } + + #define BP_ALIGN 0 + #define BP_GEND 1 + #define BP_RACE 2 + #define BP_ROLE 3 + #define NUM_BP 4 + + STATIC_VAR char pa[NUM_BP], post_attribs; + + STATIC_OVL char * + promptsep(buf, num_post_attribs) + char *buf; + int num_post_attribs; + { + const char *conj = "and "; + if (num_post_attribs > 1 + && post_attribs < num_post_attribs && post_attribs > 1) + Strcat(buf, ","); + Strcat(buf, " "); + --post_attribs; + if (!post_attribs && num_post_attribs > 1) Strcat(buf, conj); + return buf; + } + + STATIC_OVL int + role_gendercount(rolenum) + int rolenum; + { + int gendcount = 0; + if (validrole(rolenum)) { + if (roles[rolenum].allow & ROLE_MALE) ++gendcount; + if (roles[rolenum].allow & ROLE_FEMALE) ++gendcount; + if (roles[rolenum].allow & ROLE_NEUTER) ++gendcount; + } + return gendcount; + } + + STATIC_OVL int + race_alignmentcount(racenum) + int racenum; + { + int aligncount = 0; + if (racenum != ROLE_NONE && racenum != ROLE_RANDOM) { + if (races[racenum].allow & ROLE_CHAOTIC) ++aligncount; + if (races[racenum].allow & ROLE_LAWFUL) ++aligncount; + if (races[racenum].allow & ROLE_NEUTRAL) ++aligncount; + } + return aligncount; + } + + char * + root_plselection_prompt(suppliedbuf, buflen, rolenum, racenum, gendnum, alignnum) + char *suppliedbuf; + int buflen, rolenum, racenum, gendnum, alignnum; + { + int k, gendercount = 0, aligncount = 0; + char buf[BUFSZ]; + char *err_ret = " character's"; + boolean donefirst = FALSE; + + if (!suppliedbuf || buflen < 1) return err_ret; + + /* initialize these static variables each time this is called */ + post_attribs = 0; + for (k=0; k < NUM_BP; ++k) + pa[k] = 0; + buf[0] = '\0'; + *suppliedbuf = '\0'; + + /* How many alignments are allowed for the desired race? */ + if (racenum != ROLE_NONE && racenum != ROLE_RANDOM) + aligncount = race_alignmentcount(racenum); + + if (alignnum != ROLE_NONE && alignnum != ROLE_RANDOM) { + /* if race specified, and multiple choice of alignments for it */ + if ((racenum >= 0) && (aligncount > 1)) { + if (donefirst) Strcat(buf, " "); + Strcat(buf, aligns[alignnum].adj); + donefirst = TRUE; + } else { + if (donefirst) Strcat(buf, " "); + Strcat(buf, aligns[alignnum].adj); + donefirst = TRUE; + } + } else { + /* if alignment not specified, but race is specified + and only one choice of alignment for that race then + don't include it in the later list */ + if ((((racenum != ROLE_NONE && racenum != ROLE_RANDOM) && + ok_race(rolenum, racenum, gendnum, alignnum)) + && (aligncount > 1)) + || (racenum == ROLE_NONE || racenum == ROLE_RANDOM)) { + pa[BP_ALIGN] = 1; + post_attribs++; + } + } + /* */ + + /* How many genders are allowed for the desired role? */ + if (validrole(rolenum)) + gendercount = role_gendercount(rolenum); + + if (gendnum != ROLE_NONE && gendnum != ROLE_RANDOM) { + if (validrole(rolenum)) { + /* if role specified, and multiple choice of genders for it, + and name of role itself does not distinguish gender */ + if ((rolenum != ROLE_NONE) && (gendercount > 1) + && !roles[rolenum].name.f) { + if (donefirst) Strcat(buf, " "); + Strcat(buf, genders[gendnum].adj); + donefirst = TRUE; + } + } else { + if (donefirst) Strcat(buf, " "); + Strcat(buf, genders[gendnum].adj); + donefirst = TRUE; + } + } else { + /* if gender not specified, but role is specified + and only one choice of gender then + don't include it in the later list */ + if ((validrole(rolenum) && (gendercount > 1)) || !validrole(rolenum)) { + pa[BP_GEND] = 1; + post_attribs++; + } + } + /* */ + + if (racenum != ROLE_NONE && racenum != ROLE_RANDOM) { + if (validrole(rolenum) && ok_race(rolenum, racenum, gendnum, alignnum)) { + if (donefirst) Strcat(buf, " "); + Strcat(buf, (rolenum == ROLE_NONE) ? + races[racenum].noun : + races[racenum].adj); + donefirst = TRUE; + } else if (!validrole(rolenum)) { + if (donefirst) Strcat(buf, " "); + Strcat(buf, races[racenum].noun); + donefirst = TRUE; + } else { + pa[BP_RACE] = 1; + post_attribs++; + } + } else { + pa[BP_RACE] = 1; + post_attribs++; + } + /* || */ + + if (validrole(rolenum)) { + if (donefirst) Strcat(buf, " "); + if (gendnum != ROLE_NONE) { + if (gendnum == 1 && roles[rolenum].name.f) + Strcat(buf, roles[rolenum].name.f); + else + Strcat(buf, roles[rolenum].name.m); + } else { + if (roles[rolenum].name.f) { + Strcat(buf, roles[rolenum].name.m); + Strcat(buf, "/"); + Strcat(buf, roles[rolenum].name.f); + } else + Strcat(buf, roles[rolenum].name.m); + } + donefirst = TRUE; + } else if (rolenum == ROLE_NONE) { + pa[BP_ROLE] = 1; + post_attribs++; + } + + if ((racenum == ROLE_NONE || racenum == ROLE_RANDOM) && !validrole(rolenum)) { + if (donefirst) Strcat(buf, " "); + Strcat(buf, "character"); + donefirst = TRUE; + } + /* || + * || + */ + if (buflen > (int) (strlen(buf) + 1)) { + Strcpy(suppliedbuf, buf); + return suppliedbuf; + } else + return err_ret; + } + + char * + build_plselection_prompt(buf, buflen, rolenum, racenum, gendnum, alignnum) + char *buf; + int buflen, rolenum, racenum, gendnum, alignnum; + { + const char *defprompt = "Shall I pick a character for you? [ynq] "; + int num_post_attribs = 0; + char tmpbuf[BUFSZ]; + + if (buflen < QBUFSZ) + return (char *)defprompt; + + Strcpy(tmpbuf, "Shall I pick "); + if (racenum != ROLE_NONE || validrole(rolenum)) + Strcat(tmpbuf, "your "); + else { + Strcat(tmpbuf, "a "); + } + /* */ + + (void) root_plselection_prompt(eos(tmpbuf), buflen - strlen(tmpbuf), + rolenum, racenum, gendnum, alignnum); + Sprintf(buf, "%s", s_suffix(tmpbuf)); + + /* buf should now be: + * < your lawful female gnomish cavewoman's> || + * || + * + * Now append the post attributes to it + */ + + num_post_attribs = post_attribs; + if (post_attribs) { + if (pa[BP_RACE]) { + (void) promptsep(eos(buf), num_post_attribs); + Strcat(buf, "race"); + } + if (pa[BP_ROLE]) { + (void) promptsep(eos(buf), num_post_attribs); + Strcat(buf, "role"); + } + if (pa[BP_GEND]) { + (void) promptsep(eos(buf), num_post_attribs); + Strcat(buf, "gender"); + } + if (pa[BP_ALIGN]) { + (void) promptsep(eos(buf), num_post_attribs); + Strcat(buf, "alignment"); + } + } + Strcat(buf, " for you? [ynq] "); + return buf; + } + + #undef BP_ALIGN + #undef BP_GEND + #undef BP_RACE + #undef BP_ROLE + #undef NUM_BP void plnamesuffix() *** nethack-3.3.1/src/rumors.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/rumors.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)rumors.c 3.3 96/04/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)rumors.c 3.4 1996/04/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 146,156 **** boolean reading = (mechanism == BY_COOKIE || mechanism == BY_PAPER); ! if (reading && Blind) { if (mechanism == BY_COOKIE) pline(fortune_msg); pline("What a pity that you cannot read it!"); ! return; } line = getrumor(truth, buf, reading ? FALSE : TRUE); if (!*line) --- 146,161 ---- boolean reading = (mechanism == BY_COOKIE || mechanism == BY_PAPER); ! if (reading) { ! /* deal with various things that prevent reading */ ! if (is_fainted() && mechanism == BY_COOKIE) ! return; ! else if (Blind) { if (mechanism == BY_COOKIE) pline(fortune_msg); pline("What a pity that you cannot read it!"); ! return; ! } } line = getrumor(truth, buf, reading ? FALSE : TRUE); if (!*line) *************** *** 282,287 **** --- 287,295 ---- doconsult(oracl) register struct monst *oracl; { + #ifdef GOLDOBJ + long umoney = money_cnt(invent); + #endif int u_pay, minor_cost = 50, major_cost = 500 + 50 * u.ulevel; int add_xpts; char qbuf[QBUFSZ]; *************** *** 294,331 **** } else if (!oracl->mpeaceful) { pline("%s is in no mood for consultations.", Monnam(oracl)); return 0; } else if (!u.ugold) { You("have no money."); return 0; } Sprintf(qbuf, ! "\"Wilt thou settle for a minor consultation?\" (%d zorkmids)", ! minor_cost); switch (ynq(qbuf)) { default: case 'q': return 0; case 'y': if (u.ugold < (long)minor_cost) { You("don't even have enough money for that!"); return 0; } u_pay = minor_cost; break; case 'n': if (u.ugold <= (long)minor_cost || /* don't even ask */ (oracle_cnt == 1 || oracle_flg < 0)) return 0; Sprintf(qbuf, ! "\"Then dost thou desire a major one?\" (%d zorkmids)", ! major_cost); if (yn(qbuf) != 'y') return 0; u_pay = (u.ugold < (long)major_cost ? (int)u.ugold : major_cost); break; } u.ugold -= (long)u_pay; oracl->mgold += (long)u_pay; flags.botl = 1; add_xpts = 0; /* first oracle of each type gives experience points */ if (u_pay == minor_cost) { --- 302,360 ---- } else if (!oracl->mpeaceful) { pline("%s is in no mood for consultations.", Monnam(oracl)); return 0; + #ifndef GOLDOBJ } else if (!u.ugold) { + #else + } else if (!umoney) { + #endif You("have no money."); return 0; } Sprintf(qbuf, ! "\"Wilt thou settle for a minor consultation?\" (%d %s)", ! minor_cost, currency((long)minor_cost)); switch (ynq(qbuf)) { default: case 'q': return 0; case 'y': + #ifndef GOLDOBJ if (u.ugold < (long)minor_cost) { + #else + if (umoney < (long)minor_cost) { + #endif You("don't even have enough money for that!"); return 0; } u_pay = minor_cost; break; case 'n': + #ifndef GOLDOBJ if (u.ugold <= (long)minor_cost || /* don't even ask */ + #else + if (umoney <= (long)minor_cost || /* don't even ask */ + #endif (oracle_cnt == 1 || oracle_flg < 0)) return 0; Sprintf(qbuf, ! "\"Then dost thou desire a major one?\" (%d %s)", ! major_cost, currency((long)major_cost)); if (yn(qbuf) != 'y') return 0; + #ifndef GOLDOBJ u_pay = (u.ugold < (long)major_cost ? (int)u.ugold : major_cost); + #else + u_pay = (umoney < (long)major_cost ? (int)umoney + : major_cost); + #endif break; } + #ifndef GOLDOBJ u.ugold -= (long)u_pay; oracl->mgold += (long)u_pay; + #else + money2mon(oracl, (long)u_pay); + #endif flags.botl = 1; add_xpts = 0; /* first oracle of each type gives experience points */ if (u_pay == minor_cost) { *** nethack-3.3.1/src/save.c Thu Feb 14 07:59:29 2002 --- nethack-3.4.0/src/save.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)save.c 3.3 2000/07/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)save.c 3.4 2002/01/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 20,26 **** #endif #ifdef MICRO ! int dotcnt; /* also used in restore */ #endif #ifdef ZEROCOMP --- 20,26 ---- #endif #ifdef MICRO ! int dotcnt, dotrow; /* also used in restore */ #endif #ifdef ZEROCOMP *************** *** 43,56 **** #define nulls nul #endif ! #if defined(UNIX) || defined(VMS) || defined(__EMX__) #define HUP if (!program_state.done_hup) #else - # ifdef WIN32 - #define HUP if (!program_state.exiting) - # else #define HUP - # endif #endif /* need to preserve these during save to avoid accessing freed memory */ --- 43,52 ---- #define nulls nul #endif ! #if defined(UNIX) || defined(VMS) || defined(__EMX__) || defined(WIN32) #define HUP if (!program_state.done_hup) #else #define HUP #endif /* need to preserve these during save to avoid accessing freed memory */ *************** *** 81,87 **** } ! #if defined(UNIX) || defined(VMS) || defined (__EMX__) /*ARGSUSED*/ void hangup(sig_unused) /* called as signal() handler, so sent at least one arg */ --- 77,83 ---- } ! #if defined(UNIX) || defined(VMS) || defined (__EMX__) || defined(WIN32) /*ARGSUSED*/ void hangup(sig_unused) /* called as signal() handler, so sent at least one arg */ *************** *** 94,107 **** terminate(EXIT_FAILURE); # endif # else /* SAVEONHANGUP */ ! if (!program_state.done_hup++ && program_state.something_worth_saving) { (void) dosave0(); # ifdef VMS ! /* don't call exit when already within an exit handler; ! that would cancel any other pending user-mode handlers */ ! if (!program_state.exiting) # endif ! terminate(EXIT_FAILURE); } # endif return; --- 90,107 ---- terminate(EXIT_FAILURE); # endif # else /* SAVEONHANGUP */ ! if (!program_state.done_hup++) { ! if (program_state.something_worth_saving) (void) dosave0(); # ifdef VMS ! /* don't call exit when already within an exit handler; ! that would cancel any other pending user-mode handlers */ ! if (!program_state.exiting) # endif ! { ! clearlocks(); ! terminate(EXIT_FAILURE); ! } } # endif return; *************** *** 156,161 **** --- 156,164 ---- return(0); } + vision_recalc(2); /* shut down vision to prevent problems + in the event of an impossible() call */ + /* undo date-dependent luck adjustments made at startup time */ if(flags.moonphase == FULL_MOON) /* ut-sally!fletcher */ change_luck(-1); /* and unido!ab */ *************** *** 166,171 **** --- 169,175 ---- #ifdef MICRO dotcnt = 0; + dotrow = 2; curs(WIN_MAP, 1, 1); if (strncmpi("X11", windowprocs.name, 3)) putstr(WIN_MAP, 0, "Saving:"); *************** *** 182,190 **** for (ltmp = 1; ltmp <= maxledgerno(); ltmp++) if (ltmp != ledger_no(&u.uz) && level_info[ltmp].where) needed += level_info[ltmp].size + (sizeof ltmp); - # ifdef AMIGA - needed += ami_wbench_iconsize(fq_save); - # endif fds = freediskspace(fq_save); if (needed > fds) { HUP { --- 186,191 ---- *************** *** 216,227 **** */ uz_save = u.uz; u.uz.dnum = u.uz.dlevel = 0; for(ltmp = (xchar)1; ltmp <= maxledgerno(); ltmp++) { if (ltmp == ledger_no(&uz_save)) continue; if (!(level_info[ltmp].flags & LFILE_EXISTS)) continue; #ifdef MICRO ! curs(WIN_MAP, 1 + dotcnt++, 2); if (strncmpi("X11", windowprocs.name, 3)){ putstr(WIN_MAP, 0, "."); } --- 217,239 ---- */ uz_save = u.uz; u.uz.dnum = u.uz.dlevel = 0; + /* these pointers are no longer valid, and at least u.usteed + * may mislead place_monster() on other levels + */ + u.ustuck = (struct monst *)0; + #ifdef STEED + u.usteed = (struct monst *)0; + #endif for(ltmp = (xchar)1; ltmp <= maxledgerno(); ltmp++) { if (ltmp == ledger_no(&uz_save)) continue; if (!(level_info[ltmp].flags & LFILE_EXISTS)) continue; #ifdef MICRO ! curs(WIN_MAP, 1 + dotcnt++, dotrow); ! if (dotcnt >= (COLNO - 1)) { ! dotrow++; ! dotcnt = 0; ! } if (strncmpi("X11", windowprocs.name, 3)){ putstr(WIN_MAP, 0, "."); } *************** *** 250,258 **** delete_levelfile(ledger_no(&u.uz)); delete_levelfile(0); compress(fq_save); - #ifdef AMIGA - ami_wbench_iconwrite(fq_save); - #endif return(1); } --- 262,267 ---- *************** *** 831,837 **** if (Has_contents(otmp)) saveobjchn(fd,otmp->cobj,mode); if (release_data(mode)) { ! if(otmp->oclass == FOOD_CLASS) food_disappears(otmp); otmp->where = OBJ_FREE; /* set to free so dealloc will work */ otmp->timed = 0; /* not timed any more */ otmp->lamplit = 0; /* caller handled lights */ --- 840,847 ---- if (Has_contents(otmp)) saveobjchn(fd,otmp->cobj,mode); if (release_data(mode)) { ! if (otmp->oclass == FOOD_CLASS) food_disappears(otmp); ! if (otmp->oclass == SPBOOK_CLASS) book_disappears(otmp); otmp->where = OBJ_FREE; /* set to free so dealloc will work */ otmp->timed = 0; /* not timed any more */ otmp->lamplit = 0; /* caller handled lights */ *************** *** 980,985 **** --- 990,1003 ---- freenames(); free_waterlevel(); free_dungeons(); + + /* some pointers in iflags */ + if (iflags.wc_font_map) free(iflags.wc_font_map); + if (iflags.wc_font_message) free(iflags.wc_font_message); + if (iflags.wc_font_text) free(iflags.wc_font_text); + if (iflags.wc_font_menu) free(iflags.wc_font_menu); + if (iflags.wc_font_status) free(iflags.wc_font_status); + if (iflags.wc_tile_file) free(iflags.wc_tile_file); #endif /* FREE_ALL_MEMORY */ return; *** nethack-3.3.1/src/shk.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/shk.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)shk.c 3.3 2000/03/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)shk.c 3.4 2002/01/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 63,68 **** --- 63,71 ---- STATIC_DCL void FDECL(add_to_billobjs, (struct obj *)); STATIC_DCL void FDECL(bill_box_content, (struct obj *, BOOLEAN_P, BOOLEAN_P, struct monst *)); + #ifdef OVL1 + static void FDECL(rob_shop, (struct monst *)); + #endif #ifdef OVLB /* *************** *** 70,75 **** --- 73,153 ---- obj->quan <= bp->bquan */ + + #ifdef GOLDOBJ + /* + Transfer money from inventory to monster when paying + shopkeepers, priests, oracle, succubus, & other demons. + Simple with only gold coins. + This routine will handle money changing when multiple + coin types is implemented, only appropriate + monsters will pay change. (Peaceful shopkeepers, priests + & the oracle try to maintain goodwill while selling + their wares or services. Angry monsters and all demons + will keep anything they get their hands on. + Returns the amount actually paid, so we can know + if the monster kept the change. + */ + long money2mon(mon, amount) + struct monst *mon; + long amount; + { + struct obj *ygold = findgold(invent); + + if (amount <= 0) { + impossible("%s payment in money2mon!", amount ? "negative" : "zero"); + return 0L; + } + if (!ygold || ygold->quan < amount) { + impossible("Paying without %s money?", ygold ? "enough" : ""); + return 0L; + } + + if (ygold->quan > amount) ygold = splitobj(ygold, amount); + else if (ygold->owornmask) remove_worn_item(ygold); /* quiver */ + freeinv(ygold); + add_to_minv(mon, ygold); + flags.botl = 1; + return amount; + } + + + /* + Transfer money from monster to inventory. + Used when the shopkeeper pay for items, and when + the priest gives you money for an ale. + */ + void + money2u(mon, amount) + struct monst *mon; + long amount; + { + struct obj *mongold = findgold(mon->minvent); + + if (amount <= 0) { + impossible("%s payment in money2u!", amount ? "negative" : "zero"); + return; + } + if (!mongold || mongold->quan < amount) { + impossible("%s paying without %s money?", a_monnam(mon), + mongold ? "enough" : ""); + return; + } + + if (mongold->quan > amount) mongold = splitobj(mongold, amount); + obj_extract_self(mongold); + + if (!merge_choice(invent, mongold) && inv_cnt() >= 52) { + You("have no room for the money!"); + dropy(mongold); + } else { + addinv(mongold); + flags.botl = 1; + } + } + + #endif /* GOLDOBJ */ + STATIC_OVL struct monst * next_shkp(shkp, withbill) register struct monst *shkp; *************** *** 99,122 **** void shkgone(mtmp) /* called in mon.c */ ! register struct monst *mtmp; { ! register struct eshk *eshk = ESHK(mtmp); ! if(on_level(&(eshk->shoplevel), &u.uz)) { ! remove_damage(mtmp, TRUE); ! rooms[eshk->shoproom - ROOMOFFSET].resident ! = (struct monst *)0; ! if(!search_special(ANY_SHOP)) ! level.flags.has_shop = 0; ! } ! /* make sure bill is set only when the ! * dead shk is the resident shk. */ ! if(*u.ushops == eshk->shoproom) { ! setpaid(mtmp); ! /* dump core when referenced */ ! ESHK(mtmp)->bill_p = (struct bill_x *) -1000; ! u.ushops[0] = '\0'; } } --- 177,212 ---- void shkgone(mtmp) /* called in mon.c */ ! struct monst *mtmp; { ! struct eshk *eshk = ESHK(mtmp); ! struct mkroom *sroom = &rooms[eshk->shoproom - ROOMOFFSET]; ! struct obj *otmp; ! char *p; ! int sx, sy; ! ! /* [BUG: some of this should be done on the shop level */ ! /* even when the shk dies on a different level.] */ ! if (on_level(&eshk->shoplevel, &u.uz)) { ! remove_damage(mtmp, TRUE); ! sroom->resident = (struct monst *)0; ! if (!search_special(ANY_SHOP)) ! level.flags.has_shop = 0; ! ! /* items on shop floor revert to ordinary objects */ ! for (sx = sroom->lx; sx <= sroom->hx; sx++) ! for (sy = sroom->ly; sy <= sroom->hy; sy++) ! for (otmp = level.objects[sx][sy]; otmp; otmp = otmp->nexthere) ! otmp->no_charge = 0; ! /* Make sure bill is set only when the ! dead shk is the resident shk. */ ! if ((p = index(u.ushops, eshk->shoproom)) != 0) { ! setpaid(mtmp); ! eshk->bill_p = (struct bill_x *)0; ! /* remove eshk->shoproom from u.ushops */ ! do { *p = *(p + 1); } while (*++p); ! } } } *************** *** 178,190 **** #endif /*OVL3*/ #ifdef OVLB STATIC_OVL void ! setpaid(shkp) /* either you paid or left the shop or the shopkeeper died */ register struct monst *shkp; { register struct obj *obj; register struct monst *mtmp; clear_unpaid(invent); clear_unpaid(fobj); clear_unpaid(level.buriedobjlist); --- 268,284 ---- #endif /*OVL3*/ #ifdef OVLB + /* either you paid or left the shop or the shopkeeper died */ STATIC_OVL void ! setpaid(shkp) register struct monst *shkp; { register struct obj *obj; register struct monst *mtmp; + /* FIXME: object handling should be limited to + items which are on this particular shk's bill */ + clear_unpaid(invent); clear_unpaid(fobj); clear_unpaid(level.buriedobjlist); *************** *** 292,303 **** void u_left_shop(leavestring, newlev) ! register char *leavestring; ! register boolean newlev; { ! register struct monst *shkp; ! register struct eshk *eshkp; ! register long total; /* * IF player --- 386,396 ---- void u_left_shop(leavestring, newlev) ! char *leavestring; ! boolean newlev; { ! struct monst *shkp; ! struct eshk *eshkp; /* * IF player *************** *** 311,324 **** return; shkp = shop_keeper(*u.ushops0); ! ! if(!shkp || !inhishop(shkp)) ! /* shk died, teleported, changed levels... */ ! return; eshkp = ESHK(shkp); ! ! if(!eshkp->billct && !eshkp->debit) /* bill is settled */ return; if (!*leavestring && shkp->mcanmove && !shkp->msleeping) { --- 404,414 ---- return; shkp = shop_keeper(*u.ushops0); ! if (!shkp || !inhishop(shkp)) ! return; /* shk died, teleported, changed levels... */ eshkp = ESHK(shkp); ! if (!eshkp->billct && !eshkp->debit) /* bill is settled */ return; if (!*leavestring && shkp->mcanmove && !shkp->msleeping) { *************** *** 332,341 **** plname); return; } total = (addupbill(shkp) + eshkp->debit); if (eshkp->credit >= total) { ! Your("credit of %ld zorkmid%s is used to cover your shopping bill.", ! eshkp->credit, plur(eshkp->credit)); total = 0L; /* credit gets cleared by setpaid() */ } else { You("escaped the shop without paying!"); --- 422,475 ---- plname); return; } + + rob_shop(shkp); + + #ifdef KOPS + call_kops(shkp, (!newlev && levl[u.ux0][u.uy0].edge)); + #else + (void) angry_guards(FALSE); + #endif + } + + /* robbery from outside the shop via telekinesis or grappling hook */ + void + remote_burglary(x, y) + xchar x, y; + { + struct monst *shkp; + struct eshk *eshkp; + + shkp = shop_keeper(*in_rooms(x, y, SHOPBASE)); + if (!shkp || !inhishop(shkp)) + return; /* shk died, teleported, changed levels... */ + + eshkp = ESHK(shkp); + if (!eshkp->billct && !eshkp->debit) /* bill is settled */ + return; + + rob_shop(shkp); + + #ifdef KOPS + /* [might want to set 2nd arg based on distance from shop doorway] */ + call_kops(shkp, FALSE); + #else + (void) angry_guards(FALSE); + #endif + } + + static void + rob_shop(shkp) + struct monst *shkp; + { + struct eshk *eshkp; + long total; + + eshkp = ESHK(shkp); total = (addupbill(shkp) + eshkp->debit); if (eshkp->credit >= total) { ! Your("credit of %ld %s is used to cover your shopping bill.", ! eshkp->credit, currency(eshkp->credit)); total = 0L; /* credit gets cleared by setpaid() */ } else { You("escaped the shop without paying!"); *************** *** 346,362 **** /* by this point, we know an actual robbery has taken place */ eshkp->robbed += total; ! You("stole %ld zorkmid%s worth of merchandise.", ! total, plur(total)); if (!Role_if(PM_ROGUE)) /* stealing is unlawful */ adjalign(-sgn(u.ualign.type)); hot_pursuit(shkp); - #ifdef KOPS - call_kops(shkp, (!newlev && levl[u.ux0][u.uy0].edge)); - #else - (void) angry_guards(FALSE); - #endif } void --- 480,491 ---- /* by this point, we know an actual robbery has taken place */ eshkp->robbed += total; ! You("stole %ld %s worth of merchandise.", ! total, currency(total)); if (!Role_if(PM_ROGUE)) /* stealing is unlawful */ adjalign(-sgn(u.ualign.type)); hot_pursuit(shkp); } void *************** *** 452,457 **** --- 581,588 ---- tool = "mattock"; while ((mattock = mattock->nobj) != 0) if (mattock->otyp == DWARVISH_MATTOCK) ++cnt; + /* [ALI] Shopkeeper identifies mattock(s) */ + if (!Blind) makeknown(DWARVISH_MATTOCK); } verbalize(NOTANGRY(shkp) ? "Will you please leave your %s%s outside?" : *************** *** 488,501 **** /* look up the first object by finding shk whose bill it's on */ for (shkp1 = next_shkp(fmon, TRUE); shkp1; ! shkp1 = next_shkp(shkp1, TRUE)) if ((bp1 = onbill(obj1, shkp1, TRUE)) != 0) break; /* second object is probably owned by same shk; if not, look harder */ if (shkp1 && (bp2 = onbill(obj2, shkp1, TRUE)) != 0) { shkp2 = shkp1; } else { for (shkp2 = next_shkp(fmon, TRUE); shkp2; ! shkp2 = next_shkp(shkp2, TRUE)) if ((bp2 = onbill(obj2, shkp2, TRUE)) != 0) break; } --- 619,632 ---- /* look up the first object by finding shk whose bill it's on */ for (shkp1 = next_shkp(fmon, TRUE); shkp1; ! shkp1 = next_shkp(shkp1->nmon, TRUE)) if ((bp1 = onbill(obj1, shkp1, TRUE)) != 0) break; /* second object is probably owned by same shk; if not, look harder */ if (shkp1 && (bp2 = onbill(obj2, shkp1, TRUE)) != 0) { shkp2 = shkp1; } else { for (shkp2 = next_shkp(fmon, TRUE); shkp2; ! shkp2 = next_shkp(shkp2->nmon, TRUE)) if ((bp2 = onbill(obj2, shkp2, TRUE)) != 0) break; } *************** *** 546,559 **** if ((shkp != this_shkp) ^ pass) continue; eshkp = ESHK(shkp); if ((amt = eshkp->credit) != 0) ! You("have %ld zorkmid%s credit at %s %s.", ! amt, plur(amt), s_suffix(shkname(shkp)), shtypes[eshkp->shoptype - SHOPBASE].name); else if (shkp == this_shkp) You("have no credit in here."); if ((amt = shop_debt(eshkp)) != 0) ! You("owe %s %ld zorkmid%s.", ! shkname(shkp), amt, plur(amt)); else if (shkp == this_shkp) You("don't owe any money here."); } --- 677,690 ---- if ((shkp != this_shkp) ^ pass) continue; eshkp = ESHK(shkp); if ((amt = eshkp->credit) != 0) ! You("have %ld %s credit at %s %s.", ! amt, currency(amt), s_suffix(shkname(shkp)), shtypes[eshkp->shoptype - SHOPBASE].name); else if (shkp == this_shkp) You("have no credit in here."); if ((amt = shop_debt(eshkp)) != 0) ! You("owe %s %ld %s.", ! shkname(shkp), amt, currency(amt)); else if (shkp == this_shkp) You("don't owe any money here."); } *************** *** 642,657 **** register struct bill_x *bpm; register struct monst *shkp; - if (obj->otyp == LEASH && obj->leashmon) o_unleash(obj); if (obj->oclass == FOOD_CLASS) food_disappears(obj); if (Has_contents(obj)) delete_contents(obj); shkp = 0; if (obj->unpaid) { /* look for a shopkeeper who owns this object */ for (shkp = next_shkp(fmon, TRUE); shkp; ! shkp = next_shkp(shkp, TRUE)) if (onbill(obj, shkp, TRUE)) break; } /* sanity check, more or less */ --- 773,788 ---- register struct bill_x *bpm; register struct monst *shkp; if (obj->otyp == LEASH && obj->leashmon) o_unleash(obj); if (obj->oclass == FOOD_CLASS) food_disappears(obj); + if (obj->oclass == SPBOOK_CLASS) book_disappears(obj); if (Has_contents(obj)) delete_contents(obj); shkp = 0; if (obj->unpaid) { /* look for a shopkeeper who owns this object */ for (shkp = next_shkp(fmon, TRUE); shkp; ! shkp = next_shkp(shkp->nmon, TRUE)) if (onbill(obj, shkp, TRUE)) break; } /* sanity check, more or less */ *************** *** 723,730 **** --- 854,866 ---- long robbed = ESHK(shkp)->robbed; long balance = ((tmp <= 0L) ? tmp : check_credit(tmp, shkp)); + #ifndef GOLDOBJ u.ugold -= balance; shkp->mgold += balance; + #else + if (balance > 0) money2mon(shkp, balance); + else if (balance < 0) money2u(shkp, -balance); + #endif flags.botl = 1; if(robbed) { robbed -= tmp; *************** *** 927,933 **** register struct monst *shkp; struct monst *nxtm, *resident; long ltmp; ! int pass, tmp, shk_pronoun, sk = 0, seensk = 0; boolean paid = FALSE, stashed_gold = (hidden_gold() > 0L); multi = 0; --- 1063,1072 ---- register struct monst *shkp; struct monst *nxtm, *resident; long ltmp; ! #ifdef GOLDOBJ ! long umoney; ! #endif ! int pass, tmp, sk = 0, seensk = 0; boolean paid = FALSE, stashed_gold = (hidden_gold() > 0L); multi = 0; *************** *** 1027,1058 **** return 0; } eshkp = ESHK(shkp); - shk_pronoun = pronoun_gender(shkp); ltmp = eshkp->robbed; if(shkp != resident && NOTANGRY(shkp)) { if(!ltmp) You("do not owe %s anything.", mon_nam(shkp)); else if(!u.ugold) { You("%shave no money.", stashed_gold ? "seem to " : ""); if(stashed_gold) pline("But you have some gold stashed away."); } else { long ugold = u.ugold; - if(ugold > ltmp) { You("give %s the %ld gold piece%s %s asked for.", ! mon_nam(shkp), ltmp, plur(ltmp), he[shk_pronoun]); pay(ltmp, shkp); } else { You("give %s all your%s gold.", mon_nam(shkp), stashed_gold ? " openly kept" : ""); pay(u.ugold, shkp); if (stashed_gold) pline("But you have hidden gold!"); } if((ugold < ltmp/2L) || (ugold < ltmp && stashed_gold)) pline("Unfortunately, %s doesn't look satisfied.", ! he[shk_pronoun]); else make_happy_shk(shkp, FALSE); } --- 1166,1215 ---- return 0; } eshkp = ESHK(shkp); ltmp = eshkp->robbed; + if(shkp != resident && NOTANGRY(shkp)) { + #ifdef GOLDOBJ + umoney = money_cnt(invent); + #endif if(!ltmp) You("do not owe %s anything.", mon_nam(shkp)); + #ifndef GOLDOBJ else if(!u.ugold) { + #else + else if(!umoney) { + #endif You("%shave no money.", stashed_gold ? "seem to " : ""); if(stashed_gold) pline("But you have some gold stashed away."); } else { + #ifndef GOLDOBJ long ugold = u.ugold; if(ugold > ltmp) { + #else + if(umoney > ltmp) { + #endif You("give %s the %ld gold piece%s %s asked for.", ! mon_nam(shkp), ltmp, plur(ltmp), mhe(shkp)); pay(ltmp, shkp); } else { You("give %s all your%s gold.", mon_nam(shkp), stashed_gold ? " openly kept" : ""); + #ifndef GOLDOBJ pay(u.ugold, shkp); + #else + pay(umoney, shkp); + #endif if (stashed_gold) pline("But you have hidden gold!"); } + #ifndef GOLDOBJ if((ugold < ltmp/2L) || (ugold < ltmp && stashed_gold)) + #else + if((umoney < ltmp/2L) || (umoney < ltmp && stashed_gold)) + #endif pline("Unfortunately, %s doesn't look satisfied.", ! mhe(shkp)); else make_happy_shk(shkp, FALSE); } *************** *** 1061,1100 **** /* ltmp is still eshkp->robbed here */ if (!eshkp->billct && !eshkp->debit) { if(!ltmp && NOTANGRY(shkp)) { You("do not owe %s anything.", mon_nam(shkp)); if (!u.ugold) pline(no_money, stashed_gold ? " seem to" : ""); } else if(ltmp) { pline("%s is after blood, not money!", Monnam(shkp)); if(u.ugold < ltmp/2L || (u.ugold < ltmp && stashed_gold)) { if (!u.ugold) pline(no_money, stashed_gold ? " seem to" : ""); ! else pline(not_enough_money, him[shk_pronoun]); return(1); } pline("But since %s shop has been robbed recently,", ! his[shk_pronoun]); pline("you %scompensate %s for %s losses.", ! (u.ugold < ltmp) ? "partially " : "", ! mon_nam(shkp), his[shk_pronoun]); pay(u.ugold < ltmp ? u.ugold : ltmp, shkp); make_happy_shk(shkp, FALSE); } else { /* shopkeeper is angry, but has not been robbed -- * door broken, attacked, etc. */ pline("%s is after your hide, not your money!", Monnam(shkp)); if(u.ugold < 1000L) { if (!u.ugold) pline(no_money, stashed_gold ? " seem to" : ""); ! else pline(not_enough_money, him[shk_pronoun]); return(1); } You("try to appease %s by giving %s 1000 gold pieces.", x_monnam(shkp, ARTICLE_THE, "angry", 0, FALSE), ! him[shk_pronoun]); pay(1000L,shkp); if (strncmp(eshkp->customer, plname, PL_NSIZ) || rn2(3)) make_happy_shk(shkp, FALSE); --- 1218,1284 ---- /* ltmp is still eshkp->robbed here */ if (!eshkp->billct && !eshkp->debit) { + #ifdef GOLDOBJ + umoney = money_cnt(invent); + #endif if(!ltmp && NOTANGRY(shkp)) { You("do not owe %s anything.", mon_nam(shkp)); + #ifndef GOLDOBJ if (!u.ugold) + #else + if (!umoney) + #endif pline(no_money, stashed_gold ? " seem to" : ""); } else if(ltmp) { pline("%s is after blood, not money!", Monnam(shkp)); + #ifndef GOLDOBJ if(u.ugold < ltmp/2L || (u.ugold < ltmp && stashed_gold)) { if (!u.ugold) + #else + if(umoney < ltmp/2L || + (umoney < ltmp && stashed_gold)) { + if (!umoney) + #endif pline(no_money, stashed_gold ? " seem to" : ""); ! else pline(not_enough_money, mhim(shkp)); return(1); } pline("But since %s shop has been robbed recently,", ! mhis(shkp)); pline("you %scompensate %s for %s losses.", ! #ifndef GOLDOBJ ! (u.ugold < ltmp) ? ! #else ! (umoney < ltmp) ? ! #endif ! "partially " : "", ! mon_nam(shkp), mhis(shkp)); ! #ifndef GOLDOBJ pay(u.ugold < ltmp ? u.ugold : ltmp, shkp); + #else + pay(umoney < ltmp ? umoney : ltmp, shkp); + #endif make_happy_shk(shkp, FALSE); } else { /* shopkeeper is angry, but has not been robbed -- * door broken, attacked, etc. */ pline("%s is after your hide, not your money!", Monnam(shkp)); + #ifndef GOLDOBJ if(u.ugold < 1000L) { if (!u.ugold) + #else + if(umoney < 1000L) { + if (!umoney) + #endif pline(no_money, stashed_gold ? " seem to" : ""); ! else pline(not_enough_money, mhim(shkp)); return(1); } You("try to appease %s by giving %s 1000 gold pieces.", x_monnam(shkp, ARTICLE_THE, "angry", 0, FALSE), ! mhim(shkp)); pay(1000L,shkp); if (strncmp(eshkp->customer, plname, PL_NSIZ) || rn2(3)) make_happy_shk(shkp, FALSE); *************** *** 1107,1121 **** impossible("dopay: not to shopkeeper?"); if(resident) setpaid(resident); return(0); ! } /* pay debt, if any, first */ if(eshkp->debit) { long dtmp = eshkp->debit; long loan = eshkp->loan; char sbuf[BUFSZ]; ! ! Sprintf(sbuf, "You owe %s %ld zorkmid%s ", ! shkname(shkp), dtmp, plur(dtmp)); if(loan) { if(loan == dtmp) Strcat(sbuf, "you picked up in the store."); --- 1291,1307 ---- impossible("dopay: not to shopkeeper?"); if(resident) setpaid(resident); return(0); ! } /* pay debt, if any, first */ if(eshkp->debit) { long dtmp = eshkp->debit; long loan = eshkp->loan; char sbuf[BUFSZ]; ! #ifdef GOLDOBJ ! umoney = money_cnt(invent); ! #endif ! Sprintf(sbuf, "You owe %s %ld %s ", ! shkname(shkp), dtmp, currency(dtmp)); if(loan) { if(loan == dtmp) Strcat(sbuf, "you picked up in the store."); *************** *** 1123,1129 **** --- 1309,1319 ---- "for gold picked up and the use of merchandise."); } else Strcat(sbuf, "for the use of merchandise."); pline(sbuf); + #ifndef GOLDOBJ if (u.ugold + eshkp->credit < dtmp) { + #else + if (umoney + eshkp->credit < dtmp) { + #endif pline("But you don't%s have enough gold%s.", stashed_gold ? " seem to" : "", eshkp->credit ? " or credit" : ""); *************** *** 1135,1142 **** eshkp->loan = 0L; Your("debt is covered by your credit."); } else if (!eshkp->credit) { u.ugold -= dtmp; ! shkp->mgold += dtmp; eshkp->debit = 0L; eshkp->loan = 0L; You("pay that debt."); --- 1325,1336 ---- eshkp->loan = 0L; Your("debt is covered by your credit."); } else if (!eshkp->credit) { + #ifndef GOLDOBJ u.ugold -= dtmp; ! shkp->mgold += dtmp; ! #else ! money2mon(shkp, dtmp); ! #endif eshkp->debit = 0L; eshkp->loan = 0L; You("pay that debt."); *************** *** 1144,1151 **** --- 1338,1349 ---- } else { dtmp -= eshkp->credit; eshkp->credit = 0L; + #ifndef GOLDOBJ u.ugold -= dtmp; shkp->mgold += dtmp; + #else + money2mon(shkp, dtmp); + #endif eshkp->debit = 0L; eshkp->loan = 0L; pline("That debt is partially offset by your credit."); *************** *** 1158,1171 **** /* now check items on bill */ if (eshkp->billct) { register boolean itemize; ! if (!u.ugold && !eshkp->credit) { You("%shave no money or credit%s.", stashed_gold ? "seem to " : "", paid ? " left" : ""); return(0); } if ((u.ugold + eshkp->credit) < cheapest_item(shkp)) { You("don't have enough money to buy%s the item%s you picked.", eshkp->billct > 1 ? " any of" : "", plur(eshkp->billct)); if(stashed_gold) --- 1356,1377 ---- /* now check items on bill */ if (eshkp->billct) { register boolean itemize; ! #ifndef GOLDOBJ if (!u.ugold && !eshkp->credit) { + #else + umoney = money_cnt(invent); + if (!umoney && !eshkp->credit) { + #endif You("%shave no money or credit%s.", stashed_gold ? "seem to " : "", paid ? " left" : ""); return(0); } + #ifndef GOLDOBJ if ((u.ugold + eshkp->credit) < cheapest_item(shkp)) { + #else + if ((umoney + eshkp->credit) < cheapest_item(shkp)) { + #endif You("don't have enough money to buy%s the item%s you picked.", eshkp->billct > 1 ? " any of" : "", plur(eshkp->billct)); if(stashed_gold) *************** *** 1251,1256 **** --- 1457,1465 ---- { register struct obj *obj = *obj_p; long ltmp, quan, save_quan; + #ifdef GOLDOBJ + long umoney = money_cnt(invent); + #endif int buy; boolean stashed_gold = (hidden_gold() > 0L), consumed = (which == 0); *************** *** 1259,1265 **** --- 1468,1478 ---- impossible("Paid object on bill??"); return PAY_BUY; } + #ifndef GOLDOBJ if(itemize && u.ugold + ESHK(shkp)->credit == 0L){ + #else + if(itemize && umoney + ESHK(shkp)->credit == 0L){ + #endif You("%shave no money or credit left.", stashed_gold ? "seem to " : ""); return PAY_BROKE; *************** *** 1283,1290 **** if (itemize) { char qbuf[BUFSZ]; ! Sprintf(qbuf,"%s for %ld zorkmid%s. Pay?", quan == 1L ? ! Doname2(obj) : doname(obj), ltmp, plur(ltmp)); if (yn(qbuf) == 'n') { buy = PAY_SKIP; /* don't want to buy */ } else if (quan < bp->bquan && !consumed) { /* partly used goods */ --- 1496,1503 ---- if (itemize) { char qbuf[BUFSZ]; ! Sprintf(qbuf,"%s for %ld %s. Pay?", quan == 1L ? ! Doname2(obj) : doname(obj), ltmp, currency(ltmp)); if (yn(qbuf) == 'n') { buy = PAY_SKIP; /* don't want to buy */ } else if (quan < bp->bquan && !consumed) { /* partly used goods */ *************** *** 1295,1301 **** --- 1508,1518 ---- buy = PAY_SKIP; /* shk won't sell */ } } + #ifndef GOLDOBJ if (buy == PAY_BUY && u.ugold + ESHK(shkp)->credit < ltmp) { + #else + if (buy == PAY_BUY && umoney + ESHK(shkp)->credit < ltmp) { + #endif You("don't%s have gold%s enough to pay for %s.", stashed_gold ? " seem to" : "", (ESHK(shkp)->credit > 0L) ? " or credit" : "", *************** *** 1378,1386 **** --- 1595,1607 ---- boolean croaked; { long loss = 0L; + #ifdef GOLDOBJ + long umoney; + #endif struct eshk *eshkp = ESHK(shkp); boolean take = FALSE, taken = FALSE; int roomno = *u.ushops; + char takes[BUFSZ]; /* the simplifying principle is that first-come */ /* already took everything you had. */ *************** *** 1416,1447 **** } if (eshkp->following || ANGRY(shkp) || take) { if (!invent && !u.ugold) goto skip; if (loss > u.ugold || !loss || roomno == eshkp->shoproom) { eshkp->robbed -= u.ugold; if (eshkp->robbed < 0L) eshkp->robbed = 0L; shkp->mgold += u.ugold; u.ugold = 0L; flags.botl = 1; ! pline("%s %s%stakes all your possessions.", ! shkname(shkp), ! (shkp->msleeping || !shkp->mcanmove) ? ! "wakes up and " : "", ! (distu(shkp->mx, shkp->my) > 2) ? ! "comes and " : ""); taken = TRUE; /* where to put player's invent (after disclosure) */ set_repo_loc(eshkp); } else { shkp->mgold += loss; u.ugold -= loss; flags.botl = 1; ! pline("%s %sand takes %ld zorkmid%s %sowed %s.", ! Monnam(shkp), ! (shkp->msleeping || !shkp->mcanmove) ? ! "wakes up " : "comes ", ! loss, plur(loss), strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "you ", shkp->female ? "her" : "him"); --- 1637,1684 ---- } if (eshkp->following || ANGRY(shkp) || take) { + #ifndef GOLDOBJ if (!invent && !u.ugold) goto skip; + #else + if (!invent) goto skip; + umoney = money_cnt(invent); + #endif + takes[0] = '\0'; + if (shkp->msleeping || !shkp->mcanmove) + Strcat(takes, "wakes up and "); + if (distu(shkp->mx, shkp->my) > 2) + Strcat(takes, "comes and "); + Strcat(takes, "takes"); + #ifndef GOLDOBJ if (loss > u.ugold || !loss || roomno == eshkp->shoproom) { eshkp->robbed -= u.ugold; if (eshkp->robbed < 0L) eshkp->robbed = 0L; shkp->mgold += u.ugold; u.ugold = 0L; + #else + if (loss > umoney || !loss || roomno == eshkp->shoproom) { + eshkp->robbed -= umoney; + if (eshkp->robbed < 0L) eshkp->robbed = 0L; + money2mon(shkp, umoney); + #endif flags.botl = 1; ! pline("%s %s all your possessions.", ! shkname(shkp), takes); taken = TRUE; /* where to put player's invent (after disclosure) */ set_repo_loc(eshkp); } else { + #ifndef GOLDOBJ shkp->mgold += loss; u.ugold -= loss; + #else + money2mon(shkp, loss); + #endif flags.botl = 1; ! pline("%s %s the %ld %s %sowed %s.", ! Monnam(shkp), takes, ! loss, currency(loss), strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "you ", shkp->female ? "her" : "him"); *************** *** 1568,1583 **** /* shopkeeper may notice if the player isn't very knowledgeable - especially when gem prices are concerned */ if (!obj->dknown || !objects[obj->otyp].oc_name_known) { ! if (obj->oclass == GEM_CLASS) { ! /* all gems are priced high - real or not */ ! if (objects[obj->otyp].oc_material == GLASS) { ! int i = obj->otyp - LUCKSTONE + JADE + 1; ! /* real gem's cost (worthless gems come ! after jade but before luckstone) */ ! tmp = (long) objects[i].oc_cost; ! } } else if (!(obj->o_id % 4)) /* arbitrarily impose surcharge */ ! tmp += tmp / 3L; } #ifdef TOURIST if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV/2)) --- 1805,1854 ---- /* shopkeeper may notice if the player isn't very knowledgeable - especially when gem prices are concerned */ if (!obj->dknown || !objects[obj->otyp].oc_name_known) { ! if (obj->oclass == GEM_CLASS && ! objects[obj->otyp].oc_material == GLASS) { ! int i; ! /* get a value that's 'random' from game to game, but the ! same within the same game */ ! boolean pseudorand = ! (((int)u.ubirthday % obj->otyp) >= obj->otyp/2); ! ! /* all gems are priced high - real or not */ ! switch(obj->otyp - LAST_GEM) { ! case 1: /* white */ ! i = pseudorand ? DIAMOND : OPAL; ! break; ! case 2: /* blue */ ! i = pseudorand ? SAPPHIRE : AQUAMARINE; ! break; ! case 3: /* red */ ! i = pseudorand ? RUBY : JASPER; ! break; ! case 4: /* yellowish brown */ ! i = pseudorand ? AMBER : TOPAZ; ! break; ! case 5: /* orange */ ! i = pseudorand ? JACINTH : AGATE; ! break; ! case 6: /* yellow */ ! i = pseudorand ? CITRINE : CHRYSOBERYL; ! break; ! case 7: /* black */ ! i = pseudorand ? BLACK_OPAL : JET; ! break; ! case 8: /* green */ ! i = pseudorand ? EMERALD : JADE; ! break; ! case 9: /* violet */ ! i = pseudorand ? AMETHYST : FLUORITE; ! break; ! default: impossible("bad glass gem %d?", obj->otyp); ! i = STRANGE_OBJECT; ! break; ! } ! tmp = (long) objects[i].oc_cost; } else if (!(obj->o_id % 4)) /* arbitrarily impose surcharge */ ! tmp += tmp / 3L; } #ifdef TOURIST if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV/2)) *************** *** 1608,1618 **** * a different price quoted for selling as vs. buying. */ long ! contained_cost(obj, shkp, price, usell) register struct obj *obj; register struct monst *shkp; long price; register boolean usell; { register struct obj *otmp; --- 1879,1890 ---- * a different price quoted for selling as vs. buying. */ long ! contained_cost(obj, shkp, price, usell, unpaid_only) register struct obj *obj; register struct monst *shkp; long price; register boolean usell; + register boolean unpaid_only; { register struct obj *otmp; *************** *** 1627,1638 **** !(Is_candle(otmp) && otmp->age < 20L * (long)objects[otmp->otyp].oc_cost)) price += set_cost(otmp, shkp); ! } else if (!otmp->no_charge) { price += get_cost(otmp, shkp) * otmp->quan; } if (Has_contents(otmp)) ! price += contained_cost(otmp, shkp, price, usell); } return(price); --- 1899,1911 ---- !(Is_candle(otmp) && otmp->age < 20L * (long)objects[otmp->otyp].oc_cost)) price += set_cost(otmp, shkp); ! } else if (!otmp->no_charge && ! (!unpaid_only || (unpaid_only && otmp->unpaid))) { price += get_cost(otmp, shkp) * otmp->quan; } if (Has_contents(otmp)) ! price += contained_cost(otmp, shkp, price, usell, unpaid_only); } return(price); *************** *** 1801,1807 **** if (obj->where != OBJ_FREE) panic("add_to_billobjs: obj not free"); if (obj->timed) ! panic("add_to_billobjs: obj is timed"); obj->nobj = billobjs; billobjs = obj; --- 2074,2080 ---- if (obj->where != OBJ_FREE) panic("add_to_billobjs: obj not free"); if (obj->timed) ! obj_stop_timers(obj); obj->nobj = billobjs; billobjs = obj; *************** *** 1914,1920 **** goto speak; } } else { ! cltmp += contained_cost(obj, shkp, cltmp, FALSE); gltmp += contained_gold(obj); } --- 2187,2193 ---- goto speak; } } else { ! cltmp += contained_cost(obj, shkp, cltmp, FALSE, FALSE); gltmp += contained_gold(obj); } *************** *** 1962,1973 **** (quan > 1L) ? "per" : "for this", xname(obj)); obj->quan = quan; } else ! pline("%s will cost you %ld zorkmid%s%s.", ! The(xname(obj)), ltmp, plur(ltmp), (obj->quan > 1L) ? " each" : ""); } else if(!silent) { ! if(ltmp) pline_The("list price of %s is %ld zorkmid%s%s.", ! the(xname(obj)), ltmp, plur(ltmp), (obj->quan > 1L) ? " each" : ""); else pline("%s does not notice.", Monnam(shkp)); } --- 2235,2246 ---- (quan > 1L) ? "per" : "for this", xname(obj)); obj->quan = quan; } else ! pline("%s will cost you %ld %s%s.", ! The(xname(obj)), ltmp, currency(ltmp), (obj->quan > 1L) ? " each" : ""); } else if(!silent) { ! if(ltmp) pline_The("list price of %s is %ld %s%s.", ! the(xname(obj)), ltmp, currency(ltmp), (obj->quan > 1L) ? " each" : ""); else pline("%s does not notice.", Monnam(shkp)); } *************** *** 2102,2115 **** if (!Has_contents(otmp)) { if(ininv) { if(otmp->unpaid) ! price += get_cost(otmp, shkp); } else { if(!otmp->no_charge) { ! if(!(otmp->oclass == BALL_CLASS || ! (otmp->oclass == FOOD_CLASS && otmp->oeaten) || ! (Is_candle(otmp) && otmp->age < ! 20L * (long)objects[otmp->otyp].oc_cost)) ! ) price += get_cost(otmp, shkp); } otmp->no_charge = 0; } --- 2375,2385 ---- if (!Has_contents(otmp)) { if(ininv) { if(otmp->unpaid) ! price += otmp->quan * get_cost(otmp, shkp); } else { if(!otmp->no_charge) { ! if(otmp->oclass != FOOD_CLASS || !otmp->oeaten) ! price += otmp->quan * get_cost(otmp, shkp); } otmp->no_charge = 0; } *************** *** 2150,2164 **** value += gvalue; if(peaceful) { value = check_credit(value, shkp); ESHK(shkp)->debit += value; if(!silent) { if(obj->oclass == GOLD_CLASS) ! You("owe %s %ld zorkmids!", mon_nam(shkp), value); ! else You("owe %s %ld zorkmids for %s!", mon_nam(shkp), ! value, obj->quan > 1L ? "them" : "it"); } } else { --- 2420,2447 ---- value += gvalue; if(peaceful) { + boolean credit_use = !!ESHK(shkp)->credit; value = check_credit(value, shkp); ESHK(shkp)->debit += value; if(!silent) { + char *still = ""; + if (credit_use) { + if (ESHK(shkp)->credit) { + You("have %ld %s credit remaining.", + ESHK(shkp)->credit, currency(ESHK(shkp)->credit)); + return value; + } else if (!value) { + You("have no credit remaining."); + return 0; + } + still = "still "; + } if(obj->oclass == GOLD_CLASS) ! You("%sowe %s %ld %s!", still, mon_nam(shkp), value, currency(value)); ! else You("%sowe %s %ld %s for %s!", still, mon_nam(shkp), ! value, currency(value), obj->quan > 1L ? "them" : "it"); } } else { *************** *** 2180,2199 **** /* auto-response flag for/from "sell foo?" 'a' => 'y', 'q' => 'n' */ static char sell_response = 'a'; ! static boolean sell_voluntarily = FALSE; void ! sellobj_state(deliberate) /* called from dodrop(do.c) and doddrop() */ ! boolean deliberate; { /* If we're deliberately dropping something, there's no automatic ! response to the shopkeeper's "want to sell" query; however, if we ! accidentally drop anything, the shk will buy it/them without asking. ! This retains the old pre-query risk that slippery fingers while in ! shops entailed: you drop it, you've lost it. */ ! sell_response = deliberate ? '\0' : 'a'; ! sell_voluntarily = deliberate; } void --- 2463,2486 ---- /* auto-response flag for/from "sell foo?" 'a' => 'y', 'q' => 'n' */ static char sell_response = 'a'; ! static int sell_how = SELL_NORMAL; ! /* can't just use sell_response='y' for auto_credit because the 'a' response ! shouldn't carry over from ordinary selling to credit selling */ ! static boolean auto_credit = FALSE; void ! sellobj_state(deliberate) ! int deliberate; { /* If we're deliberately dropping something, there's no automatic ! response to the shopkeeper's "want to sell" query; however, if we ! accidentally drop anything, the shk will buy it/them without asking. ! This retains the old pre-query risk that slippery fingers while in ! shops entailed: you drop it, you've lost it. */ ! sell_response = (deliberate != SELL_NORMAL) ? '\0' : 'a'; ! sell_how = deliberate; ! auto_credit = FALSE; } void *************** *** 2206,2211 **** --- 2493,2499 ---- long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer; boolean saleitem, cgold = FALSE, container = Has_contents(obj); boolean isgold = (obj->oclass == GOLD_CLASS); + boolean only_partially_your_contents = FALSE; if(!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp)) return; *************** *** 2218,2224 **** } if(container) { /* find the price of content before subfrombill */ ! cltmp += contained_cost(obj, shkp, cltmp, TRUE); /* find the value of contained gold */ gltmp += contained_gold(obj); cgold = (gltmp > 0L); --- 2506,2512 ---- } if(container) { /* find the price of content before subfrombill */ ! cltmp += contained_cost(obj, shkp, cltmp, TRUE, FALSE); /* find the value of contained gold */ gltmp += contained_gold(obj); cgold = (gltmp > 0L); *************** *** 2231,2237 **** offer = ltmp + cltmp; /* get one case out of the way: nothing to sell, and no gold */ ! if(!isgold && (offer + gltmp) == 0L) { register boolean unpaid = (obj->unpaid || (container && count_unpaid(obj->cobj))); --- 2519,2526 ---- offer = ltmp + cltmp; /* get one case out of the way: nothing to sell, and no gold */ ! if(!isgold && ! ((offer + gltmp) == 0L || sell_how == SELL_DONTSELL)) { register boolean unpaid = (obj->unpaid || (container && count_unpaid(obj->cobj))); *************** *** 2243,2249 **** subfrombill(obj, shkp); } else obj->no_charge = 1; ! if(!unpaid) pline("%s seems uninterested.", Monnam(shkp)); return; } --- 2532,2538 ---- subfrombill(obj, shkp); } else obj->no_charge = 1; ! if(!unpaid && (sell_how != SELL_DONTSELL)) pline("%s seems uninterested.", Monnam(shkp)); return; } *************** *** 2305,2312 **** eshkp->loan = 0L; Your("debt is paid off."); } ! pline("%ld zorkmid%s added to your credit.", ! delta, delta > 1L ? "s are" : " is"); } if(offer) goto move_on; else { --- 2594,2601 ---- eshkp->loan = 0L; Your("debt is paid off."); } ! pline("%ld %s %s added to your credit.", ! delta, currency(delta), delta > 1L ? "are" : "is"); } if(offer) goto move_on; else { *************** *** 2334,2358 **** obj->no_charge = 1; return; } ! if(!shkp->mgold) { char c, qbuf[BUFSZ]; long tmpcr = ((offer * 9L) / 10L) + (offer <= 1L); ! if (!sell_voluntarily) { c = sell_response = 'y'; } else if (sell_response != 'n') { pline("%s cannot pay you at present.", Monnam(shkp)); Sprintf(qbuf, ! "Will you accept %ld zorkmid%s in credit for %s?", ! tmpcr, plur(tmpcr), doname(obj)); /* won't accept 'a' response here */ ! c = ynq(qbuf); } else /* previously specified "quit" */ c = 'n'; if (c == 'y') { ! shk_names_obj(shkp, obj, sell_voluntarily ? "traded %s for %ld zorkmid%s in %scredit." : "relinquish %s and acquire %ld zorkmid%s in %scredit.", tmpcr, --- 2623,2657 ---- obj->no_charge = 1; return; } ! ! #ifndef GOLDOBJ if(!shkp->mgold) { + #else + if(!money_cnt(shkp->minvent)) { + #endif char c, qbuf[BUFSZ]; long tmpcr = ((offer * 9L) / 10L) + (offer <= 1L); ! if (sell_how == SELL_NORMAL || auto_credit) { c = sell_response = 'y'; } else if (sell_response != 'n') { pline("%s cannot pay you at present.", Monnam(shkp)); Sprintf(qbuf, ! "Will you accept %ld %s in credit for %s?", ! tmpcr, currency(tmpcr), doname(obj)); /* won't accept 'a' response here */ ! /* KLY - 3/2000 yes, we will, it's a damn nuisance ! to have to constantly hit 'y' to sell for credit */ ! c = ynaq(qbuf); ! if (c == 'a') { ! c = 'y'; ! auto_credit = TRUE; ! } } else /* previously specified "quit" */ c = 'n'; if (c == 'y') { ! shk_names_obj(shkp, obj, (sell_how != SELL_NORMAL) ? "traded %s for %ld zorkmid%s in %scredit." : "relinquish %s and acquire %ld zorkmid%s in %scredit.", tmpcr, *************** *** 2368,2385 **** } } else { char qbuf[BUFSZ]; boolean short_funds = (offer > shkp->mgold); - if (short_funds) offer = shkp->mgold; ! if (!sell_response) { Sprintf(qbuf, "%s offers%s %ld gold piece%s for%s %s %s. Sell %s?", Monnam(shkp), short_funds ? " only" : "", offer, plur(offer), ! (!ltmp && cltmp) ? " the contents of" : "", ! obj->unpaid ? "the" : "your", xname(obj), ! (obj->quan == 1L) ? "it" : "them"); } else qbuf[0] = '\0'; /* just to pacify lint */ switch (sell_response ? sell_response : ynaq(qbuf)) { --- 2667,2694 ---- } } else { char qbuf[BUFSZ]; + #ifndef GOLDOBJ boolean short_funds = (offer > shkp->mgold); if (short_funds) offer = shkp->mgold; ! #else ! long shkmoney = money_cnt(shkp->minvent); ! boolean short_funds = (offer > shkmoney); ! if (short_funds) offer = shkmoney; ! #endif if (!sell_response) { + only_partially_your_contents = + (contained_cost(obj, shkp, 0L, FALSE, FALSE) != + contained_cost(obj, shkp, 0L, FALSE, TRUE)); Sprintf(qbuf, "%s offers%s %ld gold piece%s for%s %s %s. Sell %s?", Monnam(shkp), short_funds ? " only" : "", offer, plur(offer), ! (!ltmp && cltmp && only_partially_your_contents) ? ! " your items in" : (!ltmp && cltmp) ? " the contents of" : "", ! obj->unpaid ? "the" : "your", cxname(obj), ! (obj->quan == 1L && ! !(!ltmp && cltmp && only_partially_your_contents)) ? ! "it" : "them"); } else qbuf[0] = '\0'; /* just to pacify lint */ switch (sell_response ? sell_response : ynaq(qbuf)) { *************** *** 2395,2401 **** if (!obj->unpaid && !saleitem) obj->no_charge = 1; subfrombill(obj, shkp); pay(-offer, shkp); ! shk_names_obj(shkp, obj, sell_voluntarily ? "sold %s for %ld gold piece%s.%s" : "relinquish %s and receive %ld gold piece%s in compensation.%s", offer, ""); --- 2704,2712 ---- if (!obj->unpaid && !saleitem) obj->no_charge = 1; subfrombill(obj, shkp); pay(-offer, shkp); ! shk_names_obj(shkp, obj, (sell_how != SELL_NORMAL) ? ! (!ltmp && cltmp && only_partially_your_contents) ? ! "sold some items inside %s for %ld gold pieces%s.%s" : "sold %s for %ld gold piece%s.%s" : "relinquish %s and receive %ld gold piece%s in compensation.%s", offer, ""); *************** *** 2461,2471 **** uquan = (bp->useup ? bp->bquan : bp->bquan - oquan); thisused = bp->price * uquan; totused += thisused; - obj->quan = uquan; /* cheat doname */ obj->unpaid = 0; /* ditto */ /* Why 'x'? To match `I x', more or less. */ ! buf_p = xprname(obj, (char *)0, 'x', FALSE, thisused); ! obj->quan = oquan; /* restore value */ #ifdef __SASC /* SAS/C 6.2 can't cope for some reason */ sasc_bug(obj,save_unpaid); --- 2772,2780 ---- uquan = (bp->useup ? bp->bquan : bp->bquan - oquan); thisused = bp->price * uquan; totused += thisused; obj->unpaid = 0; /* ditto */ /* Why 'x'? To match `I x', more or less. */ ! buf_p = xprname(obj, (char *)0, 'x', FALSE, thisused, uquan); #ifdef __SASC /* SAS/C 6.2 can't cope for some reason */ sasc_bug(obj,save_unpaid); *************** *** 2481,2490 **** totused += eshkp->debit; buf_p = xprname((struct obj *)0, "usage charges and/or other fees", ! GOLD_SYM, FALSE, eshkp->debit); putstr(datawin, 0, buf_p); } ! buf_p = xprname((struct obj *)0, "Total:", '*', FALSE, totused); putstr(datawin, 0, ""); putstr(datawin, 0, buf_p); display_nhwindow(datawin, FALSE); --- 2790,2799 ---- totused += eshkp->debit; buf_p = xprname((struct obj *)0, "usage charges and/or other fees", ! GOLD_SYM, FALSE, eshkp->debit, 0L); putstr(datawin, 0, buf_p); } ! buf_p = xprname((struct obj *)0, "Total:", '*', FALSE, totused, 0L); putstr(datawin, 0, ""); putstr(datawin, 0, buf_p); display_nhwindow(datawin, FALSE); *************** *** 2502,2507 **** --- 2811,2820 ---- { register long tmp = (long) objects[obj->otyp].oc_cost; + if (obj->oartifact) { + tmp = arti_cost(obj); + if (shk_buying) tmp /= 4; + } switch(obj->oclass) { case FOOD_CLASS: /* simpler hunger check, (2-4)*cost */ *************** *** 2525,2536 **** tmp /= 2L; break; } - if (obj->oartifact) tmp *= 25L; return tmp; } /* shk catches thrown pick-axe */ ! int shkcatch(obj, x, y) register struct obj *obj; register xchar x, y; --- 2838,2848 ---- tmp /= 2L; break; } return tmp; } /* shk catches thrown pick-axe */ ! struct monst * shkcatch(obj, x, y) register struct obj *obj; register xchar x, y; *************** *** 2548,2555 **** if (mnearto(shkp, x, y, TRUE)) verbalize("Out of my way, scum!"); if (cansee(x, y)) { ! pline("%s nimbly catches %s.", ! Monnam(shkp), the(xname(obj))); if (!canspotmon(shkp)) map_invisible(x, y); delay_output(); --- 2860,2869 ---- if (mnearto(shkp, x, y, TRUE)) verbalize("Out of my way, scum!"); if (cansee(x, y)) { ! pline("%s nimbly%s catches %s.", ! Monnam(shkp), ! (x == shkp->mx && y == shkp->my) ? "" : " reaches over and", ! the(xname(obj))); if (!canspotmon(shkp)) map_invisible(x, y); delay_output(); *************** *** 2557,2565 **** } subfrombill(obj, shkp); (void) mpickobj(shkp, obj); ! return(1); } ! return(0); } void --- 2871,2879 ---- } subfrombill(obj, shkp); (void) mpickobj(shkp, obj); ! return shkp; } ! return (struct monst *)0; } void *************** *** 2745,2761 **** (void) mpickobj(shkp, otmp); } deltrap(ttmp); newsym(x, y); return(3); } if (IS_ROOM(tmp_dam->typ)) { ! /* No messages if player already filled trap door */ ! if (catchup || !ttmp) ! return(1); ! newsym(x, y); ! return(2); } ! if (!ttmp && (tmp_dam->typ == levl[x][y].typ) && (!IS_DOOR(tmp_dam->typ) || (levl[x][y].doormask > D_BROKEN))) /* No messages if player already replaced shop door */ return(1); --- 3059,3079 ---- (void) mpickobj(shkp, otmp); } deltrap(ttmp); + if(IS_DOOR(tmp_dam->typ)) { + levl[x][y].doormask = D_CLOSED; /* arbitrary */ + block_point(x, y); + } else if (IS_WALL(tmp_dam->typ)) { + levl[x][y].typ = tmp_dam->typ; + block_point(x, y); + } newsym(x, y); return(3); } if (IS_ROOM(tmp_dam->typ)) { ! /* No messages, because player already filled trap door */ ! return(1); } ! if ((tmp_dam->typ == levl[x][y].typ) && (!IS_DOOR(tmp_dam->typ) || (levl[x][y].doormask > D_BROKEN))) /* No messages if player already replaced shop door */ return(1); *************** *** 2887,2893 **** gy = eshkp->shk.y; satdoor = (gx == omx && gy == omy); if(eshkp->following || ((z = holetime()) >= 0 && z*z <= udist)){ ! if(udist > 4) return(-1); /* leave it to m_move */ gx = u.ux; gy = u.uy; --- 3205,3218 ---- gy = eshkp->shk.y; satdoor = (gx == omx && gy == omy); if(eshkp->following || ((z = holetime()) >= 0 && z*z <= udist)){ ! /* [This distance check used to apply regardless of ! whether the shk was following, but that resulted in ! m_move() sometimes taking the shk out of the shop if ! the player had fenced him in with boulders or traps. ! Such voluntary abandonment left unpaid objects in ! invent, triggering billing impossibilities on the ! next level once the character fell through the hole.] */ ! if (udist > 4 && eshkp->following) return(-1); /* leave it to m_move */ gx = u.ux; gy = u.uy; *************** *** 2951,2959 **** --- 3276,3292 ---- register int fall; { register struct monst *shkp = shop_keeper(*u.ushops); + int lang = 0; + char *grabs = "grabs"; if(!shkp) return; + /* 0 == can't speak, 1 == makes animal noises, 2 == speaks */ + if (!is_silent(shkp->data) && shkp->data->msound <= MS_ANIMAL) + lang = 1; + else if (shkp->data->msound >= MS_HUMANOID) + lang = 2; + if(!inhishop(shkp)) { if (Role_if(PM_KNIGHT)) { You_feel("like a common thief."); *************** *** 2963,2974 **** } if(!fall) { ! if(u.utraptype == TT_PIT) ! verbalize("Be careful, %s, or you might fall through the floor.", ! flags.female ? "madam" : "sir"); ! else ! verbalize("%s, do not damage the floor here!", flags.female ? "Madam" : "Sir"); if (Role_if(PM_KNIGHT)) { You_feel("like a common thief."); adjalign(-sgn(u.ualign.type)); --- 3296,3310 ---- } if(!fall) { ! if (lang == 2) { ! if(u.utraptype == TT_PIT) ! verbalize( ! "Be careful, %s, or you might fall through the floor.", ! flags.female ? "madam" : "sir"); ! else ! verbalize("%s, do not damage the floor here!", flags.female ? "Madam" : "Sir"); + } if (Role_if(PM_KNIGHT)) { You_feel("like a common thief."); adjalign(-sgn(u.ualign.type)); *************** *** 2977,2999 **** !shkp->msleeping && shkp->mcanmove && (ESHK(shkp)->billct || ESHK(shkp)->debit)) { register struct obj *obj, *obj2; ! if (distu(shkp->mx, shkp->my) > 2) { mnexto(shkp); /* for some reason the shopkeeper can't come next to you */ if (distu(shkp->mx, shkp->my) > 2) { ! pline("%s curses you in anger and frustration!", ! shkname(shkp)); rile_shk(shkp); return; ! } else pline("%s leaps, and grabs your backpack!", ! shkname(shkp)); ! } else pline("%s grabs your backpack!", shkname(shkp)); for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; ! if(obj->owornmask) continue; ! if(obj->otyp == LEASH && obj->leashmon) continue; freeinv(obj); subfrombill(obj, shkp); (void) add_to_minv(shkp, obj); /* may free obj */ --- 3313,3352 ---- !shkp->msleeping && shkp->mcanmove && (ESHK(shkp)->billct || ESHK(shkp)->debit)) { register struct obj *obj, *obj2; ! if (nolimbs(shkp->data)) { ! grabs = "knocks off"; ! #if 0 ! /* This is what should happen, but for balance ! * reasons, it isn't currently. ! */ ! if (lang == 2) ! pline("%s curses %s inability to grab your backpack!", ! shkname(shkp), mhim(shkp)); ! rile_shk(shkp); ! return; ! #endif ! } if (distu(shkp->mx, shkp->my) > 2) { mnexto(shkp); /* for some reason the shopkeeper can't come next to you */ if (distu(shkp->mx, shkp->my) > 2) { ! if (lang == 2) ! pline("%s curses you in anger and frustration!", ! shkname(shkp)); rile_shk(shkp); return; ! } else ! pline("%s %s, and %s your backpack!", ! shkname(shkp), ! makeplural(locomotion(shkp->data,"leap")), grabs); ! } else ! pline("%s %s your backpack!", shkname(shkp), grabs); for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; ! if ((obj->owornmask & ~(W_SWAPWEP|W_QUIVER)) != 0 || ! (obj == uswapwep && u.twoweap) || ! (obj->otyp == LEASH && obj->leashmon)) continue; freeinv(obj); subfrombill(obj, shkp); (void) add_to_minv(shkp, obj); /* may free obj */ *************** *** 3141,3147 **** --- 3494,3504 ---- } if((um_dist(x, y, 1) && !uinshp) || + #ifndef GOLDOBJ (u.ugold + ESHK(shkp)->credit) < cost_of_damage + #else + (money_cnt(invent) + ESHK(shkp)->credit) < cost_of_damage + #endif || !rn2(50)) { if(um_dist(x, y, 1) && !uinshp) { pline("%s shouts:", shkname(shkp)); *************** *** 3156,3168 **** return; } ! if(Invis) Your("invisibility does not fool %s!", shkname(shkp)); ! Sprintf(qbuf,"\"Cad! You did %ld zorkmids worth of damage!\" Pay? ", ! cost_of_damage); if(yn(qbuf) != 'n') { cost_of_damage = check_credit(cost_of_damage, shkp); u.ugold -= cost_of_damage; shkp->mgold += cost_of_damage; flags.botl = 1; pline("Mollified, %s accepts your restitution.", shkname(shkp)); --- 3513,3529 ---- return; } ! if (Invis) Your("invisibility does not fool %s!", shkname(shkp)); ! Sprintf(qbuf,"\"Cad! You did %ld %s worth of damage!\" Pay? ", ! cost_of_damage, currency(cost_of_damage)); if(yn(qbuf) != 'n') { cost_of_damage = check_credit(cost_of_damage, shkp); + #ifndef GOLDOBJ u.ugold -= cost_of_damage; shkp->mgold += cost_of_damage; + #else + money2mon(shkp, cost_of_damage); + #endif flags.botl = 1; pline("Mollified, %s accepts your restitution.", shkname(shkp)); *************** *** 3236,3246 **** cost = (otmp->no_charge || otmp == uball || otmp == uchain) ? 0L : get_cost(otmp, (struct monst *)0); if (Has_contents(otmp)) ! cost += contained_cost(otmp, shkp, 0L, FALSE); if (!cost) { Strcpy(price, "no charge"); } else { ! Sprintf(price, "%ld zorkmid%s%s", cost, plur(cost), otmp->quan > 1L ? " each" : ""); } Sprintf(buf, "%s, %s", doname(otmp), price); --- 3597,3607 ---- cost = (otmp->no_charge || otmp == uball || otmp == uchain) ? 0L : get_cost(otmp, (struct monst *)0); if (Has_contents(otmp)) ! cost += contained_cost(otmp, shkp, 0L, FALSE, FALSE); if (!cost) { Strcpy(price, "no charge"); } else { ! Sprintf(price, "%ld %s%s", cost, currency(cost), otmp->quan > 1L ? " each" : ""); } Sprintf(buf, "%s, %s", doname(otmp), price); *************** *** 3255,3263 **** /* print cost in slightly different format, so can't reuse buf */ cost = get_cost(first_obj, (struct monst *)0); if (Has_contents(first_obj)) ! cost += contained_cost(first_obj, shkp, 0L, FALSE); ! pline("%s, price %ld zorkmid%s%s%s", doname(first_obj), ! cost, plur(cost), first_obj->quan > 1L ? " each" : "", shk_embellish(first_obj, cost)); } } --- 3616,3624 ---- /* print cost in slightly different format, so can't reuse buf */ cost = get_cost(first_obj, (struct monst *)0); if (Has_contents(first_obj)) ! cost += contained_cost(first_obj, shkp, 0L, FALSE, FALSE); ! pline("%s, price %ld %s%s%s", doname(first_obj), ! cost, currency(cost), first_obj->quan > 1L ? " each" : "", shk_embellish(first_obj, cost)); } } *************** *** 3313,3325 **** void shk_chat(shkp) ! register struct monst *shkp; { ! register struct eshk *eshk = ESHK(shkp); if (ANGRY(shkp)) pline("%s mentions how much %s dislikes %s customers.", ! shkname(shkp), he[shkp->female], eshk->robbed ? "non-paying" : "rude"); else if (eshk->following) { if (strncmp(eshk->customer, plname, PL_NSIZ)) { --- 3674,3702 ---- void shk_chat(shkp) ! struct monst *shkp; { ! struct eshk *eshk; ! #ifdef GOLDOBJ ! long shkmoney; ! #endif ! if (!shkp->isshk) { ! /* The monster type is shopkeeper, but this monster is ! not actually a shk, which could happen if someone ! wishes for a shopkeeper statue and then animates it. ! (Note: shkname() would be "" in a case like this.) */ ! pline("%s asks whether you've seen any untended shops recently.", ! Monnam(shkp)); ! /* [Perhaps we ought to check whether this conversation ! is taking place inside an untended shop, but a shopless ! shk can probably be expected to be rather disoriented.] */ ! return; ! } + eshk = ESHK(shkp); if (ANGRY(shkp)) pline("%s mentions how much %s dislikes %s customers.", ! shkname(shkp), mhe(shkp), eshk->robbed ? "non-paying" : "rude"); else if (eshk->following) { if (strncmp(eshk->customer, plname, PL_NSIZ)) { *************** *** 3327,3350 **** Hello(shkp), plname, eshk->customer); eshk->following = 0; } else { ! verbalize("%s %s! Didn't you forget to pay?", Hello(shkp), plname); } } else if (eshk->billct) { register long total = addupbill(shkp) + eshk->debit; ! pline("%s says that your bill comes to %ld zorkmid%s.", ! shkname(shkp), total, plur(total)); } else if (eshk->debit) ! pline("%s reminds you that you owe %s %ld zorkmid%s.", ! shkname(shkp), him[shkp->female], ! eshk->debit, plur(eshk->debit)); else if (eshk->credit) ! pline("%s encourages you to use your %ld zorkmid%s of credit.", ! shkname(shkp), eshk->credit, plur(eshk->credit)); else if (eshk->robbed) pline("%s complains about a recent robbery.", shkname(shkp)); else if (shkp->mgold < 50) pline("%s complains that business is bad.", shkname(shkp)); else if (shkp->mgold > 4000) pline("%s says that business is good.", shkname(shkp)); else if (strcmp(shkname(shkp), "Izchak") == 0) pline(Izchak_speaks[rn2(SIZE(Izchak_speaks))],shkname(shkp)); --- 3704,3736 ---- Hello(shkp), plname, eshk->customer); eshk->following = 0; } else { ! verbalize("%s %s! Didn't you forget to pay?", ! Hello(shkp), plname); } } else if (eshk->billct) { register long total = addupbill(shkp) + eshk->debit; ! pline("%s says that your bill comes to %ld %s.", ! shkname(shkp), total, currency(total)); } else if (eshk->debit) ! pline("%s reminds you that you owe %s %ld %s.", ! shkname(shkp), mhim(shkp), ! eshk->debit, currency(eshk->debit)); else if (eshk->credit) ! pline("%s encourages you to use your %ld %s of credit.", ! shkname(shkp), eshk->credit, currency(eshk->credit)); else if (eshk->robbed) pline("%s complains about a recent robbery.", shkname(shkp)); + #ifndef GOLDOBJ else if (shkp->mgold < 50) + #else + else if ((shkmoney = money_cnt(shkp->minvent)) < 50) + #endif pline("%s complains that business is bad.", shkname(shkp)); + #ifndef GOLDOBJ else if (shkp->mgold > 4000) + #else + else if (shkmoney > 4000) + #endif pline("%s says that business is good.", shkname(shkp)); else if (strcmp(shkname(shkp), "Izchak") == 0) pline(Izchak_speaks[rn2(SIZE(Izchak_speaks))],shkname(shkp)); *************** *** 3413,3425 **** (otmp->otyp >= MAGIC_FLUTE && otmp->otyp <= DRUM_OF_EARTHQUAKE) || /* 5 - 9 */ otmp->oclass == WAND_CLASS) { /* 3 - 11 */ ! if (otmp->spe > 1) tmp /= 4L; } else if (otmp->oclass == SPBOOK_CLASS) { ! tmp -= tmp / 5L; ! } else if (otmp->otyp == CAN_OF_GREASE) { ! tmp /= 10L; } else if (otmp->otyp == POT_OIL) { ! tmp /= 5L; } return(tmp); } --- 3799,3815 ---- (otmp->otyp >= MAGIC_FLUTE && otmp->otyp <= DRUM_OF_EARTHQUAKE) || /* 5 - 9 */ otmp->oclass == WAND_CLASS) { /* 3 - 11 */ ! if (otmp->spe > 1) tmp /= 4L; } else if (otmp->oclass == SPBOOK_CLASS) { ! tmp -= tmp / 5L; ! } else if (otmp->otyp == CAN_OF_GREASE ! #ifdef TOURIST ! || otmp->otyp == EXPENSIVE_CAMERA ! #endif ! ) { ! tmp /= 10L; } else if (otmp->otyp == POT_OIL) { ! tmp /= 5L; } return(tmp); } *************** *** 3450,3468 **** arg1 = arg2 = ""; if (otmp->oclass == SPBOOK_CLASS) { ! fmt = "%sYou owe%s %ld zorkmids."; arg1 = rn2(2) ? "This is no free library, cad! " : ""; arg2 = ESHK(shkp)->debit > 0L ? " an additional" : ""; } else if (otmp->otyp == POT_OIL) { ! fmt = "%s%sThat will cost you %ld zorkmids (Yendorian Fuel Tax)."; } else { ! fmt = "%s%sUsage fee, %ld zorkmids."; if (!rn2(3)) arg1 = "Hey! "; if (!rn2(3)) arg2 = "Ahem. "; } if (shkp->mcanmove || !shkp->msleeping) ! verbalize(fmt, arg1, arg2, tmp); ESHK(shkp)->debit += tmp; exercise(A_WIS, TRUE); /* you just got info */ } --- 3840,3858 ---- arg1 = arg2 = ""; if (otmp->oclass == SPBOOK_CLASS) { ! fmt = "%sYou owe%s %ld %s."; arg1 = rn2(2) ? "This is no free library, cad! " : ""; arg2 = ESHK(shkp)->debit > 0L ? " an additional" : ""; } else if (otmp->otyp == POT_OIL) { ! fmt = "%s%sThat will cost you %ld %s (Yendorian Fuel Tax)."; } else { ! fmt = "%s%sUsage fee, %ld %s."; if (!rn2(3)) arg1 = "Hey! "; if (!rn2(3)) arg2 = "Ahem. "; } if (shkp->mcanmove || !shkp->msleeping) ! verbalize(fmt, arg1, arg2, tmp, currency(tmp)); ESHK(shkp)->debit += tmp; exercise(A_WIS, TRUE); /* you just got info */ } *************** *** 3491,3498 **** eshkp = ESHK(shkp); if(eshkp->credit >= amount) { if(eshkp->credit > amount) ! Your("credit is reduced by %ld zorkmid%s.", ! amount, plur(amount)); else Your("credit is erased."); eshkp->credit -= amount; } else { --- 3881,3888 ---- eshkp = ESHK(shkp); if(eshkp->credit >= amount) { if(eshkp->credit > amount) ! Your("credit is reduced by %ld %s.", ! amount, currency(amount)); else Your("credit is erased."); eshkp->credit -= amount; } else { *************** *** 3500,3509 **** if(eshkp->credit) Your("credit is erased."); if(eshkp->debit) ! Your("debt increases by %ld zorkmid%s.", ! delta, plur(delta)); ! else You("owe %s %ld zorkmid%s.", ! shkname(shkp), delta, plur(delta)); eshkp->debit += delta; eshkp->loan += delta; eshkp->credit = 0L; --- 3890,3899 ---- if(eshkp->credit) Your("credit is erased."); if(eshkp->debit) ! Your("debt increases by %ld %s.", ! delta, currency(delta)); ! else You("owe %s %ld %s.", ! shkname(shkp), delta, currency(delta)); eshkp->debit += delta; eshkp->loan += delta; eshkp->credit = 0L; *** nethack-3.3.1/src/shknam.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/shknam.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)shknam.c 3.3 97/05/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)shknam.c 3.4 2001/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 115,121 **** "Erreip", "Nehpets", "Mron", "Snivek", "Lapu", "Kahztiy", #endif #ifdef WIN32 ! "Lechaim", #endif #ifdef MAC "Nhoj-lee", "Evad\'kh", "Ettaw-noj", "Tsew-mot", "Ydna-s", --- 115,121 ---- "Erreip", "Nehpets", "Mron", "Snivek", "Lapu", "Kahztiy", #endif #ifdef WIN32 ! "Lechaim", "Lexa", "Niod", #endif #ifdef MAC "Nhoj-lee", "Evad\'kh", "Ettaw-noj", "Tsew-mot", "Ydna-s", *************** *** 246,266 **** const struct shclass *shp; int sx, sy; { ! register struct monst *mtmp; int atype; struct permonst *ptr; if (rn2(100) < depth(&u.uz) && ! !MON_AT(sx, sy) && (ptr = mkclass(S_MIMIC,0)) && ! (mtmp=makemon(ptr,sx,sy,NO_MM_FLAGS))) { ! /* note: makemon will set the mimic symbol to a shop item */ ! if (rn2(10) >= depth(&u.uz)) { ! mtmp->m_ap_type = M_AP_OBJECT; ! mtmp->mappearance = STRANGE_OBJECT; ! } ! } else if ((atype = get_shop_item(shp - shtypes)) < 0) ! (void) mksobj_at(-atype, sx, sy, TRUE); ! else (void) mkobj_at(atype, sx, sy, TRUE); } /* extract a shopkeeper name for the given shop type */ --- 246,270 ---- const struct shclass *shp; int sx, sy; { ! struct monst *mtmp; int atype; struct permonst *ptr; if (rn2(100) < depth(&u.uz) && ! !MON_AT(sx, sy) && (ptr = mkclass(S_MIMIC,0)) && ! (mtmp = makemon(ptr,sx,sy,NO_MM_FLAGS)) != 0) { ! /* note: makemon will set the mimic symbol to a shop item */ ! if (rn2(10) >= depth(&u.uz)) { ! mtmp->m_ap_type = M_AP_OBJECT; ! mtmp->mappearance = STRANGE_OBJECT; ! } ! } else { ! atype = get_shop_item(shp - shtypes); ! if (atype < 0) ! (void) mksobj_at(-atype, sx, sy, TRUE, TRUE); ! else ! (void) mkobj_at(atype, sx, sy, TRUE); ! } } /* extract a shopkeeper name for the given shop type */ *************** *** 402,408 **** --- 406,418 ---- ESHK(shk)->visitct = 0; ESHK(shk)->following = 0; ESHK(shk)->billct = 0; + #ifndef GOLDOBJ shk->mgold = 1000L + 30L*(long)rnd(100); /* initial capital */ + #else + mkmonmoney(shk, 1000L + 30L*(long)rnd(100)); /* initial capital */ + #endif + if (shp->shknms == shkrings) + (void) mongets(shk, TOUCHSTONE); nameshk(shk, shp->shknms); return(sh); *** nethack-3.3.1/src/sit.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/sit.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)sit.c 3.3 96/07/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)sit.c 3.4 2000/11/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,13 **** --- 8,14 ---- void take_gold() { + #ifndef GOLDOBJ if (u.ugold <= 0) { You_feel("a strange sensation."); } else { *************** *** 15,20 **** --- 16,37 ---- u.ugold = 0; flags.botl = 1; } + #else + struct obj *otmp; + int lost_money = 0; + for (otmp = invent; otmp; otmp = otmp->nobj) { + if (otmp->oclass == GOLD_CLASS) { + lost_money = 1; + delobj(otmp); + } + } + if (!lost_money) { + You_feel("a strange sensation."); + } else { + You("notice you have no money!"); + flags.botl = 1; + } + #endif } int *************** *** 38,43 **** --- 55,62 ---- else You("are sitting on air."); return 0; + } else if (is_pool(u.ux, u.uy) && !Underwater) { /* water walking */ + goto in_water; } if(OBJ_AT(u.ux, u.uy)) { *************** *** 45,51 **** obj = level.objects[u.ux][u.uy]; You("sit on %s.", the(xname(obj))); ! if(!Is_box(obj)) pline("It's not very comfortable..."); } else if ((trap = t_at(u.ux, u.uy)) != 0) { --- 64,71 ---- obj = level.objects[u.ux][u.uy]; You("sit on %s.", the(xname(obj))); ! if (!(Is_box(obj) || objects[obj->otyp].oc_material == CLOTH)) ! pline("It's not very comfortable..."); } else if ((trap = t_at(u.ux, u.uy)) != 0) { *************** *** 76,82 **** } } else { You("sit down."); ! dotrap(trap); } } else if(Underwater || Is_waterlevel(&u.uz)) { if (Is_waterlevel(&u.uz)) --- 96,102 ---- } } else { You("sit down."); ! dotrap(trap, 0); } } else if(Underwater || Is_waterlevel(&u.uz)) { if (Is_waterlevel(&u.uz)) *************** *** 84,90 **** else You("sit down on the muddy bottom."); } else if(is_pool(u.ux, u.uy)) { ! You("sit in the water."); if (!rn2(10) && uarm) (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); --- 104,110 ---- else You("sit down on the muddy bottom."); } else if(is_pool(u.ux, u.uy)) { ! in_water: You("sit in the water."); if (!rn2(10) && uarm) (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); *************** *** 191,197 **** pline("A voice echoes:"); verbalize("By thy Imperious order, %s...", flags.female ? "Dame" : "Sire"); ! do_genocide(1); break; case 9: pline("A voice echoes:"); --- 211,217 ---- pline("A voice echoes:"); verbalize("By thy Imperious order, %s...", flags.female ? "Dame" : "Sire"); ! do_genocide(5); /* REALLY|ONTHRONE, see do_genocide() */ break; case 9: pline("A voice echoes:"); *************** *** 241,253 **** default: impossible("throne effect"); break; } ! } else You_feel("somehow out of place..."); if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) { /* may have teleported */ pline_The("throne vanishes in a puff of logic."); levl[u.ux][u.uy].typ = ROOM; ! if(Invisible) newsym(u.ux,u.uy); } } else if (lays_eggs(youmonst.data)) { --- 261,278 ---- default: impossible("throne effect"); break; } ! } else { ! if (is_prince(youmonst.data)) ! You_feel("very comfortable here."); ! else ! You_feel("somehow out of place..."); ! } if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) { /* may have teleported */ pline_The("throne vanishes in a puff of logic."); levl[u.ux][u.uy].typ = ROOM; ! newsym(u.ux,u.uy); } } else if (lays_eggs(youmonst.data)) { *************** *** 301,307 **** for (otmp = invent; otmp; otmp = otmp->nobj) nobj++; ! if (nobj) for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1)); cnt > 0; cnt--) { onum = rn2(nobj); --- 326,332 ---- for (otmp = invent; otmp; otmp = otmp->nobj) nobj++; ! if (nobj) { for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1)); cnt > 0; cnt--) { onum = rn2(nobj); *************** *** 310,316 **** if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) && rn2(10) < 8) { ! pline("%s resists!", The(xname(otmp))); continue; } --- 335,341 ---- if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) && rn2(10) < 8) { ! pline("%s!", Tobjnam(otmp, "resist")); continue; } *************** *** 319,324 **** --- 344,351 ---- else curse(otmp); } + update_inventory(); + } } void *** nethack-3.3.1/src/sounds.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/sounds.c Thu Mar 21 07:37:37 2002 *************** *** 1,9 **** ! /* SCCS Id: @(#)sounds.c 3.3 2000/07/24 */ /* Copyright (c) 1989 Janet Walz, Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "edog.h" #ifdef OVLB --- 1,12 ---- ! /* SCCS Id: @(#)sounds.c 3.4 2001/02/14 */ /* Copyright (c) 1989 Janet Walz, Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "edog.h" + #ifdef USER_SOUNDS + #include + #endif #ifdef OVLB *************** *** 77,83 **** int which = rn2(3)+hallu; if (which != 2) You_hear(throne_msg[which]); ! else pline(throne_msg[2], his[flags.female]); return; } } --- 80,86 ---- int which = rn2(3)+hallu; if (which != 2) You_hear(throne_msg[which]); ! else pline(throne_msg[2], uhis()); return; } } *************** *** 319,325 **** else growl_verb = growl_sound(mtmp); if (growl_verb) { ! pline("%s %s!", Monnam(mtmp), makeplural(growl_verb)); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 18); } --- 322,328 ---- else growl_verb = growl_sound(mtmp); if (growl_verb) { ! pline("%s %s!", Monnam(mtmp), vtense((char *)0, growl_verb)); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 18); } *************** *** 360,366 **** break; } if (yelp_verb) { ! pline("%s %ss!", Monnam(mtmp), yelp_verb); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 12); } --- 363,369 ---- break; } if (yelp_verb) { ! pline("%s %s!", Monnam(mtmp), vtense((char *)0, yelp_verb)); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 12); } *************** *** 392,398 **** break; } if (whimper_verb) { ! pline("%s %ss.", Monnam(mtmp), whimper_verb); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 6); } --- 395,401 ---- break; } if (whimper_verb) { ! pline("%s %s.", Monnam(mtmp), vtense((char *)0, whimper_verb)); if(flags.run) nomul(0); wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 6); } *************** *** 408,414 **** return; /* presumably nearness and soundok checks have already been made */ ! if (mtmp->data->msound != MS_SILENT && mtmp->data->msound <= MS_ANIMAL) (void) domonnoise(mtmp); else if (mtmp->data->msound >= MS_HUMANOID) { if (!canspotmon(mtmp)) --- 411,417 ---- return; /* presumably nearness and soundok checks have already been made */ ! if (!is_silent(mtmp->data) && mtmp->data->msound <= MS_ANIMAL) (void) domonnoise(mtmp); else if (mtmp->data->msound >= MS_HUMANOID) { if (!canspotmon(mtmp)) *************** *** 428,434 **** /* presumably nearness and sleep checks have already been made */ if (!flags.soundok) return(0); ! if (ptr->msound == MS_SILENT) return(0); /* be sure to do this before talking; the monster might teleport away, in * which case we want to check its pre-teleport position --- 431,437 ---- /* presumably nearness and sleep checks have already been made */ if (!flags.soundok) return(0); ! if (is_silent(ptr)) return(0); /* be sure to do this before talking; the monster might teleport away, in * which case we want to check its pre-teleport position *************** *** 500,506 **** }; if (kindred) verbl_msg = "This is my hunting ground that you dare to prowl!"; ! else { vampindex = rn2(SIZE(vampmsg)); if (vampindex == 0) { Sprintf(verbuf, vampmsg[vampindex], body_part(BLOOD)); --- 503,516 ---- }; if (kindred) verbl_msg = "This is my hunting ground that you dare to prowl!"; ! else if (youmonst.data == &mons[PM_SILVER_DRAGON] || ! youmonst.data == &mons[PM_BABY_SILVER_DRAGON]) { ! /* Silver dragons are silver in color, not made of silver */ ! Sprintf(verbuf, "%s! Your silver sheen does not frighten me!", ! youmonst.data == &mons[PM_SILVER_DRAGON] ? ! "Fool" : "Young Fool"); ! verbl_msg = verbuf; ! } else { vampindex = rn2(SIZE(vampmsg)); if (vampindex == 0) { Sprintf(verbuf, vampmsg[vampindex], body_part(BLOOD)); *************** *** 518,524 **** case MS_WERE: if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) { pline("%s throws back %s head and lets out a blood curdling %s!", ! Monnam(mtmp), his[pronoun_gender(mtmp)], ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl"); wake_nearto(mtmp->mx, mtmp->my, 11*11); } else --- 528,534 ---- case MS_WERE: if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) { pline("%s throws back %s head and lets out a blood curdling %s!", ! Monnam(mtmp), mhis(mtmp), ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl"); wake_nearto(mtmp->mx, mtmp->my, 11*11); } else *************** *** 636,642 **** if (!mtmp->mpeaceful) { switch (rn2(4)) { case 0: pline("%s boasts about %s gem collection.", ! Monnam(mtmp), his[pronoun_gender(mtmp)]); break; case 1: pline_msg = "complains about a diet of mutton."; break; --- 646,652 ---- if (!mtmp->mpeaceful) { switch (rn2(4)) { case 0: pline("%s boasts about %s gem collection.", ! Monnam(mtmp), mhis(mtmp)); break; case 1: pline_msg = "complains about a diet of mutton."; break; *************** *** 766,772 **** --- 776,786 ---- else verbl_msg = "Relax, this won't hurt a bit."; break; case MS_GUARD: + #ifndef GOLDOBJ if (u.ugold) + #else + if (money_cnt(invent)) + #endif verbl_msg = "Please drop that gold and follow me."; else verbl_msg = "Please follow me."; *************** *** 817,823 **** register int tx,ty; struct obj *otmp; ! if (youmonst.data->msound == MS_SILENT) { pline("As %s, you cannot speak.", an(youmonst.data->mname)); return(0); } --- 831,837 ---- register int tx,ty; struct obj *otmp; ! if (is_silent(youmonst.data)) { pline("As %s, you cannot speak.", an(youmonst.data->mname)); return(0); } *************** *** 846,852 **** return(1); } ! (void) getdir("Talk to whom? [in what direction]"); #ifdef STEED if (u.usteed && u.dz > 0) --- 860,866 ---- return(1); } ! (void) getdir("Talk to whom? (in what direction)"); #ifdef STEED if (u.usteed && u.dz > 0) *************** *** 897,902 **** --- 911,1002 ---- return domonnoise(mtmp); } + + #ifdef USER_SOUNDS + + extern void FDECL(play_usersound, (const char*, int)); + + typedef struct audio_mapping_rec { + struct re_pattern_buffer regex; + char *filename; + int volume; + struct audio_mapping_rec *next; + } audio_mapping; + + static audio_mapping *soundmap = 0; + + char* sounddir = "."; + + /* adds a sound file mapping, returns 0 on failure, 1 on success */ + int + add_sound_mapping(mapping) + const char *mapping; + { + char text[256]; + char filename[256]; + char filespec[256]; + int volume; + + if (sscanf(mapping, "MESG \"%255[^\"]\"%*[\t ]\"%255[^\"]\" %d", + text, filename, &volume) == 3) { + const char *err; + audio_mapping *new_map; + + if (strlen(sounddir) + strlen(filename) > 254) { + raw_print("sound file name too long"); + return 0; + } + Sprintf(filespec, "%s/%s", sounddir, filename); + + if (can_read_file(filespec)) { + new_map = (audio_mapping *)alloc(sizeof(audio_mapping)); + new_map->regex.translate = 0; + new_map->regex.fastmap = 0; + new_map->regex.buffer = 0; + new_map->regex.allocated = 0; + new_map->regex.regs_allocated = REGS_FIXED; + new_map->filename = strdup(filespec); + new_map->volume = volume; + new_map->next = soundmap; + + err = re_compile_pattern(text, strlen(text), &new_map->regex); + + if (err) { + raw_print(err); + free(new_map->filename); + free(new_map); + return 0; + } else { + soundmap = new_map; + } + } else { + Sprintf(text, "cannot read %.243s", filespec); + raw_print(text); + return 0; + } + } else { + raw_print("syntax error in SOUND"); + return 0; + } + + return 1; + } + + void + play_sound_for_message(msg) + const char* msg; + { + audio_mapping* cursor = soundmap; + + while (cursor) { + if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0) >= 0) { + play_usersound(cursor->filename, cursor->volume); + } + cursor = cursor->next; + } + } + + #endif /* USER_SOUNDS */ #endif /* OVLB */ *** nethack-3.3.1/src/spell.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/spell.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)spell.c 3.3 2000/01/10 */ /* Copyright (c) M. Stephenson 1988 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)spell.c 3.4 2002/02/12 */ /* Copyright (c) M. Stephenson 1988 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 20,36 **** #define spellet(spell) \ ((char)((spell < 26) ? ('a' + spell) : ('A' + spell - 26))) ! static int FDECL(spell_let_to_idx, (CHAR_P)); ! static void FDECL(cursed_book, (int)); ! static void FDECL(deadbook, (struct obj *)); STATIC_PTR int NDECL(learn); ! static boolean FDECL(getspell, (int *)); ! static boolean FDECL(dospellmenu, (const char *,int,int *)); ! static int FDECL(percent_success, (int)); ! static int NDECL(throwspell); ! static void NDECL(cast_protection); ! static const char *FDECL(spelltypemnemonic, (int)); ! static int FDECL(isqrt, (int)); /* The roles[] table lists the role-specific values for tuning * percent_success(). --- 20,36 ---- #define spellet(spell) \ ((char)((spell < 26) ? ('a' + spell) : ('A' + spell - 26))) ! STATIC_DCL int FDECL(spell_let_to_idx, (CHAR_P)); ! STATIC_DCL void FDECL(cursed_book, (int)); ! STATIC_DCL void FDECL(deadbook, (struct obj *)); STATIC_PTR int NDECL(learn); ! STATIC_DCL boolean FDECL(getspell, (int *)); ! STATIC_DCL boolean FDECL(dospellmenu, (const char *,int,int *)); ! STATIC_DCL int FDECL(percent_success, (int)); ! STATIC_DCL int NDECL(throwspell); ! STATIC_DCL void NDECL(cast_protection); ! STATIC_DCL const char *FDECL(spelltypemnemonic, (int)); ! STATIC_DCL int FDECL(isqrt, (int)); /* The roles[] table lists the role-specific values for tuning * percent_success(). *************** *** 53,59 **** * * The arms penalty is lessened for trained fighters Bar, Kni, Ran, * Sam, Val - ! * the penalty is its metal interference, not encumberance. * The `spelspec' is a single spell which is fundamentally easier * for that role to cast. * --- 53,59 ---- * * The arms penalty is lessened for trained fighters Bar, Kni, Ran, * Sam, Val - ! * the penalty is its metal interference, not encumbrance. * The `spelspec' is a single spell which is fundamentally easier * for that role to cast. * *************** *** 89,95 **** static const char explodes[] = "radiates explosive energy"; /* convert a letter into a number in the range 0..51, or -1 if not a letter */ ! static int spell_let_to_idx(ilet) char ilet; { --- 89,95 ---- static const char explodes[] = "radiates explosive energy"; /* convert a letter into a number in the range 0..51, or -1 if not a letter */ ! STATIC_OVL int spell_let_to_idx(ilet) char ilet; { *************** *** 102,108 **** return -1; } ! static void cursed_book(lev) register int lev; { --- 102,108 ---- return -1; } ! STATIC_OVL void cursed_book(lev) register int lev; { *************** *** 131,140 **** if (uarmg->oerodeproof || !is_corrodeable(uarmg)) { Your("gloves seem unaffected."); } else if (uarmg->oeroded2 < MAX_ERODE) { ! Your("gloves corrode%s!", ! uarmg->oeroded2+1 == MAX_ERODE ? " completely" : ! uarmg->oeroded2 ? " further" : ""); ! uarmg->oeroded2++; } else Your("gloves %s completely corroded.", Blind ? "feel" : "look"); --- 131,145 ---- if (uarmg->oerodeproof || !is_corrodeable(uarmg)) { Your("gloves seem unaffected."); } else if (uarmg->oeroded2 < MAX_ERODE) { ! if (uarmg->greased) { ! grease_protect(uarmg, "gloves", &youmonst); ! } else { ! Your("gloves corrode%s!", ! uarmg->oeroded2+1 == MAX_ERODE ? ! " completely" : uarmg->oeroded2 ? ! " further" : ""); ! uarmg->oeroded2++; ! } } else Your("gloves %s completely corroded.", Blind ? "feel" : "look"); *************** *** 162,168 **** } /* special effects for The Book of the Dead */ ! static void deadbook(book2) struct obj *book2; { --- 167,173 ---- } /* special effects for The Book of the Dead */ ! STATIC_OVL void deadbook(book2) struct obj *book2; { *************** *** 238,244 **** } else if(book2->blessed) { for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; /* tamedog() changes chain */ ! if(!DEADMONSTER(mtmp) && is_undead(mtmp->data) && cansee(mtmp->mx, mtmp->my)) { mtmp->mpeaceful = TRUE; if(sgn(mtmp->data->maligntyp) == sgn(u.ualign.type) && distu(mtmp->mx, mtmp->my) < 4) --- 243,251 ---- } else if(book2->blessed) { for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; /* tamedog() changes chain */ ! if (DEADMONSTER(mtmp)) continue; ! ! if (is_undead(mtmp->data) && cansee(mtmp->mx, mtmp->my)) { mtmp->mpeaceful = TRUE; if(sgn(mtmp->data->maligntyp) == sgn(u.ualign.type) && distu(mtmp->mx, mtmp->my) < 4) *************** *** 247,253 **** mtmp->mtame++; } else (void) tamedog(mtmp, (struct obj *)0); ! else mtmp->mflee = TRUE; } } } else { --- 254,260 ---- mtmp->mtame++; } else (void) tamedog(mtmp, (struct obj *)0); ! else monflee(mtmp, 0, FALSE, TRUE); } } } else { *************** *** 273,278 **** --- 280,287 ---- char splname[BUFSZ]; boolean costly = TRUE; + /* JDS: lenses give 50% faster reading; 33% smaller read time */ + if (delay && ublindf && ublindf->otyp == LENSES && rn2(2)) delay++; if (delay) { /* not if (delay++), so at end delay == 0 */ delay++; return(1); /* still busy */ *************** *** 372,400 **** /* Books are often wiser than their readers (Rus.) */ spellbook->in_use = TRUE; ! if (!spellbook->blessed && spellbook->otyp != SPE_BOOK_OF_THE_DEAD) { ! if (spellbook->cursed) { ! too_hard = TRUE; ! } else { ! /* uncursed - chance to fail */ ! int read_ability = ACURR(A_INT) + 4 + u.ulevel/2 ! - 2*objects[booktype].oc_level; ! /* only wizards know if a spell is too difficult */ ! if (Role_if(PM_WIZARD) && read_ability < 20) { ! char qbuf[QBUFSZ]; ! Sprintf(qbuf, "This spellbook is %sdifficult to comprehend. Continue?", ! (read_ability < 12 ? "very " : "")); ! if (yn(qbuf) != 'y') { ! spellbook->in_use = FALSE; ! return(1); ! } ! } ! /* its up to random luck now */ ! if (rnd(20) > read_ability) { ! too_hard = TRUE; } } } if (too_hard) { --- 381,411 ---- /* Books are often wiser than their readers (Rus.) */ spellbook->in_use = TRUE; ! if (!spellbook->blessed && ! spellbook->otyp != SPE_BOOK_OF_THE_DEAD) { ! if (spellbook->cursed) { ! too_hard = TRUE; ! } else { ! /* uncursed - chance to fail */ ! int read_ability = ACURR(A_INT) + 4 + u.ulevel/2 ! - 2*objects[booktype].oc_level ! + ((ublindf && ublindf->otyp == LENSES) ? 2 : 0); ! /* only wizards know if a spell is too difficult */ ! if (Role_if(PM_WIZARD) && read_ability < 20) { ! char qbuf[QBUFSZ]; ! Sprintf(qbuf, "This spellbook is %sdifficult to comprehend. Continue?", ! (read_ability < 12 ? "very " : "")); ! if (yn(qbuf) != 'y') { ! spellbook->in_use = FALSE; ! return(1); } } + /* its up to random luck now */ + if (rnd(20) > read_ability) { + too_hard = TRUE; + } + } } if (too_hard) { *************** *** 442,447 **** --- 453,467 ---- return(1); } + /* a spellbook has been destroyed or the character has changed levels; + the stored address for the current book is no longer valid */ + void + book_disappears(obj) + struct obj *obj; + { + if (obj == book) book = (struct obj *)0; + } + /* renaming an object usually results in it having a different address; so the sequence start reading, get interrupted, name the book, resume reading would read the "new" book from scratch */ *************** *** 473,479 **** * Return TRUE if a spell was picked, with the spell index in the return * parameter. Otherwise return FALSE. */ ! static boolean getspell(spell_no) int *spell_no; { --- 493,499 ---- * Return TRUE if a spell was picked, with the spell index in the return * parameter. Otherwise return FALSE. */ ! STATIC_OVL boolean getspell(spell_no) int *spell_no; { *************** *** 526,532 **** return 0; } ! static const char * spelltypemnemonic(skill) int skill; { --- 546,552 ---- return 0; } ! STATIC_OVL const char * spelltypemnemonic(skill) int skill; { *************** *** 558,564 **** return (objects[booktype].oc_skill); } ! static void cast_protection() { int loglev = 0; --- 578,584 ---- return (objects[booktype].oc_skill); } ! STATIC_OVL void cast_protection() { int loglev = 0; *************** *** 742,756 **** n=rnd(8)+1; while(n--) { if(!u.dx && !u.dy && !u.dz) { ! if ((damage = zapyourself(pseudo, TRUE)) != 0) ! losehp(damage, ! self_pronoun("zapped %sself with a spell", ! "him"), ! NO_KILLER_PREFIX); } else { explode(u.dx, u.dy, pseudo->otyp - SPE_MAGIC_MISSILE + 10, ! u.ulevel/2 + 1 + spell_damage_bonus(), 0); } u.dx = cc.x+rnd(3)-2; u.dy = cc.y+rnd(3)-2; if (!isok(u.dx,u.dy) || !cansee(u.dx,u.dy) || --- 762,778 ---- n=rnd(8)+1; while(n--) { if(!u.dx && !u.dy && !u.dz) { ! if ((damage = zapyourself(pseudo, TRUE)) != 0) { ! char buf[BUFSZ]; ! Sprintf(buf, "zapped %sself with a spell", uhim()); ! losehp(damage, buf, NO_KILLER_PREFIX); ! } } else { explode(u.dx, u.dy, pseudo->otyp - SPE_MAGIC_MISSILE + 10, ! u.ulevel/2 + 1 + spell_damage_bonus(), 0, ! (pseudo->otyp == SPE_CONE_OF_COLD) ? ! EXPL_FROSTY : EXPL_FIERY); } u.dx = cc.x+rnd(3)-2; u.dy = cc.y+rnd(3)-2; if (!isok(u.dx,u.dy) || !cansee(u.dx,u.dy) || *************** *** 787,799 **** if (atme) u.dx = u.dy = u.dz = 0; else (void) getdir((char *)0); if(!u.dx && !u.dy && !u.dz) { ! if ((damage = zapyourself(pseudo, TRUE)) != 0) ! losehp(damage, ! self_pronoun("zapped %sself with a spell", ! "him"), ! NO_KILLER_PREFIX); } else weffects(pseudo); } else weffects(pseudo); break; /* these are all duplicates of scroll effects */ --- 809,822 ---- if (atme) u.dx = u.dy = u.dz = 0; else (void) getdir((char *)0); if(!u.dx && !u.dy && !u.dz) { ! if ((damage = zapyourself(pseudo, TRUE)) != 0) { ! char buf[BUFSZ]; ! Sprintf(buf, "zapped %sself with a spell", uhim()); ! losehp(damage, buf, NO_KILLER_PREFIX); ! } } else weffects(pseudo); } else weffects(pseudo); + update_inventory(); /* spell may modify inventory */ break; /* these are all duplicates of scroll effects */ *************** *** 832,837 **** --- 855,861 ---- if (Slimed) { pline_The("slime disappears!"); Slimed = 0; + /* flags.botl = 1; -- healup() handles this */ } healup(0, 0, TRUE, FALSE); break; *************** *** 868,874 **** } /* Choose location where spell takes effect. */ ! static int throwspell() { coord cc; --- 892,898 ---- } /* Choose location where spell takes effect. */ ! STATIC_OVL int throwspell() { coord cc; *************** *** 948,954 **** return 0; } ! static boolean dospellmenu(prompt, splaction, spell_no) const char *prompt; int splaction; /* SPELLMENU_CAST, SPELLMENU_VIEW, or spl_book[] index */ --- 972,978 ---- return 0; } ! STATIC_OVL boolean dospellmenu(prompt, splaction, spell_no) const char *prompt; int splaction; /* SPELLMENU_CAST, SPELLMENU_VIEW, or spl_book[] index */ *************** *** 973,982 **** * To do it right would require that we implement columns * in the window-ports (say via a tab character). */ ! Sprintf(buf, "%-20s Level %-12s Fail", " Name", "Category"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); for (i = 0; i < MAXSPELL && spellid(i) != NO_SPELL; i++) { ! Sprintf(buf, "%-20s %2d%s %-12s %3d%%", spellname(i), spellev(i), spellknow(i) ? " " : "*", spelltypemnemonic(spell_skilltype(spellid(i))), --- 997,1010 ---- * To do it right would require that we implement columns * in the window-ports (say via a tab character). */ ! if (!iflags.menu_tab_sep) ! Sprintf(buf, "%-20s Level %-12s Fail", " Name", "Category"); ! else ! Sprintf(buf, "Name\tLevel\tCategory\tFail"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); for (i = 0; i < MAXSPELL && spellid(i) != NO_SPELL; i++) { ! Sprintf(buf, iflags.menu_tab_sep ? ! "%s\t%-d%s\t%s\t%-d%%" : "%-20s %2d%s %-12s %3d%%", spellname(i), spellev(i), spellknow(i) ? " " : "*", spelltypemnemonic(spell_skilltype(spellid(i))), *************** *** 1015,1021 **** } /* Integer square root function without using floating point. */ ! static int isqrt(val) int val; { --- 1043,1049 ---- } /* Integer square root function without using floating point. */ ! STATIC_OVL int isqrt(val) int val; { *************** *** 1029,1035 **** return rt; } ! static int percent_success(spell) int spell; { --- 1057,1063 ---- return rt; } ! STATIC_OVL int percent_success(spell) int spell; { *************** *** 1084,1090 **** * The difficulty is based on the hero's level and their skill level * in that spell type. */ ! skill = P_SKILL(spell_skilltype(spellid(spell)))-1; difficulty= (spellev(spell)-1) * 4 - ((skill * 6) + (u.ulevel/3) + 1); if (difficulty > 0) { --- 1112,1119 ---- * The difficulty is based on the hero's level and their skill level * in that spell type. */ ! skill = P_SKILL(spell_skilltype(spellid(spell))); ! skill = max(skill,P_UNSKILLED) - 1; /* unskilled => 0 */ difficulty= (spellev(spell)-1) * 4 - ((skill * 6) + (u.ulevel/3) + 1); if (difficulty > 0) { *************** *** 1122,1129 **** /* Finally, chance (based on player intell/wisdom and level) is * combined with ability (based on player intrinsics and ! * encumberances). No matter how intelligent/wise and advanced ! * a player is, intrinsics and encumberance can prevent casting; * and no matter how able, learning is always required. */ chance = chance * (20-splcaster) / 15 - splcaster; --- 1151,1158 ---- /* Finally, chance (based on player intell/wisdom and level) is * combined with ability (based on player intrinsics and ! * encumbrances). No matter how intelligent/wise and advanced ! * a player is, intrinsics and encumbrance can prevent casting; * and no matter how able, learning is always required. */ chance = chance * (20-splcaster) / 15 - splcaster; *************** *** 1159,1164 **** impossible("Too many spells memorized!"); return; } - /*spell.c*/ --- 1188,1192 ---- *** nethack-3.3.1/src/sp_lev.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/sp_lev.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)sp_lev.c 3.3 1999/11/16 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)sp_lev.c 3.4 2001/09/06 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 850,857 **** case M_AP_OBJECT: for (i = 0; i < NUM_OBJECTS; i++) ! if (!strcmp(OBJ_NAME(objects[i]), ! m->appear_as.str)) break; if (i == NUM_OBJECTS) { impossible( --- 850,857 ---- case M_AP_OBJECT: for (i = 0; i < NUM_OBJECTS; i++) ! if (OBJ_NAME(objects[i]) && ! !strcmp(OBJ_NAME(objects[i]),m->appear_as.str)) break; if (i == NUM_OBJECTS) { impossible( *************** *** 912,919 **** --- 912,921 ---- struct obj *otmp; schar x, y; char c; + boolean named; /* has a name been supplied in level description? */ if (rn2(100) < o->chance) { + named = o->name.str ? TRUE : FALSE; x = o->x; y = o->y; if (croom) *************** *** 929,937 **** c = 0; if (!c) ! otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE); else if (o->id != -1) ! otmp = mksobj_at(o->id, x, y, TRUE); else { /* * The special levels are compiled with the default "text" object --- 931,939 ---- c = 0; if (!c) ! otmp = mkobj_at(RANDOM_CLASS, x, y, !named); else if (o->id != -1) ! otmp = mksobj_at(o->id, x, y, TRUE, !named); else { /* * The special levels are compiled with the default "text" object *************** *** 944,952 **** /* KMH -- Create piles of gold properly */ if (oclass == GOLD_CLASS) ! otmp = mkgold(0L, x, y); else ! otmp = mkobj_at(oclass, x, y, TRUE); } if (o->spe != -127) /* That means NOT RANDOM! */ --- 946,954 ---- /* KMH -- Create piles of gold properly */ if (oclass == GOLD_CLASS) ! otmp = mkgold(0L, x, y); else ! otmp = mkobj_at(oclass, x, y, !named); } if (o->spe != -127) /* That means NOT RANDOM! */ *************** *** 973,981 **** attach_egg_hatch_timeout(otmp); /* attach new hatch timeout */ } ! if (o->name.str) { /* Give a name to that object */ otmp = oname(otmp, o->name.str); - } switch(o->containment) { static struct obj *container = 0; --- 975,982 ---- attach_egg_hatch_timeout(otmp); /* attach new hatch timeout */ } ! if (named) otmp = oname(otmp, o->name.str); switch(o->containment) { static struct obj *container = 0; *************** *** 987,993 **** break; } remove_object(otmp); ! add_to_container(container, otmp); goto o_done; /* don't stack, but do other cleanup */ /* container */ case 2: --- 988,994 ---- break; } remove_object(otmp); ! (void) add_to_container(container, otmp); goto o_done; /* don't stack, but do other cleanup */ /* container */ case 2: *************** *** 1025,1032 **** obj = was->minvent; obj->owornmask = 0; obj_extract_self(obj); ! add_to_container(otmp, obj); } mongone(was); } --- 1026,1034 ---- obj = was->minvent; obj->owornmask = 0; obj_extract_self(obj); ! (void) add_to_container(otmp, obj); } + otmp->owt = weight(otmp); mongone(was); } *************** *** 1128,1134 **** levl[x][y].typ = ALTAR; levl[x][y].altarmask = amask; ! if (a->shrine == -11) a->shrine = rn2(1); /* handle random case */ if (oldtyp == FOUNTAIN) level.flags.nfountains--; --- 1130,1136 ---- levl[x][y].typ = ALTAR; levl[x][y].altarmask = amask; ! if (a->shrine < 0) a->shrine = rn2(2); /* handle random case */ if (oldtyp == FOUNTAIN) level.flags.nfountains--; *************** *** 1309,1315 **** if(ftyp != CORR || rn2(100)) { crm->typ = ftyp; if(nxcor && !rn2(50)) ! (void) mksobj_at(BOULDER, xx, yy, TRUE); } else { crm->typ = SCORR; } --- 1311,1317 ---- if(ftyp != CORR || rn2(100)) { crm->typ = ftyp; if(nxcor && !rn2(50)) ! (void) mksobj_at(BOULDER, xx, yy, TRUE, FALSE); } else { crm->typ = SCORR; } *************** *** 2187,2193 **** if (x != xstart && (IS_WALL(levl[x-1][y].typ) || levl[x-1][y].horizontal)) levl[x][y].horizontal = 1; ! } else if(levl[x][y].typ == HWALL) levl[x][y].horizontal = 1; else if(levl[x][y].typ == LAVAPOOL) levl[x][y].lit = 1; --- 2189,2196 ---- if (x != xstart && (IS_WALL(levl[x-1][y].typ) || levl[x-1][y].horizontal)) levl[x][y].horizontal = 1; ! } else if(levl[x][y].typ == HWALL || ! levl[x][y].typ == IRONBARS) levl[x][y].horizontal = 1; else if(levl[x][y].typ == LAVAPOOL) levl[x][y].lit = 1; *************** *** 2584,2590 **** } for(x = rnd((int) (12 * mapfact) / 100); x; x--) { maze1xy(&mm, DRY); ! (void) mksobj_at(BOULDER, mm.x, mm.y, TRUE); } for (x = rn2(2); x; x--) { maze1xy(&mm, DRY); --- 2587,2593 ---- } for(x = rnd((int) (12 * mapfact) / 100); x; x--) { maze1xy(&mm, DRY); ! (void) mksobj_at(BOULDER, mm.x, mm.y, TRUE, FALSE); } for (x = rn2(2); x; x--) { maze1xy(&mm, DRY); *** nethack-3.3.1/src/steal.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/steal.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)steal.c 3.3 1999/02/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)steal.c 3.4 2002/01/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 20,29 **** (otmp == uarmf) ? "boots" : (otmp == uarms) ? "shield" : (otmp == uarmg) ? "gloves" : ! (otmp == uarmc) ? "cloak" : (otmp == uarmh) ? "helmet" : "armor"); } long /* actually returns something that fits in an int */ somegold() { --- 20,30 ---- (otmp == uarmf) ? "boots" : (otmp == uarms) ? "shield" : (otmp == uarmg) ? "gloves" : ! (otmp == uarmc) ? cloak_simple_name(otmp) : (otmp == uarmh) ? "helmet" : "armor"); } + #ifndef GOLDOBJ long /* actually returns something that fits in an int */ somegold() { *************** *** 50,66 **** Monnam(mtmp), makeplural(body_part(FOOT))); if(!u.ugold || !rn2(5)) { if (!tele_restrict(mtmp)) rloc(mtmp); ! mtmp->mflee = 1; } } else if(u.ugold) { u.ugold -= (tmp = somegold()); Your("purse feels lighter."); mtmp->mgold += tmp; if (!tele_restrict(mtmp)) rloc(mtmp); ! mtmp->mflee = 1; flags.botl = 1; } } /* steal armor after you finish taking it off */ unsigned int stealoid; /* object to be stolen */ --- 51,139 ---- Monnam(mtmp), makeplural(body_part(FOOT))); if(!u.ugold || !rn2(5)) { if (!tele_restrict(mtmp)) rloc(mtmp); ! monflee(mtmp, 0, FALSE, FALSE); } } else if(u.ugold) { u.ugold -= (tmp = somegold()); Your("purse feels lighter."); mtmp->mgold += tmp; + if (!tele_restrict(mtmp)) rloc(mtmp); + monflee(mtmp, 0, FALSE, FALSE); + flags.botl = 1; + } + } + + #else /* !GOLDOBJ */ + + long /* actually returns something that fits in an int */ + somegold(umoney) + long umoney; + { + #ifdef LINT /* long conv. ok */ + return(0L); + #else + return (long)( (umoney < 100) ? umoney : + (umoney > 10000) ? rnd(10000) : rnd((int) umoney) ); + #endif + } + + /* + Find the first (and hopefully only) gold object in a chain. + Used when leprechaun (or you as leprechaun) looks for + someone else's gold. Returns a pointer so the gold may + be seized without further searching. + May search containers too. + Deals in gold only, as leprechauns don't care for lesser coins. + */ + struct obj * + findgold(chain) + register struct obj *chain; + { + while (chain && chain->otyp != GOLD_PIECE) chain = chain->nobj; + return chain; + } + + /* + Steal gold coins only. Leprechauns don't care for lesser coins. + */ + void + stealgold(mtmp) + register struct monst *mtmp; + { + register struct obj *fgold = g_at(u.ux, u.uy); + register struct obj *ygold; + register long tmp; + + /* skip lesser coins on the floor */ + while (fgold && fgold->otyp != GOLD_PIECE) fgold = fgold->nexthere; + + /* Do you have real gold? */ + ygold = findgold(invent); + + if (fgold && ( !ygold || fgold->quan > ygold->quan || !rn2(5))) { + obj_extract_self(fgold); + add_to_minv(mtmp, fgold); + newsym(u.ux, u.uy); + pline("%s quickly snatches some gold from between your %s!", + Monnam(mtmp), makeplural(body_part(FOOT))); + if(!ygold || !rn2(5)) { + if (!tele_restrict(mtmp)) rloc(mtmp); + monflee(mtmp, 0, FALSE, FALSE); + } + } else if(ygold) { + const int gold_price = objects[GOLD_PIECE].oc_cost; + tmp = (somegold(money_cnt(invent)) + gold_price - 1) / gold_price; + tmp = min(tmp, ygold->quan); + if (tmp < ygold->quan) ygold = splitobj(ygold, tmp); + freeinv(ygold); + add_to_minv(mtmp, ygold); + Your("purse feels lighter."); if (!tele_restrict(mtmp)) rloc(mtmp); ! monflee(mtmp, 0, FALSE, FALSE); flags.botl = 1; } } + #endif /* GOLDOBJ */ /* steal armor after you finish taking it off */ unsigned int stealoid; /* object to be stolen */ *************** *** 84,90 **** freeinv(otmp); pline("%s steals %s!", Monnam(mtmp), doname(otmp)); (void) mpickobj(mtmp,otmp); /* may free otmp */ ! mtmp->mflee = 1; if (!tele_restrict(mtmp)) rloc(mtmp); break; } --- 157,163 ---- freeinv(otmp); pline("%s steals %s!", Monnam(mtmp), doname(otmp)); (void) mpickobj(mtmp,otmp); /* may free otmp */ ! monflee(mtmp, 0, FALSE, FALSE); if (!tele_restrict(mtmp)) rloc(mtmp); break; } *************** *** 96,102 **** return 0; } ! /* An object you're wearing has been taken off my a monster (theft or seduction). Also used if a worn item gets transformed (stone to flesh). */ void remove_worn_item(obj) --- 169,175 ---- return 0; } ! /* An object you're wearing has been taken off by a monster (theft or seduction). Also used if a worn item gets transformed (stone to flesh). */ void remove_worn_item(obj) *************** *** 107,124 **** if (!obj->owornmask) return; ! switch (obj->oclass) { ! case TOOL_CLASS: ! if (obj == ublindf) Blindf_off(obj); ! break; ! case AMULET_CLASS: ! Amulet_off(); ! break; ! case RING_CLASS: ! case FOOD_CLASS: /* meat ring */ ! Ring_gone(obj); ! break; ! case ARMOR_CLASS: if (obj == uarm) (void) Armor_off(); else if (obj == uarmc) (void) Cloak_off(); else if (obj == uarmf) (void) Boots_off(); --- 180,190 ---- if (!obj->owornmask) return; ! if (obj->owornmask & W_ARMOR) { ! if (obj == uskin) { ! impossible("Removing embedded scales?"); ! skinback(TRUE); /* uarm = uskin; uskin = 0; */ ! } if (obj == uarm) (void) Armor_off(); else if (obj == uarmc) (void) Cloak_off(); else if (obj == uarmf) (void) Boots_off(); *************** *** 126,137 **** else if (obj == uarmh) (void) Helmet_off(); else if (obj == uarms) (void) Shield_off(); else setworn((struct obj *)0, obj->owornmask & W_ARMOR); ! break; ! default: ! /* shouldn't reach here, but just in case... */ ! setnotworn(obj); ! break; } } /* Returns 1 when something was stolen (or at least, when N should flee now) --- 192,216 ---- else if (obj == uarmh) (void) Helmet_off(); else if (obj == uarms) (void) Shield_off(); else setworn((struct obj *)0, obj->owornmask & W_ARMOR); ! } else if (obj->owornmask & W_AMUL) { ! Amulet_off(); ! } else if (obj->owornmask & W_RING) { ! Ring_gone(obj); ! } else if (obj->owornmask & W_TOOL) { ! Blindf_off(obj); ! } else if (obj->owornmask & (W_BALL|W_CHAIN)) { ! unpunish(); ! } else if (obj->owornmask & (W_WEP|W_SWAPWEP|W_QUIVER)) { ! if (obj == uwep) ! uwepgone(); ! else if (obj == uswapwep) ! uswapwepgone(); ! else if (obj == uquiver) ! uqwepgone(); } + + /* catchall */ + if (obj->owornmask) setnotworn(obj); } /* Returns 1 when something was stolen (or at least, when N should flee now) *************** *** 139,153 **** * Avoid stealing the object stealoid */ int ! steal(mtmp) struct monst *mtmp; { struct obj *otmp; ! int tmp, could_petrify, named = 0; /* the following is true if successful on first of two attacks. */ if(!monnear(mtmp, u.ux, u.uy)) return(0); if (!invent || (inv_cnt() == 1 && uskin)) { nothing_to_steal: /* Not even a thousand men in armor can strip a naked man. */ --- 218,240 ---- * Avoid stealing the object stealoid */ int ! steal(mtmp, objnambuf) struct monst *mtmp; + char *objnambuf; { struct obj *otmp; ! int tmp, could_petrify, named = 0, armordelay; ! boolean monkey_business; /* true iff an animal is doing the thievery */ + if (objnambuf) *objnambuf = '\0'; /* the following is true if successful on first of two attacks. */ if(!monnear(mtmp, u.ux, u.uy)) return(0); + /* food being eaten might already be used up but will not have + been removed from inventory yet; we don't want to steal that, + so this will cause it to be removed now */ + if (occupation) (void) maybe_finished_meal(FALSE); + if (!invent || (inv_cnt() == 1 && uskin)) { nothing_to_steal: /* Not even a thousand men in armor can strip a naked man. */ *************** *** 159,165 **** return(1); /* let her flee */ } ! if (Adornment & LEFT_RING) { otmp = uleft; goto gotobj; } else if (Adornment & RIGHT_RING) { --- 246,255 ---- return(1); /* let her flee */ } ! monkey_business = is_animal(mtmp->data); ! if (monkey_business) { ! ; /* skip ring special cases */ ! } else if (Adornment & LEFT_RING) { otmp = uleft; goto gotobj; } else if (Adornment & RIGHT_RING) { *************** *** 183,189 **** #ifdef INVISIBLE_OBJECTS && (!otmp->oinvis || perceives(mtmp->data)) #endif ! ) if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1)) < 0) break; --- 273,279 ---- #ifdef INVISIBLE_OBJECTS && (!otmp->oinvis || perceives(mtmp->data)) #endif ! ) if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1)) < 0) break; *************** *** 203,209 **** gotobj: if(otmp->o_id == stealoid) return(0); ! if(otmp->otyp == LEASH && otmp->leashmon) o_unleash(otmp); if((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))){ switch(otmp->oclass) { --- 293,331 ---- gotobj: if(otmp->o_id == stealoid) return(0); ! /* animals can't overcome curse stickiness nor unlock chains */ ! if (monkey_business) { ! boolean ostuck; ! /* is the player prevented from voluntarily giving up this item? ! (ignores loadstones; the !can_carry() check will catch those) */ ! if (otmp == uball) ! ostuck = TRUE; /* effectively worn; curse is implicit */ ! else if (otmp == uquiver || (otmp == uswapwep && !u.twoweap)) ! ostuck = FALSE; /* not really worn; curse doesn't matter */ ! else ! ostuck = (otmp->cursed && otmp->owornmask); ! ! if (ostuck || !can_carry(mtmp, otmp)) { ! static const char *how[] = { "steal","snatch","grab","take" }; ! cant_take: ! pline("%s tries to %s your %s but gives up.", ! Monnam(mtmp), how[rn2(SIZE(how))], ! (otmp->owornmask & W_ARMOR) ? equipname(otmp) : ! cxname(otmp)); ! /* the fewer items you have, the less likely the thief ! is going to stick around to try again (0) instead of ! running away (1) */ ! return !rn2(inv_cnt() / 5 + 2); ! } ! } ! ! if (otmp->otyp == LEASH && otmp->leashmon) { ! if (monkey_business && otmp->cursed) goto cant_take; ! o_unleash(otmp); ! } ! ! /* you're going to notice the theft... */ ! stop_occupation(); if((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))){ switch(otmp->oclass) { *************** *** 211,243 **** case AMULET_CLASS: case RING_CLASS: case FOOD_CLASS: /* meat ring */ remove_worn_item(otmp); break; ! case ARMOR_CLASS: ! /* Stop putting on armor which has been stolen. */ ! if (donning(otmp) || is_animal(mtmp->data)) { ! remove_worn_item(otmp); ! break; ! } else { int curssv = otmp->cursed; otmp->cursed = 0; ! stop_occupation(); if(flags.female) pline("%s charms you. You gladly %s your %s.", Blind ? "She" : Monnam(mtmp), curssv ? "let her take" : ! (objects[otmp->otyp].oc_delay > 1) ? "start removing" : "hand over", equipname(otmp)); else pline("%s seduces you and %s off your %s.", Blind ? "It" : Adjmonnam(mtmp, "beautiful"), curssv ? "helps you to take" : ! (objects[otmp->otyp].oc_delay > 1) ? "you start taking" : "you take", equipname(otmp)); named++; /* the following is to set multi for later on */ ! nomul(-objects[otmp->otyp].oc_delay); remove_worn_item(otmp); otmp->cursed = curssv; if(multi < 0){ --- 333,375 ---- case AMULET_CLASS: case RING_CLASS: case FOOD_CLASS: /* meat ring */ + remove_worn_item(otmp); + break; + case ARMOR_CLASS: + armordelay = objects[otmp->otyp].oc_delay; + /* Stop putting on armor which has been stolen. */ + if (donning(otmp)) { remove_worn_item(otmp); break; ! } else if (monkey_business) { ! /* animals usually don't have enough patience ! to take off items which require extra time */ ! if (armordelay >= 1 && rn2(10)) goto cant_take; ! remove_worn_item(otmp); ! break; ! } else { int curssv = otmp->cursed; + int slowly; otmp->cursed = 0; ! /* can't charm you without first waking you */ ! if (multi < 0 && is_fainted()) unmul((char *)0); ! slowly = (armordelay >= 1 || multi < 0); if(flags.female) pline("%s charms you. You gladly %s your %s.", Blind ? "She" : Monnam(mtmp), curssv ? "let her take" : ! slowly ? "start removing" : "hand over", equipname(otmp)); else pline("%s seduces you and %s off your %s.", Blind ? "It" : Adjmonnam(mtmp, "beautiful"), curssv ? "helps you to take" : ! slowly ? "you start taking" : "you take", equipname(otmp)); named++; /* the following is to set multi for later on */ ! nomul(-armordelay); remove_worn_item(otmp); otmp->cursed = curssv; if(multi < 0){ *************** *** 252,271 **** return(0); } } ! break; default: ! impossible("Tried to steal a strange worn thing."); } } ! else if (otmp == uwep) uwepgone(); ! else if (otmp == uquiver) uqwepgone(); ! else if (otmp == uswapwep) uswapwepgone(); ! if(otmp == uball) unpunish(); freeinv(otmp); pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); ! could_petrify = otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]); (void) mpickobj(mtmp,otmp); /* may free otmp */ if (could_petrify && !(mtmp->misc_worn_check & W_ARMG)) { minstapetrify(mtmp, TRUE); --- 384,405 ---- return(0); } } ! break; default: ! impossible("Tried to steal a strange worn thing. [%d]", ! otmp->oclass); } } ! else if (otmp->owornmask) ! remove_worn_item(otmp); ! /* do this before removing it from inventory */ ! if (objnambuf) Strcpy(objnambuf, yname(otmp)); freeinv(otmp); pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); ! could_petrify = (otmp->otyp == CORPSE && ! touch_petrifies(&mons[otmp->corpsenm])); (void) mpickobj(mtmp,otmp); /* may free otmp */ if (could_petrify && !(mtmp->misc_worn_check & W_ARMG)) { minstapetrify(mtmp, TRUE); *************** *** 285,316 **** { int freed_otmp; if (otmp->oclass == GOLD_CLASS) { mtmp->mgold += otmp->quan; obfree(otmp, (struct obj *)0); freed_otmp = 1; } else { ! boolean snuff_otmp = FALSE; ! /* don't want hidden light source inside the monster; assumes that ! engulfers won't have external inventories; whirly monsters cause ! the light to be extinguished rather than letting it shine thru */ ! if (otmp->lamplit && /* hack to avoid function calls for most objs */ ! obj_sheds_light(otmp) && ! attacktype(mtmp->data, AT_ENGL)) { ! /* this is probably a burning object that you dropped or threw */ ! if (u.uswallow && mtmp == u.ustuck && !Blind) ! pline("%s go%s out.", The(xname(otmp)), ! otmp->quan == 1L ? "es" : ""); ! snuff_otmp = TRUE; ! } ! /* Must do carrying effects on object prior to add_to_minv() */ ! carry_obj_effects(otmp); ! /* add_to_minv() might free otmp [if merged with something else], ! so we have to call it after doing the object checks */ ! freed_otmp = add_to_minv(mtmp, otmp); ! /* and we had to defer this until object is in mtmp's inventory */ ! if (snuff_otmp) snuff_light_source(mtmp->mx, mtmp->my); } return freed_otmp; } --- 419,453 ---- { int freed_otmp; + #ifndef GOLDOBJ if (otmp->oclass == GOLD_CLASS) { mtmp->mgold += otmp->quan; obfree(otmp, (struct obj *)0); freed_otmp = 1; } else { ! #endif ! boolean snuff_otmp = FALSE; ! /* don't want hidden light source inside the monster; assumes that ! engulfers won't have external inventories; whirly monsters cause ! the light to be extinguished rather than letting it shine thru */ ! if (otmp->lamplit && /* hack to avoid function calls for most objs */ ! obj_sheds_light(otmp) && ! attacktype(mtmp->data, AT_ENGL)) { ! /* this is probably a burning object that you dropped or threw */ ! if (u.uswallow && mtmp == u.ustuck && !Blind) ! pline("%s out.", Tobjnam(otmp, "go")); ! snuff_otmp = TRUE; } + /* Must do carrying effects on object prior to add_to_minv() */ + carry_obj_effects(otmp); + /* add_to_minv() might free otmp [if merged with something else], + so we have to call it after doing the object checks */ + freed_otmp = add_to_minv(mtmp, otmp); + /* and we had to defer this until object is in mtmp's inventory */ + if (snuff_otmp) snuff_light_source(mtmp->mx, mtmp->my); + #ifndef GOLDOBJ + } + #endif return freed_otmp; } *************** *** 399,404 **** --- 536,548 ---- continue; } mtmp->misc_worn_check &= ~(otmp->owornmask); + #ifdef STEED + /* don't charge for an owned saddle on dead pet */ + if (mtmp->mtame && mtmp->mhp == 0 && + (otmp->owornmask & W_SADDLE) && !otmp->unpaid && + costly_spot(mtmp->mx, mtmp->my)) + otmp->no_charge = 1; + #endif otmp->owornmask = 0L; } if (is_pet && cansee(omx, omy) && flags.verbose) *************** *** 413,419 **** keepobj = otmp->nobj; (void) add_to_minv(mtmp, otmp); } ! if (mtmp->mgold) { register long g = mtmp->mgold; (void) mkgold(g, omx, omy); --- 557,563 ---- keepobj = otmp->nobj; (void) add_to_minv(mtmp, otmp); } ! #ifndef GOLDOBJ if (mtmp->mgold) { register long g = mtmp->mgold; (void) mkgold(g, omx, omy); *************** *** 422,427 **** --- 566,573 ---- g, plur(g)); mtmp->mgold = 0L; } + #endif + if (show & cansee(omx, omy)) newsym(omx, omy); } *** nethack-3.3.1/src/steed.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/steed.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)steed.c 3.3 2000/07/29 */ /* Copyright (c) Kevin Hugo, 1998-1999. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)steed.c 3.4 2002/03/09 */ /* Copyright (c) Kevin Hugo, 1998-1999. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,17 **** --- 12,18 ---- S_QUADRUPED, S_UNICORN, S_ANGEL, S_CENTAUR, S_DRAGON, S_JABBERWOCK, '\0' }; + STATIC_DCL boolean FDECL(landing_spot, (coord *, int)); /*** Putting the saddle on ***/ *************** *** 200,205 **** --- 201,226 ---- pline("Maybe you should find a designated driver."); return (FALSE); } + /* While riding Wounded_legs refers to the steed's, + * not the hero's legs. + * That opens up a potential abuse where the player + * can mount a steed, then dismount immediately to + * heal leg damage, because leg damage is always + * healed upon dismount (Wounded_legs context switch). + * By preventing a hero with Wounded_legs from + * mounting a steed, the potential for abuse is + * minimized, if not eliminated altogether. + */ + if (Wounded_legs) { + Your("%s are in no shape for riding.", makeplural(body_part(LEG))); + #ifdef WIZARD + if (force && wizard && yn("Heal your legs?") == 'y') + HWounded_legs = EWounded_legs = 0; + else + #endif + return (FALSE); + } + if (Upolyd && (!humanoid(youmonst.data) || verysmall(youmonst.data) || bigmonst(youmonst.data))) { if (!force) *************** *** 251,257 **** return (FALSE); } if (!force && !Role_if(PM_KNIGHT) && !(--mtmp->mtame)) { ! pline("%s resists!", Monnam(mtmp)); return (FALSE); } if (!force && Underwater && !is_swimmer(ptr)) { --- 272,282 ---- return (FALSE); } if (!force && !Role_if(PM_KNIGHT) && !(--mtmp->mtame)) { ! /* no longer tame */ ! newsym(mtmp->mx, mtmp->my); ! pline("%s resists%s!", Monnam(mtmp), ! mtmp->mleashed ? " and its leash comes off" : ""); ! if (mtmp->mleashed) m_unleash(mtmp, FALSE); return (FALSE); } if (!force && Underwater && !is_swimmer(ptr)) { *************** *** 278,285 **** return (FALSE); } if (!force && (Confusion || Fumbling || Glib || Wounded_legs || ! otmp->cursed || (u.ulevel+mtmp->mtame < rnd(MAXULEV/2+5)))) { You("slip while trying to get on %s.", mon_nam(mtmp)); /* Unfortunately we don't have a version of the monster-naming * function that works well with "a" and "the" but ignores * hallucination. Fortunately, we know the monster must be saddled --- 303,315 ---- return (FALSE); } if (!force && (Confusion || Fumbling || Glib || Wounded_legs || ! otmp->cursed || (u.ulevel+mtmp->mtame < rnd(MAXULEV/2+5)))) { ! if (Levitation) { ! pline("%s slips away from you.", Monnam(mtmp)); ! return FALSE; ! } You("slip while trying to get on %s.", mon_nam(mtmp)); + /* Unfortunately we don't have a version of the monster-naming * function that works well with "a" and "the" but ignores * hallucination. Fortunately, we know the monster must be saddled *************** *** 327,338 **** --- 357,396 ---- void kick_steed() { + char He[4]; if (!u.usteed) return; + /* [ALI] Various effects of kicking sleeping/paralyzed steeds */ + if (u.usteed->msleeping || !u.usteed->mcanmove) { + /* We assume a message has just been output of the form + * "You kick ." + */ + Strcpy(He, mhe(u.usteed)); + *He = highc(*He); + if ((u.usteed->mcanmove || u.usteed->mfrozen) && !rn2(2)) { + if (u.usteed->mcanmove) + u.usteed->msleeping = 0; + else if (u.usteed->mfrozen > 2) + u.usteed->mfrozen -= 2; + else { + u.usteed->mfrozen = 0; + u.usteed->mcanmove = 1; + } + if (u.usteed->msleeping || !u.usteed->mcanmove) + pline("%s stirs.", He); + else + pline("%s rouses %sself!", He, mhim(u.usteed)); + } else + pline("%s does not respond.", He); + return; + } + /* Make the steed less tame and check if it resists */ if (u.usteed->mtame) u.usteed->mtame--; + if (!u.usteed->mtame && u.usteed->mleashed) m_unleash(u.usteed, TRUE); if (!u.usteed->mtame || (u.ulevel+u.usteed->mtame < rnd(MAXULEV/2+5))) { + newsym(u.usteed->mx, u.usteed->my); dismount_steed(DISMOUNT_THROWN); return; } *************** *** 342,347 **** --- 400,444 ---- return; } + /* + * Try to find a dismount point adjacent to the steed's location. + * If all else fails, try enexto(). Use enexto() as a last resort because + * enexto() chooses its point randomly, possibly even outside the + * room's walls, which is not what we want. + * Adapted from mail daemon code. + */ + STATIC_OVL boolean + landing_spot(spot, forceit) + coord *spot; /* landing position (we fill it in) */ + int forceit; + { + int x, y, distance, min_distance = -1; + boolean found = FALSE; + + for (x = u.ux-1; x <= u.ux+1; x++) + for (y = u.uy-1; y <= u.uy+1; y++) { + if (!isok(x, y) || (x == u.ux && y == u.uy)) continue; + + if (ACCESSIBLE(levl[x][y].typ) && + !MON_AT(x,y) && !closed_door(x,y)) { + distance = distu(x,y); + if (min_distance < 0 || distance < min_distance || + (distance == min_distance && rn2(2))) { + spot->x = x; + spot->y = y; + min_distance = distance; + found = TRUE; + } + } + } + + /* If we didn't find a good spot and forceit is on, try enexto(). */ + if (forceit && min_distance < 0 && + !enexto(spot, u.ux, u.uy, youmonst.data)) + return FALSE; + + return found; + } /* Stop riding the current steed */ void *************** *** 354,363 **** const char *verb = "fall"; boolean repair_leg_damage = TRUE; unsigned save_utrap = u.utrap; ! /* Sanity checks */ ! if (!(mtmp = u.usteed)) ! /* Just return silently */ return; /* Check the reason for dismounting */ --- 451,461 ---- const char *verb = "fall"; boolean repair_leg_damage = TRUE; unsigned save_utrap = u.utrap; + boolean have_spot = landing_spot(&cc,0); ! mtmp = u.usteed; /* make a copy of steed pointer */ ! /* Sanity check */ ! if (!mtmp) /* Just return silently */ return; /* Check the reason for dismounting */ *************** *** 367,383 **** verb = "are thrown"; case DISMOUNT_FELL: You("%s off of %s!", verb, mon_nam(mtmp)); losehp(rn1(10,10), "riding accident", KILLED_BY_AN); ! HWounded_legs += rn1(5, 5); ! EWounded_legs |= BOTH_SIDES; repair_leg_damage = FALSE; break; case DISMOUNT_POLY: You("can no longer ride %s.", mon_nam(u.usteed)); break; case DISMOUNT_ENGULFED: /* caller displays message */ break; case DISMOUNT_GENERIC: /* no messages, just make it so */ break; --- 465,485 ---- verb = "are thrown"; case DISMOUNT_FELL: You("%s off of %s!", verb, mon_nam(mtmp)); + if (!have_spot) have_spot = landing_spot(&cc,1); losehp(rn1(10,10), "riding accident", KILLED_BY_AN); ! set_wounded_legs(BOTH_SIDES, (int)HWounded_legs + rn1(5,5)); repair_leg_damage = FALSE; break; case DISMOUNT_POLY: You("can no longer ride %s.", mon_nam(u.usteed)); + if (!have_spot) have_spot = landing_spot(&cc,1); break; case DISMOUNT_ENGULFED: /* caller displays message */ break; + case DISMOUNT_BONES: + /* hero has just died... */ + break; case DISMOUNT_GENERIC: /* no messages, just make it so */ break; *************** *** 388,402 **** otmp->bknown = TRUE; return; } if (!mtmp->mnamelth) { pline("You've been through the dungeon on %s with no name.", ! an(mtmp->data->mname)); if (Hallucination) pline("It felt good to get out of the rain."); } else You("dismount %s.", mon_nam(mtmp)); } ! /* While riding these refer to the steed's legs * so after dismounting they refer to the player's * legs once again. */ --- 490,508 ---- otmp->bknown = TRUE; return; } + if (!have_spot) { + You("can't. There isn't anywhere for you to stand."); + return; + } if (!mtmp->mnamelth) { pline("You've been through the dungeon on %s with no name.", ! an(mtmp->data->mname)); if (Hallucination) pline("It felt good to get out of the rain."); } else You("dismount %s.", mon_nam(mtmp)); } ! /* While riding these refer to the steed's legs * so after dismounting they refer to the player's * legs once again. */ *************** *** 406,415 **** u.usteed = 0; u.ugallop = 0L; ! /* Set player and steed's position. Try moving the player first */ if (!DEADMONSTER(mtmp)) { place_monster(mtmp, u.ux, u.uy); ! if (!u.uswallow && !u.ustuck && enexto(&cc, u.ux, u.uy, youmonst.data)) { struct permonst *mdat = mtmp->data; /* The steed may drop into water/lava */ --- 512,530 ---- u.usteed = 0; u.ugallop = 0L; ! /* Set player and steed's position. Try moving the player first ! unless we're in the midst of creating a bones file. */ ! if (reason == DISMOUNT_BONES) { ! /* move the steed to an adjacent square */ ! if (enexto(&cc, u.ux, u.uy, mtmp->data)) ! rloc_to(mtmp, cc.x, cc.y); ! else /* evidently no room nearby; move steed elsewhere */ ! rloc(mtmp); ! return; ! } if (!DEADMONSTER(mtmp)) { place_monster(mtmp, u.ux, u.uy); ! if (!u.uswallow && !u.ustuck && have_spot) { struct permonst *mdat = mtmp->data; /* The steed may drop into water/lava */ *************** *** 447,461 **** * able to walk onto a square with a hole, and autopickup before * falling into the hole). */ ! /* Keep steed here, move the player to cc; teleds() clears u.utrap */ ! in_steed_dismounting = TRUE; ! teleds(cc.x, cc.y); ! in_steed_dismounting = FALSE; ! ! /* Put your steed in your trap */ ! if (save_utrap) ! (void) mintrap(mtmp); ! /* Couldn't... try placing the steed */ } else if (enexto(&cc, u.ux, u.uy, mtmp->data)) { /* Keep player here, move the steed to cc */ --- 562,580 ---- * able to walk onto a square with a hole, and autopickup before * falling into the hole). */ ! /* [ALI] No need to move the player if the steed died. */ ! if (!DEADMONSTER(mtmp)) { ! /* Keep steed here, move the player to cc; ! * teleds() clears u.utrap ! */ ! in_steed_dismounting = TRUE; ! teleds(cc.x, cc.y); ! in_steed_dismounting = FALSE; ! ! /* Put your steed in your trap */ ! if (save_utrap) ! (void) mintrap(mtmp); ! } /* Couldn't... try placing the steed */ } else if (enexto(&cc, u.ux, u.uy, mtmp->data)) { /* Keep player here, move the steed to cc */ *************** *** 469,475 **** --- 588,596 ---- } /* Return the player to the floor */ + in_steed_dismounting = TRUE; (void) float_down(0L, W_SADDLE); + in_steed_dismounting = FALSE; flags.botl = 1; if (reason != DISMOUNT_ENGULFED) { (void)encumber_msg(); *** nethack-3.3.1/src/teleport.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/teleport.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)teleport.c 3.3 2000/03/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)teleport.c 3.4 2002/03/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 204,210 **** teleds(nux, nuy) register int nux,nuy; { ! if (Punished) unplacebc(); u.utrap = 0; u.ustuck = 0; u.ux0 = u.ux; --- 204,222 ---- teleds(nux, nuy) register int nux,nuy; { ! boolean dont_teleport_ball = FALSE; ! ! if (Punished) { ! /* If they're teleporting to a position where the ball doesn't need ! * to be moved, don't place the ball. Especially useful when this ! * function is being called for crawling out of water instead of ! * real teleportation. ! */ ! if (!carried(uball) && distmin(nux, nuy, uball->ox, uball->oy) <= 2) ! dont_teleport_ball = TRUE; ! else ! unplacebc(); ! } u.utrap = 0; u.ustuck = 0; u.ux0 = u.ux; *************** *** 228,234 **** u.uswldtim = u.uswallow = 0; docrt(); } ! if (Punished) placebc(); initrack(); /* teleports mess up tracking monsters without this */ update_player_regions(); #ifdef STEED --- 240,259 ---- u.uswldtim = u.uswallow = 0; docrt(); } ! if (Punished) { ! if (dont_teleport_ball) { ! int bc_control; ! xchar ballx, bally, chainx, chainy; ! boolean cause_delay; ! ! /* this should only drag the chain (and never give a near- ! capacity message) since we already checked ball distance */ ! (void) drag_ball(u.ux, u.uy, &bc_control, &ballx, &bally, ! &chainx, &chainy, &cause_delay); ! move_bc(0, bc_control, ballx, bally, chainx, chainy); ! } else ! placebc(); ! } initrack(); /* teleports mess up tracking monsters without this */ update_player_regions(); #ifdef STEED *************** *** 248,253 **** --- 273,279 ---- see_monsters(); vision_full_recalc = 1; nomul(0); + vision_recalc(0); /* vision before effects */ spoteffects(TRUE); invocation_message(); } *************** *** 306,312 **** } else { Your("leash goes slack."); release_it: ! m_unleash(mtmp); return TRUE; } } --- 332,338 ---- } else { Your("leash goes slack."); release_it: ! m_unleash(mtmp, FALSE); return TRUE; } } *************** *** 485,490 **** --- 511,517 ---- register int newlev; d_level newlevel; const char *escape_by_flying = 0; /* when surviving dest of -N */ + char buf[BUFSZ]; if ((u.uhave.amulet || In_endgame(&u.uz) || In_sokoban(&u.uz)) #ifdef WIZARD *************** *** 499,505 **** || wizard #endif ) { ! char buf[BUFSZ], qbuf[BUFSZ]; int trycnt = 0; Strcpy(qbuf, "To what level do you want to teleport?"); --- 526,532 ---- || wizard #endif ) { ! char qbuf[BUFSZ]; int trycnt = 0; Strcpy(qbuf, "To what level do you want to teleport?"); *************** *** 520,526 **** if (trycnt >= 10) goto random_levtport; if (ynq("Go to Nowhere. Are you sure?") != 'y') return; ! You("scream in agony as your body begins to warp..."); display_nhwindow(WIN_MESSAGE, FALSE); You("cease to exist."); killer_format = NO_KILLER_PREFIX; --- 547,554 ---- if (trycnt >= 10) goto random_levtport; if (ynq("Go to Nowhere. Are you sure?") != 'y') return; ! You("%s in agony as your body begins to warp...", ! is_silent(youmonst.data) ? "writhe" : "scream"); display_nhwindow(WIN_MESSAGE, FALSE); You("cease to exist."); killer_format = NO_KILLER_PREFIX; *************** *** 598,606 **** } else { pline("Unfortunately, you don't know how to fly."); You("plummet a few thousand feet to your death."); killer_format = NO_KILLER_PREFIX; - killer = - self_pronoun("teleported out of the dungeon and fell to %s death","his"); } } --- 626,636 ---- } else { pline("Unfortunately, you don't know how to fly."); You("plummet a few thousand feet to your death."); + Sprintf(buf, + "teleported out of the dungeon and fell to %s death", + uhis()); + killer = buf; killer_format = NO_KILLER_PREFIX; } } *************** *** 791,796 **** --- 821,827 ---- register int x, y; { register int oldx = mtmp->mx, oldy = mtmp->my; + boolean resident_shk = mtmp->isshk && inhishop(mtmp); if (x == mtmp->mx && y == mtmp->my) /* that was easy */ return; *************** *** 820,825 **** --- 851,861 ---- newsym(x, y); /* update new location */ set_apparxy(mtmp); /* orient monster */ + + /* shopkeepers will only teleport if you zap them with a wand of + teleportation or if they've been transformed into a jumpy monster; + the latter only happens if you've attacked them with polymorph */ + if (resident_shk && !inhishop(mtmp)) make_angry_shk(mtmp, oldx, oldy); } /* place a monster at a random location, typically due to teleport */ *************** *** 828,834 **** struct monst *mtmp; /* mx==0 implies migrating monster arrival */ { register int x, y, trycount; - xchar omx = mtmp->mx, omy = mtmp->my; #ifdef STEED if (mtmp == u.usteed) { --- 864,869 ---- *************** *** 837,843 **** } #endif ! if (mtmp->iswiz && omx) { /* Wizard, not just arriving */ if (!In_W_tower(u.ux, u.uy, &u.uz)) x = xupstair, y = yupstair; else if (!xdnladder) /* bottom level of tower */ --- 872,878 ---- } #endif ! if (mtmp->iswiz && mtmp->mx) { /* Wizard, not just arriving */ if (!In_W_tower(u.ux, u.uy, &u.uz)) x = xupstair, y = yupstair; else if (!xdnladder) /* bottom level of tower */ *************** *** 872,881 **** found_xy: rloc_to(mtmp, x, y); - /* shopkeepers will only teleport if you zap them with a wand of - teleportation or if they've been transformed into a jumpy monster; - the latter only happens if you've attacked them with polymorph */ - if (mtmp->isshk && !inhishop(mtmp)) make_angry_shk(mtmp, omx, omy); } STATIC_OVL void --- 907,912 ---- *************** *** 1118,1131 **** if (give_feedback) pline("%s resists your magic!", Monnam(mtmp)); return FALSE; ! } else { ! if (is_rider(mtmp->data) && rn2(13) && ! enexto(&cc, u.ux, u.uy, mtmp->data)) ! rloc_to(mtmp, cc.x, cc.y); ! else ! rloc(mtmp); ! return TRUE; ! } } /*teleport.c*/ --- 1149,1165 ---- if (give_feedback) pline("%s resists your magic!", Monnam(mtmp)); return FALSE; ! } else if (level.flags.noteleport && u.uswallow && mtmp == u.ustuck) { ! if (give_feedback) ! You("are no longer inside %s!", mon_nam(mtmp)); ! unstuck(mtmp); ! rloc(mtmp); ! } else if (is_rider(mtmp->data) && rn2(13) && ! enexto(&cc, u.ux, u.uy, mtmp->data)) ! rloc_to(mtmp, cc.x, cc.y); ! else ! rloc(mtmp); ! return TRUE; } /*teleport.c*/ *** nethack-3.3.1/src/timeout.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/timeout.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)timeout.c 3.3 2000/05/26 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)timeout.c 3.4 2000/09/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,17 **** --- 12,18 ---- STATIC_DCL void NDECL(slip_or_trip); STATIC_DCL void FDECL(see_lamp_flicker, (struct obj *, const char *)); STATIC_DCL void FDECL(lantern_message, (struct obj *)); + STATIC_DCL void FDECL(cleanup_burn, (genericptr_t,long)); #ifdef OVLB *************** *** 29,39 **** { register long i = (Stoned & TIMEOUT); ! if(i > 0 && i <= SIZE(stoned_texts)) pline(stoned_texts[SIZE(stoned_texts) - i]); ! if(i == 5) HFast = 0L; ! if(i == 3) nomul(-3); exercise(A_DEX, FALSE); } --- 30,40 ---- { register long i = (Stoned & TIMEOUT); ! if (i > 0L && i <= SIZE(stoned_texts)) pline(stoned_texts[SIZE(stoned_texts) - i]); ! if (i == 5L) HFast = 0L; ! if (i == 3L) nomul(-3); exercise(A_DEX, FALSE); } *************** *** 120,140 **** { register long i = (Slimed & TIMEOUT) / 2L; ! if (((Slimed & TIMEOUT) % 2L) && i >= 0 && i < SIZE(slime_texts)) { ! const char *str = slime_texts[SIZE(slime_texts)-i-1]; if (index(str, '%')) { ! if (i == 4) { ! if (!Blind) pline(str, hcolor(green)); } else pline(str, an(Hallucination ? rndmonnam() : "green slime")); } else pline(str); } ! if(i == 4) ! HFast = 0; exercise(A_DEX, FALSE); } --- 121,144 ---- { register long i = (Slimed & TIMEOUT) / 2L; ! if (((Slimed & TIMEOUT) % 2L) && i >= 0L && i < SIZE(slime_texts)) { ! const char *str = slime_texts[SIZE(slime_texts) - i - 1L]; if (index(str, '%')) { ! if (i == 4L) { /* "you are turning green" */ ! if (!Blind) /* [what if you're already green?] */ pline(str, hcolor(green)); } else pline(str, an(Hallucination ? rndmonnam() : "green slime")); } else pline(str); } ! if (i == 3L) { /* limbs becoming oozy */ ! HFast = 0L; /* lose intrinsic speed */ ! stop_occupation(); ! if (multi > 0) nomul(0); ! } exercise(A_DEX, FALSE); } *************** *** 144,149 **** --- 148,154 ---- if (Slimed) { pline_The("slime that covers you is burned away!"); Slimed = 0L; + flags.botl = 1; } return; } *************** *** 489,495 **** if (cansee_hatchspot) { Sprintf(monnambuf, "%s%s", siblings ? "some " : "", ! siblings ? makeplural(m_monnam(mon)) : a_monnam(mon)); /* we don't learn the egg type here because learning an egg type requires either seeing the egg hatch or being familiar with the egg already, --- 494,501 ---- if (cansee_hatchspot) { Sprintf(monnambuf, "%s%s", siblings ? "some " : "", ! siblings ? ! makeplural(m_monnam(mon)) : an(m_monnam(mon))); /* we don't learn the egg type here because learning an egg type requires either seeing the egg hatch or being familiar with the egg already, *************** *** 610,617 **** struct obj *otmp = vobj_at(u.ux, u.uy); const char *what, *pronoun; char buf[BUFSZ]; ! if (otmp) { /* trip over something in particular */ /* If there is only one item, it will have just been named during the move, so refer to by via pronoun; otherwise, --- 616,627 ---- struct obj *otmp = vobj_at(u.ux, u.uy); const char *what, *pronoun; char buf[BUFSZ]; + boolean on_foot = TRUE; + #ifdef STEED + if (u.usteed) on_foot = FALSE; + #endif ! if (otmp && on_foot) { /* trip over something in particular */ /* If there is only one item, it will have just been named during the move, so refer to by via pronoun; otherwise, *************** *** 634,659 **** You("trip over %s.", what); } } else if (rn2(3) && is_ice(u.ux, u.uy)) { ! You("%s on the ice.", rn2(2) ? "slip" : "slide"); ! } else switch (rn2(4)) { ! case 1: ! You("trip over your own %s.", Hallucination ? ! "elbow" : makeplural(body_part(FOOT))); ! break; ! case 2: ! You("slip %s.", Hallucination ? ! "on a banana peel" : "and nearly fall"); ! break; ! case 3: ! You("flounder."); ! break; ! default: ! You("stumble."); ! break; ! } #ifdef STEED ! if (u.usteed) dismount_steed(DISMOUNT_FELL); #endif } /* Print a lamp flicker message with tailer. */ --- 644,695 ---- You("trip over %s.", what); } } else if (rn2(3) && is_ice(u.ux, u.uy)) { ! pline("%s %s%s on the ice.", ! #ifdef STEED ! u.usteed ? upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)) : ! #endif ! "You", rn2(2) ? "slip" : "slide", on_foot ? "" : "s"); ! } else { ! if (on_foot) { ! switch (rn2(4)) { ! case 1: ! You("trip over your own %s.", Hallucination ? ! "elbow" : makeplural(body_part(FOOT))); ! break; ! case 2: ! You("slip %s.", Hallucination ? ! "on a banana peel" : "and nearly fall"); ! break; ! case 3: ! You("flounder."); ! break; ! default: ! You("stumble."); ! break; ! } ! } #ifdef STEED ! else { ! switch (rn2(4)) { ! case 1: ! Your("%s slip out of the stirrups.", makeplural(body_part(FOOT))); ! break; ! case 2: ! You("let go of the reins."); ! break; ! case 3: ! You("bang into the saddle-horn."); ! break; ! default: ! You("slide to one side of the saddle."); ! break; ! } ! dismount_steed(DISMOUNT_FELL); ! } #endif + } } /* Print a lamp flicker message with tailer. */ *************** *** 1007,1013 **** long turns = 0; boolean do_timer = TRUE; ! if (obj->age == 0 && obj->otyp != MAGIC_LAMP) return; switch (obj->otyp) { case MAGIC_LAMP: --- 1043,1050 ---- long turns = 0; boolean do_timer = TRUE; ! if (obj->age == 0 && obj->otyp != MAGIC_LAMP && !artifact_light(obj)) ! return; switch (obj->otyp) { case MAGIC_LAMP: *************** *** 1049,1056 **** break; default: ! impossible("begin burn: unexpected %s", xname(obj)); ! turns = obj->age; break; } --- 1086,1100 ---- break; default: ! /* [ALI] Support artifact light sources */ ! if (artifact_light(obj)) { ! obj->lamplit = 1; ! do_timer = FALSE; ! radius = 2; ! } else { ! impossible("begin burn: unexpected %s", xname(obj)); ! turns = obj->age; ! } break; } *************** *** 1059,1069 **** BURN_OBJECT, (genericptr_t)obj)) { obj->lamplit = 1; obj->age -= turns; ! if (obj->where == OBJ_INVENT && !already_lit) update_inventory(); } else { obj->lamplit = 0; } } if (obj->lamplit && !already_lit) { --- 1103,1116 ---- BURN_OBJECT, (genericptr_t)obj)) { obj->lamplit = 1; obj->age -= turns; ! if (carried(obj) && !already_lit) update_inventory(); } else { obj->lamplit = 0; } + } else { + if (carried(obj) && !already_lit) + update_inventory(); } if (obj->lamplit && !already_lit) { *************** *** 1085,1114 **** struct obj *obj; boolean timer_attached; { - long expire_time; - if (!obj->lamplit) { impossible("end_burn: obj %s not lit", xname(obj)); return; } ! del_light_source(LS_OBJECT, (genericptr_t) obj); ! if (obj->otyp == MAGIC_LAMP) timer_attached = FALSE; ! if (timer_attached) { ! expire_time = stop_timer(BURN_OBJECT, (genericptr_t) obj); ! if (expire_time) ! /* restore unused time */ ! obj->age += expire_time - monstermoves; ! else ! impossible("end_burn: obj %s not timed!", xname(obj)); ! } ! obj->lamplit = 0; ! if (obj->where == OBJ_INVENT) ! update_inventory(); } void do_storms() { --- 1132,1186 ---- struct obj *obj; boolean timer_attached; { if (!obj->lamplit) { impossible("end_burn: obj %s not lit", xname(obj)); return; } ! if (obj->otyp == MAGIC_LAMP || artifact_light(obj)) ! timer_attached = FALSE; ! if (!timer_attached) { ! /* [DS] Cleanup explicitly, since timer cleanup won't happen */ ! del_light_source(LS_OBJECT, (genericptr_t)obj); ! obj->lamplit = 0; ! if (obj->where == OBJ_INVENT) ! update_inventory(); ! } else if (!stop_timer(BURN_OBJECT, (genericptr_t) obj)) ! impossible("end_burn: obj %s not timed!", xname(obj)); ! } ! ! #endif /* OVL1 */ ! #ifdef OVL0 ! ! /* ! * Cleanup a burning object if timer stopped. ! */ ! static void ! cleanup_burn(arg, expire_time) ! genericptr_t arg; ! long expire_time; ! { ! struct obj *obj = (struct obj *)arg; ! if (!obj->lamplit) { ! impossible("cleanup_burn: obj %s not lit", xname(obj)); ! return; ! } ! ! del_light_source(LS_OBJECT, arg); ! ! /* restore unused time */ ! obj->age += expire_time - monstermoves; ! ! obj->lamplit = 0; ! if (obj->where == OBJ_INVENT) ! update_inventory(); } + #endif /* OVL0 */ + #ifdef OVL1 + void do_storms() { *************** *** 1205,1221 **** * Stop all timers attached to obj. */ - - typedef struct fe { - struct fe *next; /* next item in chain */ - long timeout; /* when we time out */ - unsigned long tid; /* timer ID */ - short kind; /* kind of use */ - short func_index; /* what to call when we time out */ - genericptr_t arg; /* pointer to timeout argument */ - Bitfield (needs_fixup,1); /* does arg need to be patched? */ - } timer_element; - #ifdef WIZARD STATIC_DCL const char *FDECL(kind_name, (SHORT_P)); STATIC_DCL void FDECL(print_queue, (winid, timer_element *)); --- 1277,1282 ---- *************** *** 1223,1228 **** --- 1284,1290 ---- STATIC_DCL void FDECL(insert_timer, (timer_element *)); STATIC_DCL timer_element *FDECL(remove_timer, (timer_element **, SHORT_P, genericptr_t)); + STATIC_DCL void FDECL(write_timer, (int, timer_element *)); STATIC_DCL boolean FDECL(mon_is_local, (struct monst *)); STATIC_DCL boolean FDECL(timer_is_local, (timer_element *)); STATIC_DCL int FDECL(maybe_write_timer, (int, int, BOOLEAN_P)); *************** *** 1235,1257 **** #define VERBOSE_TIMER typedef struct { ! timeout_proc f; #ifdef VERBOSE_TIMER const char *name; ! # define TTAB(a, b) {a,b} #else ! # define TTAB(a, b) {a} #endif } ttable; /* table of timeout functions */ static ttable timeout_funcs[NUM_TIME_FUNCS] = { ! TTAB(rot_organic, "rot_organic"), ! TTAB(rot_corpse, "rot_corpse"), ! TTAB(revive_mon, "revive_mon"), ! TTAB(burn_object, "burn_object"), ! TTAB(hatch_egg, "hatch_egg"), ! TTAB(fig_transform, "fig_transform") }; #undef TTAB --- 1297,1319 ---- #define VERBOSE_TIMER typedef struct { ! timeout_proc f, cleanup; #ifdef VERBOSE_TIMER const char *name; ! # define TTAB(a, b, c) {a,b,c} #else ! # define TTAB(a, b, c) {a,b} #endif } ttable; /* table of timeout functions */ static ttable timeout_funcs[NUM_TIME_FUNCS] = { ! TTAB(rot_organic, (timeout_proc)0, "rot_organic"), ! TTAB(rot_corpse, (timeout_proc)0, "rot_corpse"), ! TTAB(revive_mon, (timeout_proc)0, "revive_mon"), ! TTAB(burn_object, cleanup_burn, "burn_object"), ! TTAB(hatch_egg, (timeout_proc)0, "hatch_egg"), ! TTAB(fig_transform, (timeout_proc)0, "fig_transform") }; #undef TTAB *************** *** 1418,1423 **** --- 1480,1487 ---- timeout = doomed->timeout; if (doomed->kind == TIMER_OBJECT) ((struct obj *)arg)->timed--; + if (timeout_funcs[doomed->func_index].cleanup) + (*timeout_funcs[doomed->func_index].cleanup)(arg, timeout); free((genericptr_t) doomed); return timeout; } *************** *** 1483,1488 **** --- 1547,1555 ---- prev->next = curr->next; else timer_base = curr->next; + if (timeout_funcs[curr->func_index].cleanup) + (*timeout_funcs[curr->func_index].cleanup)(curr->arg, + curr->timeout); free((genericptr_t) curr); } else { prev = curr; *** nethack-3.3.1/src/topten.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/topten.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)topten.c 3.3 2000/01/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)topten.c 3.4 2000/01/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 31,37 **** #define newttentry() (struct toptenentry *) alloc(sizeof(struct toptenentry)) #define dealloc_ttentry(ttent) free((genericptr_t) (ttent)) #define NAMSZ 10 ! #define DTHSZ 60 #define ROLESZ 3 #define PERSMAX 3 /* entries per name/uid per char. allowed */ #define POINTSMIN 1 /* must be > 0 */ --- 31,37 ---- #define newttentry() (struct toptenentry *) alloc(sizeof(struct toptenentry)) #define dealloc_ttentry(ttent) free((genericptr_t) (ttent)) #define NAMSZ 10 ! #define DTHSZ 100 #define ROLESZ 3 #define PERSMAX 3 /* entries per name/uid per char. allowed */ #define POINTSMIN 1 /* must be > 0 */ *************** *** 79,85 **** NEARDATA const char *killed_by_prefix[] = { "killed by ", "choked on ", "poisoned by ", "", "drowned in ", "", "dissolved in ", "crushed to death by ", "petrified by ", ! "turned to slime by ", "", "", "", "", "", "" }; static winid toptenwin = WIN_ERR; --- 79,85 ---- NEARDATA const char *killed_by_prefix[] = { "killed by ", "choked on ", "poisoned by ", "", "drowned in ", "", "dissolved in ", "crushed to death by ", "petrified by ", ! "turned to slime by ", "killed by ", "", "", "", "", "" }; static winid toptenwin = WIN_ERR; *************** *** 264,269 **** --- 264,276 ---- return; #endif + /* If we are in the midst of a panic, cut out topten entirely. + * topten uses alloc() several times, which will lead to + * problems if the panic was the result of an alloc() failure. + */ + if (program_state.panicking) + return; + if (flags.toptenwin) { toptenwin = create_nhwindow(NHW_TEXT); } *************** *** 707,713 **** #endif for (i = 0; i < playerct; i++) { ! if (strcmp(players[i], "all") == 0 || strncmp(t1->name, players[i], NAMSZ) == 0 || (players[i][0] == '-' && players[i][1] == t1->plrole[0] && --- 714,729 ---- #endif for (i = 0; i < playerct; i++) { ! if (players[i][0] == '-' && index("pr", players[i][1]) && ! players[i][2] == 0 && i + 1 < playerct) { ! char *arg = (char *)players[i + 1]; ! if ((players[i][1] == 'p' && ! str2role(arg) == str2role(t1->plrole)) || ! (players[i][1] == 'r' && ! str2race(arg) == str2race(t1->plrace))) ! return 1; ! i++; ! } else if (strcmp(players[i], "all") == 0 || strncmp(t1->name, players[i], NAMSZ) == 0 || (players[i][0] == '-' && players[i][1] == t1->plrole[0] && *************** *** 841,858 **** if (playerct > 1) Strcat(pbuf, "any of "); for (i = 0; i < playerct; i++) { Strcat(pbuf, players[i]); ! if (i < playerct-1) Strcat(pbuf, ":"); } } raw_print(pbuf); ! raw_printf("Call is: %s -s [-v] [-role] [maxrank] [playernames]", hname); } free_ttlist(tt_head); #ifdef AMIGA ! display_nhwindow(amii_rawprwin, 1); ! destroy_nhwindow(amii_rawprwin); ! amii_rawprwin = WIN_ERR; #endif } --- 857,884 ---- if (playerct > 1) Strcat(pbuf, "any of "); for (i = 0; i < playerct; i++) { Strcat(pbuf, players[i]); ! if (i < playerct-1) { ! if (players[i][0] == '-' && ! index("pr", players[i][1]) && players[i][2] == 0) ! Strcat(pbuf, " "); ! else Strcat(pbuf, ":"); ! } } } raw_print(pbuf); ! raw_printf("Usage: %s -s [-v] [maxrank] [playernames]", ! hname); + raw_printf("Player types are: [-p role] [-r race]"); } free_ttlist(tt_head); #ifdef AMIGA ! { ! extern winid amii_rawprwin; ! display_nhwindow(amii_rawprwin, 1); ! destroy_nhwindow(amii_rawprwin); ! amii_rawprwin = WIN_ERR; ! } #endif } *** nethack-3.3.1/src/track.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/track.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)track.c 3.3 87/08/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* track.c - version 1.0.2 */ --- 1,4 ---- ! /* SCCS Id: @(#)track.c 3.4 87/08/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* track.c - version 1.0.2 */ *** nethack-3.3.1/src/trap.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/trap.c Thu Mar 21 07:37:37 2002 *************** *** 1,9 **** ! /* SCCS Id: @(#)trap.c 3.3 2000/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL void FDECL(dofiretrap, (struct obj *)); STATIC_DCL void NDECL(domagictrap); STATIC_DCL boolean FDECL(emergency_disrobe,(boolean *)); --- 1,11 ---- ! /* SCCS Id: @(#)trap.c 3.4 2001/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" + extern const char *destroy_strings[]; + STATIC_DCL void FDECL(dofiretrap, (struct obj *)); STATIC_DCL void NDECL(domagictrap); STATIC_DCL boolean FDECL(emergency_disrobe,(boolean *)); *************** *** 12,18 **** STATIC_DCL void FDECL(move_into_trap, (struct trap *)); STATIC_DCL int FDECL(try_disarm, (struct trap *,BOOLEAN_P)); STATIC_DCL void FDECL(reward_untrap, (struct trap *, struct monst *)); ! STATIC_DCL int FDECL(disarm_beartrap, (struct trap *)); STATIC_DCL int FDECL(disarm_landmine, (struct trap *)); STATIC_DCL int FDECL(disarm_squeaky_board, (struct trap *)); STATIC_DCL int FDECL(disarm_shooting_trap, (struct trap *, int)); --- 14,20 ---- STATIC_DCL void FDECL(move_into_trap, (struct trap *)); STATIC_DCL int FDECL(try_disarm, (struct trap *,BOOLEAN_P)); STATIC_DCL void FDECL(reward_untrap, (struct trap *, struct monst *)); ! STATIC_DCL int FDECL(disarm_holdingtrap, (struct trap *)); STATIC_DCL int FDECL(disarm_landmine, (struct trap *)); STATIC_DCL int FDECL(disarm_squeaky_board, (struct trap *)); STATIC_DCL int FDECL(disarm_shooting_trap, (struct trap *, int)); *************** *** 22,28 **** STATIC_DCL int FDECL(mkroll_launch, (struct trap *,XCHAR_P,XCHAR_P,SHORT_P,long)); STATIC_DCL boolean FDECL(isclearpath,(coord *, int, SCHAR_P, SCHAR_P)); ! STATIC_DCL void FDECL(blow_up_landmine, (struct trap *)); #ifndef OVLB STATIC_VAR const char *a_your[2]; --- 24,32 ---- STATIC_DCL int FDECL(mkroll_launch, (struct trap *,XCHAR_P,XCHAR_P,SHORT_P,long)); STATIC_DCL boolean FDECL(isclearpath,(coord *, int, SCHAR_P, SCHAR_P)); ! #ifdef STEED ! STATIC_OVL int FDECL(steedintrap, (struct trap *, struct obj *)); ! #endif #ifndef OVLB STATIC_VAR const char *a_your[2]; *************** *** 67,73 **** case 1: item = (victim == &youmonst) ? uarmc : which_armor(victim, W_ARMC); if (item) { ! (void) burn_dmg(item, "cloak"); return TRUE; } item = (victim == &youmonst) ? uarm : which_armor(victim, W_ARM); --- 71,77 ---- case 1: item = (victim == &youmonst) ? uarmc : which_armor(victim, W_ARMC); if (item) { ! (void) burn_dmg(item, cloak_simple_name(item)); return TRUE; } item = (victim == &youmonst) ? uarm : which_armor(victim, W_ARM); *************** *** 116,122 **** static NEARDATA const char *action[] = { "smoulder", "rust", "rot", "corrode" }; static NEARDATA const char *msg[] = { "burnt", "rusted", "rotten", "corroded" }; boolean vulnerable = FALSE; - boolean plural; boolean grprot = FALSE; boolean is_primary = TRUE; boolean vismon = (victim != &youmonst) && canseemon(victim); --- 120,125 ---- *************** *** 142,217 **** if (!print && (!vulnerable || otmp->oerodeproof || erosion == MAX_ERODE)) return FALSE; - plural = (is_gloves(otmp) || is_boots(otmp)) && - !strstri(ostr, "pair of "); /* "pair of *s" is singular */ - if (!vulnerable) { if (flags.verbose) { if (victim == &youmonst) ! Your("%s %s not affected.", ostr, plural ? "are" : "is"); else if (vismon) pline("%s's %s %s not affected.", Monnam(victim), ostr, ! plural ? "are" : "is"); } } else if (erosion < MAX_ERODE) { if (grprot && otmp->greased) { ! grease_protect(otmp,ostr,plural,victim); } else if (otmp->oerodeproof || (otmp->blessed && !rnl(4))) { if (flags.verbose) { if (victim == &youmonst) pline("Somehow, your %s %s not affected.", ! ostr, plural ? "are" : "is"); else if (vismon) pline("Somehow, %s's %s %s not affected.", ! mon_nam(victim), ostr, plural ? "are" : "is"); } } else { if (victim == &youmonst) ! Your("%s %s%s%s!", ostr, action[type], ! plural ? "" : "s", ! erosion+1 == MAX_ERODE ? " completely" : ! erosion ? " further" : ""); else if (vismon) ! pline("%s's %s %s%s%s!", Monnam(victim), ostr, action[type], ! plural ? "" : "s", erosion+1 == MAX_ERODE ? " completely" : ! erosion ? " further" : ""); if (is_primary) otmp->oeroded++; else otmp->oeroded2++; } } else { if (flags.verbose) { if (victim == &youmonst) ! Your("%s %s%s completely %s.", ostr, ! Blind ? "feel" : "look", ! plural ? "" : "s", msg[type]); else if (vismon) ! pline("%s's %s look%s completely %s.", ! Monnam(victim), ostr, ! plural ? "" : "s", msg[type]); } } return(TRUE); } void ! grease_protect(otmp,ostr,plu,victim) register struct obj *otmp; register const char *ostr; - register boolean plu; struct monst *victim; { static const char txt[] = "protected by the layer of grease!"; ! boolean vismon = (victim != &youmonst) && canseemon(victim); if (ostr) { if (victim == &youmonst) ! Your("%s %s %s",ostr,plu ? "are" : "is", txt); else if (vismon) pline("%s's %s %s %s", Monnam(victim), ! ostr, plu ? "are" : "is", txt); } else { if (victim == &youmonst) Your("%s %s",aobjnam(otmp,"are"), txt); --- 145,217 ---- if (!print && (!vulnerable || otmp->oerodeproof || erosion == MAX_ERODE)) return FALSE; if (!vulnerable) { if (flags.verbose) { if (victim == &youmonst) ! Your("%s %s not affected.", ostr, vtense(ostr, "are")); else if (vismon) pline("%s's %s %s not affected.", Monnam(victim), ostr, ! vtense(ostr, "are")); } } else if (erosion < MAX_ERODE) { if (grprot && otmp->greased) { ! grease_protect(otmp,ostr,victim); } else if (otmp->oerodeproof || (otmp->blessed && !rnl(4))) { if (flags.verbose) { if (victim == &youmonst) pline("Somehow, your %s %s not affected.", ! ostr, vtense(ostr, "are")); else if (vismon) pline("Somehow, %s's %s %s not affected.", ! mon_nam(victim), ostr, vtense(ostr, "are")); } } else { if (victim == &youmonst) ! Your("%s %s%s!", ostr, ! vtense(ostr, action[type]), ! erosion+1 == MAX_ERODE ? " completely" : ! erosion ? " further" : ""); else if (vismon) ! pline("%s's %s %s%s!", Monnam(victim), ostr, ! vtense(ostr, action[type]), erosion+1 == MAX_ERODE ? " completely" : ! erosion ? " further" : ""); if (is_primary) otmp->oeroded++; else otmp->oeroded2++; + update_inventory(); } } else { if (flags.verbose) { if (victim == &youmonst) ! Your("%s %s completely %s.", ostr, ! vtense(ostr, Blind ? "feel" : "look"), ! msg[type]); else if (vismon) ! pline("%s's %s %s completely %s.", ! Monnam(victim), ostr, ! vtense(ostr, "look"), msg[type]); } } return(TRUE); } void ! grease_protect(otmp,ostr,victim) register struct obj *otmp; register const char *ostr; struct monst *victim; { static const char txt[] = "protected by the layer of grease!"; ! boolean vismon = victim && (victim != &youmonst) && canseemon(victim); if (ostr) { if (victim == &youmonst) ! Your("%s %s %s", ostr, vtense(ostr, "are"), txt); else if (vismon) pline("%s's %s %s %s", Monnam(victim), ! ostr, vtense(ostr, "are"), txt); } else { if (victim == &youmonst) Your("%s %s",aobjnam(otmp,"are"), txt); *************** *** 219,227 **** pline("%s's %s %s", Monnam(victim), aobjnam(otmp,"are"), txt); } if (!rn2(2)) { - pline_The("grease dissolves."); otmp->greased = 0; ! update_inventory(); } } --- 219,229 ---- pline("%s's %s %s", Monnam(victim), aobjnam(otmp,"are"), txt); } if (!rn2(2)) { otmp->greased = 0; ! if (carried(otmp)) { ! pline_The("grease dissolves."); ! update_inventory(); ! } } } *************** *** 263,270 **** otmp = mtmp->minvent; otmp->owornmask = 0; obj_extract_self(otmp); ! add_to_container(statue, otmp); } mongone(mtmp); break; } --- 265,273 ---- otmp = mtmp->minvent; otmp->owornmask = 0; obj_extract_self(otmp); ! (void) add_to_container(statue, otmp); } + statue->owt = weight(statue); mongone(mtmp); break; } *************** *** 490,501 **** } void ! dotrap(trap) register struct trap *trap; { register int ttype = trap->ttyp; register struct obj *otmp; boolean already_seen = trap->tseen; nomul(0); --- 493,506 ---- } void ! dotrap(trap, trflags) register struct trap *trap; + unsigned trflags; { register int ttype = trap->ttyp; register struct obj *otmp; boolean already_seen = trap->tseen; + boolean webmsgok = (!(trflags & NOWEBMSG)); nomul(0); *************** *** 540,545 **** --- 545,555 ---- otmp = mksobj(ARROW, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); + otmp->opoisoned = 0; + #ifdef STEED + if (u.usteed && !rn2(2) && steedintrap(trap, otmp)) /* nothing */; + else + #endif if (thitu(8, dmgval(otmp, &youmonst), otmp, "arrow")) { obfree(otmp, (struct obj *)0); } else { *************** *** 556,561 **** --- 566,575 ---- otmp->quan = 1L; otmp->owt = weight(otmp); if (!rn2(6)) otmp->opoisoned = 1; + #ifdef STEED + if (u.usteed && !rn2(2) && steedintrap(trap, otmp)) /* nothing */; + else + #endif if (thitu(7, dmgval(otmp, &youmonst), otmp, "little dart")) { if (otmp->opoisoned) poisoned("dart",A_CON,"poison dart",10); *************** *** 572,578 **** int dmg = d(2,6); /* should be std ROCK dmg? */ seetrap(trap); ! otmp = mksobj_at(ROCK, u.ux, u.uy, TRUE); otmp->quan = 1L; otmp->owt = weight(otmp); --- 586,592 ---- int dmg = d(2,6); /* should be std ROCK dmg? */ seetrap(trap); ! otmp = mksobj_at(ROCK, u.ux, u.uy, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); *************** *** 623,629 **** A_Your[trap->madeby_u]); break; } ! if(youmonst.data->msize <= MZ_SMALL) { pline("%s bear trap closes harmlessly over you.", A_Your[trap->madeby_u]); break; --- 637,647 ---- A_Your[trap->madeby_u]); break; } ! if( ! #ifdef STEED ! !u.usteed && ! #endif ! youmonst.data->msize <= MZ_SMALL) { pline("%s bear trap closes harmlessly over you.", A_Your[trap->madeby_u]); break; *************** *** 634,640 **** if (u.usteed) { pline("%s bear trap closes on %s %s!", A_Your[trap->madeby_u], s_suffix(mon_nam(u.usteed)), ! body_part(FOOT)); } else #endif { --- 652,658 ---- if (u.usteed) { pline("%s bear trap closes on %s %s!", A_Your[trap->madeby_u], s_suffix(mon_nam(u.usteed)), ! mbodypart(u.usteed, FOOT)); } else #endif { *************** *** 648,654 **** case SLP_GAS_TRAP: seetrap(trap); ! if(Sleep_resistance) { You("are enveloped in a cloud of gas!"); break; } --- 666,672 ---- case SLP_GAS_TRAP: seetrap(trap); ! if(Sleep_resistance || breathless(youmonst.data)) { You("are enveloped in a cloud of gas!"); break; } *************** *** 656,661 **** --- 674,682 ---- flags.soundok = 0; fall_asleep(-rnd(25), TRUE); afternmv = Hear_again; + #ifdef STEED + (void) steedintrap(trap, (struct obj *)0); + #endif break; case RUST_TRAP: *************** *** 688,694 **** if (rust_dmg(uarms, "shield", 1, TRUE, &youmonst)) break; if (u.twoweap || (uwep && bimanual(uwep))) ! erode_weapon(u.twoweap ? uswapwep : uwep, FALSE); glovecheck: (void) rust_dmg(uarmg, "gauntlets", 1, TRUE, &youmonst); /* Not "metal gauntlets" since it gets called * even if it's leather for the message --- 709,715 ---- if (rust_dmg(uarms, "shield", 1, TRUE, &youmonst)) break; if (u.twoweap || (uwep && bimanual(uwep))) ! erode_obj(u.twoweap ? uswapwep : uwep, FALSE, TRUE); glovecheck: (void) rust_dmg(uarmg, "gauntlets", 1, TRUE, &youmonst); /* Not "metal gauntlets" since it gets called * even if it's leather for the message *************** *** 697,710 **** case 2: pline("%s your right %s!", A_gush_of_water_hits, body_part(ARM)); ! erode_weapon(uwep, FALSE); goto glovecheck; default: pline("%s you!", A_gush_of_water_hits); for (otmp=invent; otmp; otmp = otmp->nobj) (void) snuff_lit(otmp); if (uarmc) ! (void) rust_dmg(uarmc, "cloak", 1, TRUE, &youmonst); else if (uarm) (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); #ifdef TOURIST --- 718,732 ---- case 2: pline("%s your right %s!", A_gush_of_water_hits, body_part(ARM)); ! erode_obj(uwep, FALSE, TRUE); goto glovecheck; default: pline("%s you!", A_gush_of_water_hits); for (otmp=invent; otmp; otmp = otmp->nobj) (void) snuff_lit(otmp); if (uarmc) ! (void) rust_dmg(uarmc, cloak_simple_name(uarmc), ! 1, TRUE, &youmonst); else if (uarm) (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); #ifdef TOURIST *************** *** 712,717 **** --- 734,740 ---- (void) rust_dmg(uarmu, "shirt", 1, TRUE, &youmonst); #endif } + update_inventory(); break; case FIRE_TRAP: *************** *** 724,730 **** /* KMH -- You can't escape the Sokoban level traps */ if (!In_sokoban(&u.uz) && (Levitation || Flying)) break; seetrap(trap); ! if (is_clinger(youmonst.data)) { if(trap->tseen) { You("see %s %spit below you.", a_your[trap->madeby_u], ttype == SPIKED_PIT ? "spiked " : ""); --- 747,753 ---- /* KMH -- You can't escape the Sokoban level traps */ if (!In_sokoban(&u.uz) && (Levitation || Flying)) break; seetrap(trap); ! if (!In_sokoban(&u.uz) && is_clinger(youmonst.data)) { if(trap->tseen) { You("see %s %spit below you.", a_your[trap->madeby_u], ttype == SPIKED_PIT ? "spiked " : ""); *************** *** 736,743 **** } break; } ! if (!In_sokoban(&u.uz)) ! You("fall into %s pit!", a_your[trap->madeby_u]); /* wumpus reference */ if (Role_if(PM_RANGER) && !trap->madeby_u && !trap->once && In_quest(&u.uz) && Is_qlocate(&u.uz)) { --- 759,777 ---- } break; } ! if (!In_sokoban(&u.uz)) { ! char verbbuf[BUFSZ]; ! #ifdef STEED ! if (u.usteed) ! Sprintf(verbbuf,"lead %s", ! x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! "poor", SUPPRESS_SADDLE, FALSE)); ! else ! #endif ! Strcpy(verbbuf,"fall"); ! You("%s into %s pit!", verbbuf, a_your[trap->madeby_u]); ! } /* wumpus reference */ if (Role_if(PM_RANGER) && !trap->madeby_u && !trap->once && In_quest(&u.uz) && Is_qlocate(&u.uz)) { *************** *** 746,756 **** } else if (u.umonnum == PM_PIT_VIPER || u.umonnum == PM_PIT_FIEND) pline("How pitiful. Isn't that the pits?"); ! if (ttype == SPIKED_PIT) ! You("land on a set of sharp iron spikes!"); if (!Passes_walls) u.utrap = rn1(6,2); u.utraptype = TT_PIT; if (ttype == SPIKED_PIT) { losehp(rnd(10),"fell into a pit of iron spikes", NO_KILLER_PREFIX); --- 780,803 ---- } else if (u.umonnum == PM_PIT_VIPER || u.umonnum == PM_PIT_FIEND) pline("How pitiful. Isn't that the pits?"); ! if (ttype == SPIKED_PIT) { ! char *predicament = "on a set of sharp iron spikes"; ! #ifdef STEED ! if (u.usteed) { ! pline("%s lands %s!", ! upstart(x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! "poor", SUPPRESS_SADDLE, FALSE)), predicament); ! } else ! #endif ! You("land %s!", predicament); ! } if (!Passes_walls) u.utrap = rn1(6,2); u.utraptype = TT_PIT; + #ifdef STEED + if (!steedintrap(trap, (struct obj *)0)) { + #endif if (ttype == SPIKED_PIT) { losehp(rnd(10),"fell into a pit of iron spikes", NO_KILLER_PREFIX); *************** *** 767,772 **** --- 814,822 ---- vision_full_recalc = 1; /* vision limits change */ exercise(A_STR, FALSE); exercise(A_DEX, FALSE); + #ifdef STEED + } + #endif break; case HOLE: case TRAPDOOR: *************** *** 794,819 **** unsolid(youmonst.data)) { if (acidic(youmonst.data) || u.umonnum == PM_GELATINOUS_CUBE || u.umonnum == PM_FIRE_ELEMENTAL) { ! You("%s %s spider web!", ! (u.umonnum == PM_FIRE_ELEMENTAL) ? "burn" : "dissolve", ! a_your[trap->madeby_u]); deltrap(trap); newsym(u.ux,u.uy); break; } ! You("flow through %s spider web.", a_your[trap->madeby_u]); break; } if (webmaker(youmonst.data)) { ! pline(trap->madeby_u ? "You take a walk on your web." : "There is a spider web here."); break; } ! You("%s into %s spider web!", ! Levitation ? (const char *)"float" : ! locomotion(youmonst.data, "stumble"), ! a_your[trap->madeby_u]); u.utraptype = TT_WEB; /* Time stuck in the web depends on your strength. */ --- 844,883 ---- unsolid(youmonst.data)) { if (acidic(youmonst.data) || u.umonnum == PM_GELATINOUS_CUBE || u.umonnum == PM_FIRE_ELEMENTAL) { ! if (webmsgok) ! You("%s %s spider web!", ! (u.umonnum == PM_FIRE_ELEMENTAL) ? "burn" : "dissolve", ! a_your[trap->madeby_u]); deltrap(trap); newsym(u.ux,u.uy); break; } ! if (webmsgok) You("flow through %s spider web.", a_your[trap->madeby_u]); break; } if (webmaker(youmonst.data)) { ! if (webmsgok) ! pline(trap->madeby_u ? "You take a walk on your web." : "There is a spider web here."); break; } ! if (webmsgok) { ! char verbbuf[BUFSZ]; ! verbbuf[0] = '\0'; ! #ifdef STEED ! if (u.usteed) ! Sprintf(verbbuf,"lead %s", ! x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! "poor", SUPPRESS_SADDLE, FALSE)); ! else ! #endif ! ! Sprintf(verbbuf, "%s", Levitation ? (const char *)"float" : ! locomotion(youmonst.data, "stumble")); ! You("%s into %s spider web!", verbbuf, a_your[trap->madeby_u]); ! } u.utraptype = TT_WEB; /* Time stuck in the web depends on your strength. */ *************** *** 829,835 **** else if (str < 69) u.utrap = 1; else { u.utrap = 0; ! You("tear through %s web!", a_your[trap->madeby_u]); deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ } --- 893,900 ---- else if (str < 69) u.utrap = 1; else { u.utrap = 0; ! if (webmsgok) ! You("tear through %s web!", a_your[trap->madeby_u]); deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ } *************** *** 850,855 **** --- 915,923 ---- Your("body absorbs some of the magical energy!"); u.uen = (u.uenmax += 2); } else domagictrap(); + #ifdef STEED + (void) steedintrap(trap, (struct obj *)0); + #endif break; case ANTI_MAGIC: *************** *** 860,882 **** } else drain_en(rnd(u.ulevel) + 1); break; ! case POLY_TRAP: seetrap(trap); ! You("%s onto a polymorph trap!", Levitation ? (const char *)"float" : locomotion(youmonst.data, "step")); if(Antimagic || Unchanging) { shieldeff(u.ux, u.uy); You_feel("momentarily different."); /* Trap did nothing; don't remove it --KAA */ } else { deltrap(trap); /* delete trap before polymorph */ newsym(u.ux,u.uy); /* get rid of trap symbol */ You_feel("a change coming over you."); ! polyself(); } break; ! case LANDMINE: if (Levitation || Flying) { if (!already_seen && rn2(3)) break; --- 928,963 ---- } else drain_en(rnd(u.ulevel) + 1); break; ! case POLY_TRAP: { ! char verbbuf[BUFSZ]; seetrap(trap); ! #ifdef STEED ! if (u.usteed) ! Sprintf(verbbuf, "lead %s", ! x_monnam(u.usteed, ! u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, ! (char *)0, SUPPRESS_SADDLE, FALSE)); ! else ! #endif ! Sprintf(verbbuf,"%s", Levitation ? (const char *)"float" : locomotion(youmonst.data, "step")); + You("%s onto a polymorph trap!", verbbuf); if(Antimagic || Unchanging) { shieldeff(u.ux, u.uy); You_feel("momentarily different."); /* Trap did nothing; don't remove it --KAA */ } else { + #ifdef STEED + (void) steedintrap(trap, (struct obj *)0); + #endif deltrap(trap); /* delete trap before polymorph */ newsym(u.ux,u.uy); /* get rid of trap symbol */ You_feel("a change coming over you."); ! polyself(FALSE); } break; ! } case LANDMINE: if (Levitation || Flying) { if (!already_seen && rn2(3)) break; *************** *** 890,898 **** --- 971,993 ---- already_seen ? a_your[trap->madeby_u] : "", already_seen ? " land mine" : "it"); } else { + #ifdef STEED + /* prevent landmine from killing steed, throwing you to + * the ground, and you being affected again by the same + * mine because it hasn't been deleted yet + */ + static boolean recursive_mine = FALSE; + + if (recursive_mine) break; + #endif seetrap(trap); pline("KAABLAMM!!! You triggered %s land mine!", a_your[trap->madeby_u]); + #ifdef STEED + recursive_mine = TRUE; + (void) steedintrap(trap, (struct obj *)0); + recursive_mine = FALSE; + #endif set_wounded_legs(LEFT_SIDE, rn1(35, 41)); set_wounded_legs(RIGHT_SIDE, rn1(35, 41)); exercise(A_DEX, FALSE); *************** *** 901,907 **** newsym(u.ux,u.uy); /* update trap symbol */ losehp(rnd(16), "land mine", KILLED_BY_AN); /* fall recursively into the pit... */ ! if ((trap = t_at(u.ux, u.uy)) != 0) dotrap(trap); break; case ROLLING_BOULDER_TRAP: --- 996,1003 ---- newsym(u.ux,u.uy); /* update trap symbol */ losehp(rnd(16), "land mine", KILLED_BY_AN); /* fall recursively into the pit... */ ! if ((trap = t_at(u.ux, u.uy)) != 0) dotrap(trap, 0); ! fill_pit(u.ux, u.uy); break; case ROLLING_BOULDER_TRAP: *************** *** 926,933 **** } } /* some actions common to both player and monsters for triggered landmine */ ! STATIC_OVL void blow_up_landmine(trap) struct trap *trap; { --- 1022,1120 ---- } } + #ifdef STEED + STATIC_OVL int + steedintrap(trap, otmp) + struct trap *trap; + struct obj *otmp; + { + struct monst *mtmp = u.usteed; + struct permonst *mptr; + int tt; + boolean in_sight; + boolean trapkilled = FALSE; + boolean steedhit = FALSE; + + if (!u.usteed || !trap) return 0; + mptr = mtmp->data; + tt = trap->ttyp; + mtmp->mx = u.ux; + mtmp->my = u.uy; + + in_sight = !Blind; + switch (tt) { + case ARROW_TRAP: + if(!otmp) { + impossible("steed hit by non-existant arrow?"); + return 0; + } + if(thitm(8, mtmp, otmp, 0)) trapkilled = TRUE; + steedhit = TRUE; + break; + case DART_TRAP: + if(!otmp) { + impossible("steed hit by non-existant dart?"); + return 0; + } + if(thitm(7, mtmp, otmp, 0)) trapkilled = TRUE; + steedhit = TRUE; + break; + case SLP_GAS_TRAP: + if (!resists_sleep(mtmp) && !breathless(mptr) && + !mtmp->msleeping && mtmp->mcanmove) { + mtmp->mcanmove = 0; + mtmp->mfrozen = rnd(25); + if (in_sight) { + pline("%s suddenly falls asleep!", + Monnam(mtmp)); + } + } + steedhit = TRUE; + break; + case LANDMINE: + if (thitm(0, mtmp, (struct obj *)0, rnd(16))) + trapkilled = TRUE; + steedhit = TRUE; + break; + case PIT: + case SPIKED_PIT: + if (mtmp->mhp <= 0 || + thitm(0, mtmp, (struct obj *)0, + rnd((tt == PIT) ? 6 : 10))) + trapkilled = TRUE; + steedhit = TRUE; + break; + case POLY_TRAP: + if (!resists_magm(mtmp)) { + if (!resist(mtmp, WAND_CLASS, 0, NOTELL)) { + (void) newcham(mtmp, (struct permonst *)0, FALSE); + if (!can_saddle(mtmp) || !can_ride(mtmp)) { + dismount_steed(DISMOUNT_POLY); + } else { + You("have to adjust yourself in the saddle on %s.", + x_monnam(mtmp, + mtmp->mnamelth ? ARTICLE_NONE : ARTICLE_A, + (char *)0, SUPPRESS_SADDLE, FALSE)); + } + + } + steedhit = TRUE; + break; + default: + return 0; + } + } + if(trapkilled) { + dismount_steed(DISMOUNT_POLY); + return 2; + } + else if(steedhit) return 1; + else return 0; + } + #endif /*STEED*/ + /* some actions common to both player and monsters for triggered landmine */ ! void blow_up_landmine(trap) struct trap *trap; { *************** *** 938,945 **** wake_nearto(trap->tx, trap->ty, 400); if (IS_DOOR(levl[trap->tx][trap->ty].typ)) levl[trap->tx][trap->ty].doormask = D_BROKEN; ! /* TODO: destroy drawbridge if present; ! sometimes delete trap instead of always leaving a pit */ trap->ttyp = PIT; /* explosion creates a pit */ trap->madeby_u = FALSE; /* resulting pit isn't yours */ } --- 1125,1132 ---- wake_nearto(trap->tx, trap->ty, 400); if (IS_DOOR(levl[trap->tx][trap->ty].typ)) levl[trap->tx][trap->ty].doormask = D_BROKEN; ! /* TODO: destroy drawbridge if present */ ! /* caller may subsequently fill pit, e.g. with a boulder */ trap->ttyp = PIT; /* explosion creates a pit */ trap->madeby_u = FALSE; /* resulting pit isn't yours */ } *************** *** 961,967 **** int style; { register struct monst *mtmp; ! register struct obj *otmp; register int dx,dy; struct obj *singleobj; boolean used_up = FALSE; --- 1148,1154 ---- int style; { register struct monst *mtmp; ! register struct obj *otmp, *otmp2; register int dx,dy; struct obj *singleobj; boolean used_up = FALSE; *************** *** 990,996 **** singleobj = otmp; otmp = (struct obj *) 0; } else { ! singleobj = splitobj(otmp, otmp->quan - 1L); obj_extract_self(singleobj); } newsym(x1,y1); --- 1177,1183 ---- singleobj = otmp; otmp = (struct obj *) 0; } else { ! singleobj = splitobj(otmp, 1L); obj_extract_self(singleobj); } newsym(x1,y1); *************** *** 1019,1024 **** --- 1206,1212 ---- /* Set the object in motion */ while(dist-- > 0 && !used_up) { + struct trap *t; tmp_at(bhitpos.x, bhitpos.y); tmp = delaycnt; *************** *** 1028,1034 **** bhitpos.x += dx; bhitpos.y += dy; ! if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { if (otyp == BOULDER && throws_rocks(mtmp->data)) { if (rn2(3)) { --- 1216,1223 ---- bhitpos.x += dx; bhitpos.y += dy; ! t = t_at(bhitpos.x, bhitpos.y); ! if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { if (otyp == BOULDER && throws_rocks(mtmp->data)) { if (rn2(3)) { *************** *** 1058,1072 **** --- 1247,1320 ---- break; } } + if (t && otyp == BOULDER) { + switch(t->ttyp) { + case LANDMINE: + if (rn2(10) > 2) { + pline( + "KAABLAMM!!!%s", + cansee(bhitpos.x, bhitpos.y) ? + " The rolling boulder triggers a land mine." : ""); + deltrap(t); + del_engr_at(bhitpos.x,bhitpos.y); + place_object(singleobj, bhitpos.x, bhitpos.y); + fracture_rock(singleobj); + scatter(bhitpos.x,bhitpos.y, 4, + MAY_DESTROY|MAY_HIT|MAY_FRACTURE|VIS_EFFECTS, + (struct obj *)0); + if (cansee(bhitpos.x,bhitpos.y)) + newsym(bhitpos.x,bhitpos.y); + used_up = TRUE; + } + break; + case LEVEL_TELEP: + case TELEP_TRAP: + if (cansee(bhitpos.x, bhitpos.y)) + pline("Suddenly the rolling boulder disappears!"); + else + You_hear("a rumbling stop abruptly."); + if (t->ttyp == TELEP_TRAP) + rloco(singleobj); + else { + int newlev = random_teleport_level(); + d_level dest; + + if (newlev == depth(&u.uz) || In_endgame(&u.uz)) + continue; + add_to_migration(singleobj); + get_level(&dest, newlev); + singleobj->ox = dest.dnum; + singleobj->oy = dest.dlevel; + singleobj->owornmask = (long)MIGR_RANDOM; + } + seetrap(t); + used_up = TRUE; + break; + } + if (used_up) break; + } if (flooreffects(singleobj, bhitpos.x, bhitpos.y, "fall")) { used_up = TRUE; break; } + if (otyp == BOULDER && + (otmp2 = sobj_at(BOULDER, bhitpos.x, bhitpos.y)) != 0) { + char *bmsg = + " as one boulder sets another in motion"; + You_hear("a loud crash%s!", + cansee(bhitpos.x, bhitpos.y) ? bmsg : ""); + obj_extract_self(otmp2); + place_object(singleobj, bhitpos.x, bhitpos.y); + singleobj = otmp2; + otmp2 = (struct obj *)0; + wake_nearto(bhitpos.x, bhitpos.y, 10*10); + } } if (otyp == BOULDER && closed_door(bhitpos.x,bhitpos.y)) { if (cansee(bhitpos.x, bhitpos.y)) pline_The("boulder crashes through a door."); levl[bhitpos.x][bhitpos.y].doormask = D_BROKEN; + if (dist) unblock_point(bhitpos.x, bhitpos.y); } } tmp_at(DISP_END, 0); *************** *** 1192,1197 **** --- 1440,1456 ---- if (!trap) { mtmp->mtrapped = 0; /* perhaps teleported? */ } else if (mtmp->mtrapped) { /* is currently in the trap */ + if (!trap->tseen && + cansee(mtmp->mx, mtmp->my) && canseemon(mtmp) && + (trap->ttyp == SPIKED_PIT || trap->ttyp == BEAR_TRAP || + trap->ttyp == HOLE || trap->ttyp == PIT || + trap->ttyp == WEB)) { + /* If you come upon an obviously trapped monster, then + * you must be able to see the trap it's in too. + */ + seetrap(trap); + } + if (!rn2(40)) { if (sobj_at(BOULDER, mtmp->mx, mtmp->my) && (trap->ttyp == PIT || trap->ttyp == SPIKED_PIT)) { *************** *** 1246,1251 **** --- 1505,1511 ---- otmp = mksobj(ARROW, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); + otmp->opoisoned = 0; if (in_sight) seetrap(trap); if(thitm(8, mtmp, otmp, 0)) trapkilled = TRUE; break; *************** *** 1297,1303 **** break; case SLP_GAS_TRAP: ! if (!resists_sleep(mtmp) && !mtmp->msleeping && mtmp->mcanmove) { mtmp->mcanmove = 0; mtmp->mfrozen = rnd(25); --- 1557,1563 ---- break; case SLP_GAS_TRAP: ! if (!resists_sleep(mtmp) && !breathless(mptr) && !mtmp->msleeping && mtmp->mcanmove) { mtmp->mcanmove = 0; mtmp->mfrozen = rnd(25); *************** *** 1332,1338 **** break; target = MON_WEP(mtmp); if (target && bimanual(target)) ! erode_weapon(target, FALSE); glovecheck: target = which_armor(mtmp, W_ARMG); (void) rust_dmg(target, "gauntlets", 1, TRUE, mtmp); break; --- 1592,1598 ---- break; target = MON_WEP(mtmp); if (target && bimanual(target)) ! erode_obj(target, FALSE, TRUE); glovecheck: target = which_armor(mtmp, W_ARMG); (void) rust_dmg(target, "gauntlets", 1, TRUE, mtmp); break; *************** *** 1340,1346 **** if (in_sight) pline("%s %s's right %s!", A_gush_of_water_hits, mon_nam(mtmp), mbodypart(mtmp, ARM)); ! erode_weapon(MON_WEP(mtmp), FALSE); goto glovecheck; default: if (in_sight) --- 1600,1606 ---- if (in_sight) pline("%s %s's right %s!", A_gush_of_water_hits, mon_nam(mtmp), mbodypart(mtmp, ARM)); ! erode_obj(MON_WEP(mtmp), FALSE, TRUE); goto glovecheck; default: if (in_sight) *************** *** 1350,1356 **** (void) snuff_lit(otmp); target = which_armor(mtmp, W_ARMC); if (target) ! (void) rust_dmg(target, "cloak", 1, TRUE, mtmp); else { target = which_armor(mtmp, W_ARM); if (target) --- 1610,1617 ---- (void) snuff_lit(otmp); target = which_armor(mtmp, W_ARMC); if (target) ! (void) rust_dmg(target, cloak_simple_name(target), ! 1, TRUE, mtmp); else { target = which_armor(mtmp, W_ARM); if (target) *************** *** 1408,1414 **** (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); } ! if (burn_floor_paper(mtmp->mx, mtmp->my, see_it) && !see_it && distu(mtmp->mx, mtmp->my) <= 3*3) You("smell smoke."); if (is_ice(mtmp->mx,mtmp->my)) --- 1669,1675 ---- (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); } ! if (burn_floor_paper(mtmp->mx, mtmp->my, see_it, FALSE) && !see_it && distu(mtmp->mx, mtmp->my) <= 3*3) You("smell smoke."); if (is_ice(mtmp->mx,mtmp->my)) *************** *** 1431,1440 **** pline("%s %s into %s pit!", Monnam(mtmp), fallverb, a_your[trap->madeby_u]); seetrap(trap); } - if (mptr == &mons[PM_PIT_VIPER] || mptr == &mons[PM_PIT_FIEND]) - pline("How pitiful. Isn't that the pits?"); mselftouch(mtmp, "Falling, ", FALSE); if (mtmp->mhp <= 0 || thitm(0, mtmp, (struct obj *)0, --- 1692,1701 ---- pline("%s %s into %s pit!", Monnam(mtmp), fallverb, a_your[trap->madeby_u]); + if (mptr == &mons[PM_PIT_VIPER] || mptr == &mons[PM_PIT_FIEND]) + pline("How pitiful. Isn't that the pits?"); seetrap(trap); } mselftouch(mtmp, "Falling, ", FALSE); if (mtmp->mhp <= 0 || thitm(0, mtmp, (struct obj *)0, *************** *** 1536,1541 **** --- 1797,1803 ---- case PM_IRON_GOLEM: case PM_BALROG: case PM_KRAKEN: + case PM_MASTODON: tear_web = TRUE; break; } *************** *** 1587,1592 **** --- 1849,1857 ---- /* monsters recursively fall into new pit */ if (mintrap(mtmp) == 2) trapkilled=TRUE; } + /* a boulder may fill the new pit, crushing monster */ + fill_pit(trap->tx, trap->ty); + if (mtmp->mhp <= 0) trapkilled = TRUE; if (unconscious()) { multi = -1; nomovemsg="The explosion awakens you!"; *************** *** 1597,1603 **** if (resists_magm(mtmp)) { shieldeff(mtmp->mx, mtmp->my); } else if (!resist(mtmp, WAND_CLASS, 0, NOTELL)) { ! (void) newcham(mtmp, (struct permonst *)0); if (in_sight) seetrap(trap); } break; --- 1862,1868 ---- if (resists_magm(mtmp)) { shieldeff(mtmp->mx, mtmp->my); } else if (!resist(mtmp, WAND_CLASS, 0, NOTELL)) { ! (void) newcham(mtmp, (struct permonst *)0, FALSE); if (in_sight) seetrap(trap); } break; *************** *** 1815,1859 **** } } if (!trap) { ! trap = t_at(u.ux,u.uy); ! if(Is_airlevel(&u.uz)) ! You("begin to tumble in place."); ! else if (Is_waterlevel(&u.uz) && !no_msg) ! You_feel("heavier."); ! /* u.uinwater msgs already in spoteffects()/drown() */ ! else if (!u.uinwater && !no_msg) { #ifdef STEED ! if (!(emask & W_SADDLE)) #endif ! { ! boolean sokoban_trap = (In_sokoban(&u.uz) && trap); ! if (Hallucination) ! pline("Bummer! You've %s.", ! is_pool(u.ux,u.uy) ? ! "splashed down" : sokoban_trap ? "crashed" : ! "hit the ground"); else { ! if (!sokoban_trap) ! You("float gently to the %s.", ! surface(u.ux, u.uy)); ! else { ! /* Justification elsewhere for Sokoban traps ! * is based on air currents. This is ! * consistent with that. ! * The unexpected additional force of the ! * air currents once leviation ! * ceases knocks you off your feet. ! */ ! You("fall over."); ! losehp(rnd(2), "wind swept", KILLED_BY); #ifdef STEED ! if (u.usteed) dismount_steed(DISMOUNT_FELL); #endif ! selftouch("As you fall, you"); ! } } } } } /* can't rely on u.uz0 for detecting trap door-induced level change; --- 2080,2124 ---- } } if (!trap) { ! trap = t_at(u.ux,u.uy); ! if(Is_airlevel(&u.uz)) ! You("begin to tumble in place."); ! else if (Is_waterlevel(&u.uz) && !no_msg) ! You_feel("heavier."); ! /* u.uinwater msgs already in spoteffects()/drown() */ ! else if (!u.uinwater && !no_msg) { #ifdef STEED ! if (!(emask & W_SADDLE)) #endif ! { ! boolean sokoban_trap = (In_sokoban(&u.uz) && trap); ! if (Hallucination) ! pline("Bummer! You've %s.", ! is_pool(u.ux,u.uy) ? ! "splashed down" : sokoban_trap ? "crashed" : ! "hit the ground"); ! else { ! if (!sokoban_trap) ! You("float gently to the %s.", ! surface(u.ux, u.uy)); else { ! /* Justification elsewhere for Sokoban traps ! * is based on air currents. This is ! * consistent with that. ! * The unexpected additional force of the ! * air currents once leviation ! * ceases knocks you off your feet. ! */ ! You("fall over."); ! losehp(rnd(2), "dangerous winds", KILLED_BY); #ifdef STEED ! if (u.usteed) dismount_steed(DISMOUNT_FELL); #endif ! selftouch("As you fall, you"); } } } + } } /* can't rely on u.uz0 for detecting trap door-induced level change; *************** *** 1870,1876 **** break; /* fall into next case */ default: ! dotrap(trap); } if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !u.uswallow && --- 2135,2142 ---- break; /* fall into next case */ default: ! if (!u.utrap) /* not already in the trap */ ! dotrap(trap, 0); } if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !u.uswallow && *************** *** 1921,1927 **** destroy_item(SPBOOK_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE); } ! if (!box && burn_floor_paper(u.ux, u.uy, see_it) && !see_it) You("smell paper burning."); if (is_ice(u.ux, u.uy)) melt_ice(u.ux, u.uy); --- 2187,2193 ---- destroy_item(SPBOOK_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE); } ! if (!box && burn_floor_paper(u.ux, u.uy, see_it, TRUE) && !see_it) You("smell paper burning."); if (is_ice(u.ux, u.uy)) melt_ice(u.ux, u.uy); *************** *** 1941,1946 **** --- 2207,2213 ---- if (!resists_blnd(&youmonst)) { You("are momentarily blinded by a flash of light!"); make_blinded((long)rn1(5,10),FALSE); + if (!Blind) Your(vision_clears); } else if (!Blind) { You("see a flash of light!"); } else *************** *** 2006,2027 **** case 20: /* uncurse stuff */ ! { register struct obj *obj; ! /* below plines added by GAN 10/30/86 */ ! You_feel(Hallucination ? ! "in touch with the Universal Oneness." : ! "like someone is helping you."); ! for(obj = invent; obj ; obj = obj->nobj) ! if(obj->owornmask || obj->otyp == LOADSTONE) ! uncurse(obj); ! if(Punished) unpunish(); ! break; } default: break; } } void water_damage(obj, force, here) register struct obj *obj; --- 2273,2392 ---- case 20: /* uncurse stuff */ ! { struct obj pseudo; ! long save_conf = HConfusion; ! pseudo = zeroobj; /* neither cursed nor blessed */ ! pseudo.otyp = SCR_REMOVE_CURSE; ! HConfusion = 0L; ! (void) seffects(&pseudo); ! HConfusion = save_conf; ! break; } default: break; } } + /* + * Scrolls, spellbooks, potions, and flammable items + * may get affected by the fire. + * + * Return number of objects destroyed. --ALI + */ + int + fire_damage(chain, force, here, x, y) + struct obj *chain; + boolean force, here; + xchar x, y; + { + int chance; + struct obj *obj, *otmp, *nobj, *ncobj; + int retval = 0; + int in_sight = !Blind && couldsee(x, y); /* Don't care if it's lit */ + int dindx; + + for (obj = chain; obj; obj = nobj) { + nobj = here ? obj->nexthere : obj->nobj; + + /* object might light in a controlled manner */ + if (catch_lit(obj)) + continue; + + if (Is_container(obj)) { + switch (obj->otyp) { + case ICE_BOX: + continue; /* Immune */ + /*NOTREACHED*/ + break; + case CHEST: + chance = 40; + break; + case LARGE_BOX: + chance = 30; + break; + default: + chance = 20; + break; + } + if (!force && (Luck + 5) > rn2(chance)) + continue; + /* Container is burnt up - dump contents out */ + if (in_sight) pline("%s catches fire and burns.", Yname2(obj)); + if (Has_contents(obj)) { + if (in_sight) pline("Its contents fall out."); + for (otmp = obj->cobj; otmp; otmp = ncobj) { + ncobj = otmp->nobj; + obj_extract_self(otmp); + if (!flooreffects(otmp, x, y, "")) + place_object(otmp, x, y); + } + } + delobj(obj); + retval++; + } else if (!force && (Luck + 5) > rn2(20)) { + /* chance per item of sustaining damage: + * max luck (full moon): 5% + * max luck (elsewhen): 10% + * avg luck (Luck==0): 75% + * awful luck (Luck<-4): 100% + */ + continue; + } else if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS) { + if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL) + continue; + if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { + if (in_sight) pline("Smoke rises from %s.", the(xname(obj))); + continue; + } + dindx = (obj->oclass == SCROLL_CLASS) ? 2 : 3; + if (in_sight) + pline("%s %s.", Yname2(obj), (obj->quan > 1) ? + destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); + delobj(obj); + retval++; + } else if (obj->oclass == POTION_CLASS) { + dindx = 1; + if (in_sight) + pline("%s %s.", Yname2(obj), (obj->quan > 1) ? + destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); + delobj(obj); + retval++; + } else if (is_flammable(obj) && obj->oeroded < MAX_ERODE && + !(obj->oerodeproof || (obj->blessed && !rnl(4)))) { + if (in_sight) { + pline("%s %s%s.", Yname2(obj), otense(obj, "burn"), + obj->oeroded+1 == MAX_ERODE ? " completely" : + obj->oeroded ? " further" : ""); + } + obj->oeroded++; + } + } + + if (retval && !in_sight) + You("smell smoke."); + return retval; + } + void water_damage(obj, force, here) register struct obj *obj; *************** *** 2122,2128 **** /* else continue */ } } ! if (!otmp) { /* Nothing available left to drop; try gold */ if (u.ugold) { --- 2487,2493 ---- /* else continue */ } } ! #ifndef GOLDOBJ if (!otmp) { /* Nothing available left to drop; try gold */ if (u.ugold) { *************** *** 2135,2150 **** assigninvlet(obj); /* might end up as NOINVSYM */ obj->nobj = invent; invent = obj; dropx(obj); continue; /* Try again */ } /* We can't even drop gold! */ return (FALSE); } ! ! if (otmp == uarmh) (void) Helmet_off(); ! else if (otmp == uarms) (void) Shield_off(); ! else if (otmp == uwep) setuwep((struct obj *)0); *lostsome = TRUE; dropx(otmp); invc--; --- 2500,2516 ---- assigninvlet(obj); /* might end up as NOINVSYM */ obj->nobj = invent; invent = obj; + *lostsome = TRUE; dropx(obj); continue; /* Try again */ } /* We can't even drop gold! */ return (FALSE); } ! #else ! if (!otmp) return (FALSE); /* nothing to drop! */ ! #endif ! if (otmp->owornmask && otmp != uball) remove_worn_item(otmp); *lostsome = TRUE; dropx(otmp); invc--; *************** *** 2306,2312 **** pline("You're too strained to do that."); return 0; } ! if (nohands(youmonst.data) || !youmonst.data->mmove) { pline("And just how do you expect to do that?"); return 0; } else if (u.ustuck && sticks(youmonst.data)) { --- 2672,2678 ---- pline("You're too strained to do that."); return 0; } ! if ((nohands(youmonst.data) && !webmaker(youmonst.data)) || !youmonst.data->mmove) { pline("And just how do you expect to do that?"); return 0; } else if (u.ustuck && sticks(youmonst.data)) { *************** *** 2330,2335 **** --- 2696,2704 ---- { int chance = 3; + /* Only spiders know how to deal with webs reliably */ + if (ttmp->ttyp == WEB && !webmaker(youmonst.data)) + chance = 30; if (Confusion || Hallucination) chance++; if (Blind) chance++; if (Stunned) chance += 2; *************** *** 2339,2345 **** if (Role_if(PM_ROGUE)) { if (rn2(2 * MAXULEV) < u.ulevel) chance--; if (u.uhave.questart && chance > 1) chance--; ! } else if (Role_if(PM_RANGER)) chance--; return rn2(chance); } --- 2708,2714 ---- if (Role_if(PM_ROGUE)) { if (rn2(2 * MAXULEV) < u.ulevel) chance--; if (u.uhave.questart && chance > 1) chance--; ! } else if (Role_if(PM_RANGER) && chance > 1) chance--; return rn2(chance); } *************** *** 2353,2358 **** --- 2722,2730 ---- struct obj *otmp = mksobj(otyp, TRUE, FALSE); otmp->quan=cnt; otmp->owt = weight(otmp); + /* Only dart traps are capable of being poisonous */ + if (otyp != DART) + otmp->opoisoned = 0; place_object(otmp, ttmp->tx, ttmp->ty); /* Sell your own traps only... */ if (ttmp->madeby_u) sellobj(otmp, ttmp->tx, ttmp->ty); *************** *** 2396,2404 **** struct monst *mtmp = m_at(ttmp->tx,ttmp->ty); int ttype = ttmp->ttyp; boolean under_u = (!u.dx && !u.dy); ! /* Test for monster first, monsters are displayed instead of trap. */ ! if (mtmp && (!mtmp->mtrapped || ttype != BEAR_TRAP)) { pline("%s is in the way.", Monnam(mtmp)); return 0; } --- 2768,2777 ---- struct monst *mtmp = m_at(ttmp->tx,ttmp->ty); int ttype = ttmp->ttyp; boolean under_u = (!u.dx && !u.dy); ! boolean holdingtrap = (ttype == BEAR_TRAP || ttype == WEB); ! /* Test for monster first, monsters are displayed instead of trap. */ ! if (mtmp && (!mtmp->mtrapped || !holdingtrap)) { pline("%s is in the way.", Monnam(mtmp)); return 0; } *************** *** 2408,2413 **** --- 2781,2798 ---- There("is a boulder in your way."); return 0; } + /* duplicate tight-space checks from test_move */ + if (u.dx && u.dy && + bad_rock(youmonst.data,u.ux,ttmp->ty) && + bad_rock(youmonst.data,ttmp->tx,u.uy)) { + if ((invent && (inv_weight() + weight_cap() > 600)) || + bigmonst(youmonst.data)) { + /* don't allow untrap if they can't get thru to it */ + You("are unable to reach the %s!", + defsyms[trap_to_defsym(ttype)].explanation); + return 0; + } + } /* untrappable traps are located on the ground. */ if (!can_reach_floor()) { #ifdef STEED *************** *** 2425,2442 **** if (force_failure || untrap_prob(ttmp)) { if (rnl(5)) { pline("Whoops..."); ! if (mtmp) { /* must be a bear trap */ ! if (mtmp->mtame) abuse_dog(mtmp); ! if ((mtmp->mhp -= rnd(4)) <= 0) killed(mtmp); } else if (under_u) { ! dotrap(ttmp); } else { move_into_trap(ttmp); } } else { ! pline("%s %s is difficult to disarm.", ttmp->madeby_u ? "Your" : under_u ? "This" : "That", ! defsyms[trap_to_defsym(ttype)].explanation); } return 1; } --- 2810,2839 ---- if (force_failure || untrap_prob(ttmp)) { if (rnl(5)) { pline("Whoops..."); ! if (mtmp) { /* must be a trap that holds monsters */ ! if (ttype == BEAR_TRAP) { ! if (mtmp->mtame) abuse_dog(mtmp); ! if ((mtmp->mhp -= rnd(4)) <= 0) killed(mtmp); ! } else if (ttype == WEB) { ! if (!webmaker(youmonst.data)) { ! struct trap *ttmp2 = maketrap(u.ux, u.uy, WEB); ! if (ttmp2) { ! pline_The("webbing sticks to you. You're caught too!"); ! dotrap(ttmp2, NOWEBMSG); ! } ! } else ! pline("%s remains entangled.", Monnam(mtmp)); ! } } else if (under_u) { ! dotrap(ttmp, 0); } else { move_into_trap(ttmp); } } else { ! pline("%s %s is difficult to %s.", ttmp->madeby_u ? "Your" : under_u ? "This" : "That", ! defsyms[trap_to_defsym(ttype)].explanation, ! (ttype == WEB) ? "remove" : "disarm"); } return 1; } *************** *** 2449,2471 **** struct monst *mtmp; { if (!ttmp->madeby_u) { ! if (rnl(10)<8 && !mtmp->mpeaceful && ! mtmp->data->mlet != S_HUMAN) { ! mtmp->mpeaceful = 1; ! set_malign(mtmp); /* reset alignment */ ! pline("%s is grateful.", Monnam(mtmp)); ! } ! /* Helping someone out of a trap is a nice thing to do, ! * A lawful may be rewarded, but not too often. */ ! if (!rn2(3) && !rnl(8) && u.ualign.type == A_LAWFUL) { ! adjalign(1); ! You_feel("that you did the right thing."); ! } } } STATIC_OVL int ! disarm_beartrap(ttmp) /* Helge Hafting */ struct trap *ttmp; { struct monst *mtmp; --- 2846,2869 ---- struct monst *mtmp; { if (!ttmp->madeby_u) { ! if (rnl(10) < 8 && !mtmp->mpeaceful && ! !mindless(mtmp->data) && ! mtmp->data->mlet != S_HUMAN) { ! mtmp->mpeaceful = 1; ! set_malign(mtmp); /* reset alignment */ ! pline("%s is grateful.", Monnam(mtmp)); ! } ! /* Helping someone out of a trap is a nice thing to do, ! * A lawful may be rewarded, but not too often. */ ! if (!rn2(3) && !rnl(8) && u.ualign.type == A_LAWFUL) { ! adjalign(1); ! You_feel("that you did the right thing."); ! } } } STATIC_OVL int ! disarm_holdingtrap(ttmp) /* Helge Hafting */ struct trap *ttmp; { struct monst *mtmp; *************** *** 2479,2489 **** There's no need for a cockatrice test, only the trap is touched */ if ((mtmp = m_at(ttmp->tx,ttmp->ty)) != 0) { mtmp->mtrapped = 0; ! You("remove %s bear trap from %s.", the_your[ttmp->madeby_u], mon_nam(mtmp)); reward_untrap(ttmp, mtmp); ! } else You("disarm %s bear trap.", the_your[ttmp->madeby_u]); ! cnv_trap_obj(BEARTRAP, 1, ttmp); return 1; } --- 2877,2896 ---- There's no need for a cockatrice test, only the trap is touched */ if ((mtmp = m_at(ttmp->tx,ttmp->ty)) != 0) { mtmp->mtrapped = 0; ! You("remove %s %s from %s.", the_your[ttmp->madeby_u], ! (ttmp->ttyp == BEAR_TRAP) ? "bear trap" : "webbing", mon_nam(mtmp)); reward_untrap(ttmp, mtmp); ! } else { ! if (ttmp->ttyp == BEAR_TRAP) { ! You("disarm %s bear trap.", the_your[ttmp->madeby_u]); ! cnv_trap_obj(BEARTRAP, 1, ttmp); ! } else /* if (ttmp->ttyp == WEB) */ { ! You("succeed in removing %s web.", the_your[ttmp->madeby_u]); ! deltrap(ttmp); ! } ! } ! newsym(u.ux + u.dx, u.uy + u.dy); return 1; } *************** *** 2533,2538 **** --- 2940,2946 ---- deltrap(ttmp); newsym(u.ux + u.dx, u.uy + u.dy); more_experienced(1, 5); + newexplevel(); return 1; } *************** *** 2561,2576 **** { int wc = weight_cap(); ! if ((((wt<<1) / wc)+1) >= EXT_ENCUMBER) { ! pline("%s is %s for you to lift.", Monnam(mtmp), ! stuff ? "carrying too much" : "too heavy"); ! if (!ttmp->madeby_u && !mtmp->mpeaceful ! && mtmp->data->mlet != S_HUMAN && rnl(10) < 3) { ! mtmp->mpeaceful = 1; ! set_malign(mtmp); /* reset alignment */ ! pline("%s thinks it was nice of you to try.", Monnam(mtmp)); ! } ! return 0; } return 1; } --- 2969,2985 ---- { int wc = weight_cap(); ! if (((wt * 2) / wc) >= HVY_ENCUMBER) { ! pline("%s is %s for you to lift.", Monnam(mtmp), ! stuff ? "carrying too much" : "too heavy"); ! if (!ttmp->madeby_u && !mtmp->mpeaceful && mtmp->mcanmove && ! !mindless(mtmp->data) && ! mtmp->data->mlet != S_HUMAN && rnl(10) < 3) { ! mtmp->mpeaceful = 1; ! set_malign(mtmp); /* reset alignment */ ! pline("%s thinks it was nice of you to try.", Monnam(mtmp)); ! } ! return 0; } return 1; } *************** *** 2583,2588 **** --- 2992,2998 ---- { int wt; struct obj *otmp; + boolean uprob; /* * This works when levitating too -- consistent with the ability *************** *** 2601,2607 **** if (check_capacity((char *)0)) return 1; /* Will our hero succeed? */ ! if (untrap_prob(ttmp)) { You("try to reach out your %s, but %s backs away skeptically.", makeplural(body_part(ARM)), mon_nam(mtmp)); --- 3011,3017 ---- if (check_capacity((char *)0)) return 1; /* Will our hero succeed? */ ! if ((uprob = untrap_prob(ttmp)) && !mtmp->msleeping && mtmp->mcanmove) { You("try to reach out your %s, but %s backs away skeptically.", makeplural(body_part(ARM)), mon_nam(mtmp)); *************** *** 2625,2633 **** --- 3035,3064 ---- return 1; } } + /* need to do cockatrice check first if sleeping or paralyzed */ + if (uprob) { + You("try to grab %s, but cannot get a firm grasp.", + mon_nam(mtmp)); + if (mtmp->msleeping) { + mtmp->msleeping = 0; + pline("%s awakens.", Monnam(mtmp)); + } + return 1; + } + You("reach out your %s and grab %s.", makeplural(body_part(ARM)), mon_nam(mtmp)); + if (mtmp->msleeping) { + mtmp->msleeping = 0; + pline("%s awakens.", Monnam(mtmp)); + } else if (mtmp->mfrozen && !rn2(mtmp->mfrozen)) { + /* After such manhandling, perhaps the effect wears off */ + mtmp->mcanmove = 1; + mtmp->mfrozen = 0; + pline("%s stirs.", Monnam(mtmp)); + } + /* is the monster too heavy? */ wt = inv_weight() + mtmp->data->cwt; if (!try_lift(mtmp, ttmp, wt, FALSE)) return 1; *************** *** 2667,2673 **** } switch(ttmp->ttyp) { case BEAR_TRAP: ! return disarm_beartrap(ttmp); case LANDMINE: return disarm_landmine(ttmp); case SQKY_BOARD: --- 3098,3105 ---- } switch(ttmp->ttyp) { case BEAR_TRAP: ! case WEB: ! return disarm_holdingtrap(ttmp); case LANDMINE: return disarm_landmine(ttmp); case SQKY_BOARD: *************** *** 2859,2865 **** insider = (*u.ushops && inside_shop(u.ux, u.uy) && *in_rooms(ox, oy, SHOPBASE) == *u.ushops); ! pline("%s explodes!", The(xname(obj))); Sprintf(buf, "exploding %s", xname(obj)); if(costly) --- 3291,3297 ---- insider = (*u.ushops && inside_shop(u.ux, u.uy) && *in_rooms(ox, oy, SHOPBASE) == *u.ushops); ! pline("%s!", Tobjnam(obj, "explode")); Sprintf(buf, "exploding %s", xname(obj)); if(costly) *************** *** 2880,2890 **** exercise(A_STR, FALSE); if(costly && loss) { if(insider) ! You("owe %ld zorkmids for objects destroyed.", ! loss); else { ! You("caused %ld zorkmids worth of damage!", ! loss); make_angry_shk(shkp, ox, oy); } } --- 3312,3322 ---- exercise(A_STR, FALSE); if(costly && loss) { if(insider) ! You("owe %ld %s for objects destroyed.", ! loss, currency(loss)); else { ! You("caused %ld %s worth of damage!", ! loss, currency(loss)); make_angry_shk(shkp, ox, oy); } } *************** *** 2950,2958 **** if (Hallucination) pline("What a groovy feeling!"); else if (Blind) ! You("stagger and get dizzy..."); else ! You("stagger and your vision blurs..."); } make_stunned(HStun + rn1(7, 16),FALSE); make_hallucinated(HHallucination + rn1(5, 16),FALSE,0L); --- 3382,3392 ---- if (Hallucination) pline("What a groovy feeling!"); else if (Blind) ! You("%s and get dizzy...", ! stagger(youmonst.data, "stagger")); else ! You("%s and your vision blurs...", ! stagger(youmonst.data, "stagger")); } make_stunned(HStun + rn1(7, 16),FALSE); make_hallucinated(HHallucination + rn1(5, 16),FALSE,0L); *************** *** 3068,3076 **** * obj->spe into account. */ if(!strike) { ! if (cansee(mon->mx, mon->my)) ! pline("%s is almost hit by %s!", Monnam(mon), ! doname(obj)); } else { int dam = 1; --- 3502,3509 ---- * obj->spe into account. */ if(!strike) { ! if (obj && cansee(mon->mx, mon->my)) ! pline("%s is almost hit by %s!", Monnam(mon), doname(obj)); } else { int dam = 1; *************** *** 3105,3112 **** { return((boolean)(multi < 0 && (!nomovemsg || u.usleep || ! !strncmp(nomovemsg,"You regain con", 15) || ! !strncmp(nomovemsg,"You are consci", 15)))); } static char lava_killer[] = "molten lava"; --- 3538,3545 ---- { return((boolean)(multi < 0 && (!nomovemsg || u.usleep || ! !strncmp(nomovemsg,"You regain con", 14) || ! !strncmp(nomovemsg,"You are consci", 14)))); } static char lava_killer[] = "molten lava"; *** nethack-3.3.1/src/uhitm.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/uhitm.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)uhitm.c 3.3 2000/02/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)uhitm.c 3.4 2002/02/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 37,43 **** switch(attk) { /* 0 is burning, which we should never be called with */ case AD_RUST: hurt = 1; break; ! case AD_CORRODE: hurt = 3; break; default: hurt = 2; break; } /* What the following code does: it keeps looping until it --- 37,43 ---- switch(attk) { /* 0 is burning, which we should never be called with */ case AD_RUST: hurt = 1; break; ! case AD_CORR: hurt = 3; break; default: hurt = 2; break; } /* What the following code does: it keeps looping until it *************** *** 87,92 **** --- 87,93 ---- } } + /* FALSE means it's OK to attack */ boolean attack_checks(mtmp, wep) register struct monst *mtmp; *************** *** 114,126 **** return FALSE; } ! /* Put up an invisible monster marker, but one exception is for ! * monsters that hide. That already prints a warning message and * prevents you from hitting the monster just via the hidden monster * code below; if we also did that here, similar behavior would be ! * happening two turns in a row. */ if (!canspotmon(mtmp) && !glyph_is_invisible(levl[u.ux+u.dx][u.uy+u.dy].glyph) && !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) { pline("Wait! There's %s there you can't see!", --- 115,130 ---- return FALSE; } ! /* Put up an invisible monster marker, but with exceptions for ! * monsters that hide and monsters you've been warned about. ! * The former already prints a warning message and * prevents you from hitting the monster just via the hidden monster * code below; if we also did that here, similar behavior would be ! * happening two turns in a row. The latter shows a glyph on ! * the screen, so you know something is there. */ if (!canspotmon(mtmp) && + !glyph_is_warning(glyph_at(u.ux+u.dx,u.uy+u.dy)) && !glyph_is_invisible(levl[u.ux+u.dx][u.uy+u.dy].glyph) && !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) { pline("Wait! There's %s there you can't see!", *************** *** 137,144 **** return TRUE; } ! if(mtmp->m_ap_type && !Protection_from_shape_changers ! && !sensemon(mtmp)) { /* If a hidden mimic was in a square where a player remembers * some (probably different) unseen monster, the player is in * luck--he attacks it even though it's hidden. --- 141,149 ---- return TRUE; } ! if (mtmp->m_ap_type && !Protection_from_shape_changers && ! !sensemon(mtmp) && ! !glyph_is_warning(glyph_at(u.ux+u.dx,u.uy+u.dy))) { /* If a hidden mimic was in a square where a player remembers * some (probably different) unseen monster, the player is in * luck--he attacks it even though it's hidden. *************** *** 152,157 **** --- 157,163 ---- } if (mtmp->mundetected && !canseemon(mtmp) && + !glyph_is_warning(glyph_at(u.ux+u.dx,u.uy+u.dy)) && (hides_under(mtmp->data) || mtmp->data->mlet == S_EEL)) { mtmp->mundetected = mtmp->msleeping = 0; newsym(mtmp->mx, mtmp->my); *************** *** 171,176 **** --- 177,191 ---- } } + /* + * make sure to wake up a monster from the above cases if the + * hero can sense that the monster is there. + */ + if ((mtmp->mundetected || mtmp->m_ap_type) && sensemon(mtmp)) { + mtmp->mundetected = 0; + wakeup(mtmp); + } + if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination && !Stunned) { /* Intelligent chaotic weapons (Stormbringer) want blood */ *************** *** 202,208 **** /* it is unchivalrous to attack the defenseless or from behind */ if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL && ! (!mtmp->mcanmove || mtmp->msleeping || mtmp->mflee) && u.ualign.record > -10) { You("caitiff!"); adjalign(-1); --- 217,224 ---- /* it is unchivalrous to attack the defenseless or from behind */ if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL && ! (!mtmp->mcanmove || mtmp->msleeping || ! (mtmp->mflee && !mtmp->mavenge)) && u.ualign.record > -10) { You("caitiff!"); adjalign(-1); *************** *** 284,299 **** * there's also a chance of displacing a "frozen" monster. * sleeping monsters might magically walk in their sleep. */ ! unsigned int foo = (Punished || ! !rn2(7) || is_longworm(mtmp->data)); ! if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE) || foo ! || (IS_ROCK(levl[u.ux][u.uy].typ) && !passes_walls(mtmp->data))) { char buf[BUFSZ]; ! mtmp->mflee = 1; ! mtmp->mfleetim = rnd(6); Strcpy(buf, y_monnam(mtmp)); buf[0] = highc(buf[0]); You("stop. %s is in the way!", buf); --- 300,321 ---- * there's also a chance of displacing a "frozen" monster. * sleeping monsters might magically walk in their sleep. */ ! boolean foo = (Punished || !rn2(7) || is_longworm(mtmp->data)), ! inshop = FALSE; ! char *p; ! ! for (p = in_rooms(mtmp->mx, mtmp->my, SHOPBASE); *p; p++) ! if (tended_shop(&rooms[*p - ROOMOFFSET])) { ! inshop = TRUE; ! break; ! } ! if (inshop || foo || ! (IS_ROCK(levl[u.ux][u.uy].typ) && !passes_walls(mtmp->data))) { char buf[BUFSZ]; ! monflee(mtmp, rnd(6), FALSE, FALSE); Strcpy(buf, y_monnam(mtmp)); buf[0] = highc(buf[0]); You("stop. %s is in the way!", buf); *************** *** 397,420 **** /* we hit the monster; be careful: it might die! */ notonhead = (mon->mx != u.ux+u.dx || mon->my != u.uy+u.dy); malive = hmon(mon, uwep, 0); ! if (malive && u.twoweap) malive = hmon(mon, uswapwep, 0); if (malive) { /* monster still alive */ if(!rn2(25) && mon->mhp < mon->mhpmax/2 && !(u.uswallow && mon == u.ustuck)) { /* maybe should regurgitate if swallowed? */ - mon->mflee = 1; if(!rn2(3)) { ! mon->mfleetim = rnd(100); ! if (!Blind) pline("%s turns to flee!", (Monnam(mon))); ! } if(u.ustuck == mon && !u.uswallow && !sticks(youmonst.data)) u.ustuck = 0; } /* Vorpal Blade hit converted to miss */ /* could be headless monster or worm tail */ ! if (mon->mhp == oldhp) ! *mhit = 0; if (mon->wormno && *mhit) cutworm(mon, u.ux+u.dx, u.uy+u.dy, uwep); } --- 419,448 ---- /* we hit the monster; be careful: it might die! */ notonhead = (mon->mx != u.ux+u.dx || mon->my != u.uy+u.dy); malive = hmon(mon, uwep, 0); ! /* This assumes that Stormbringer was uwep not uswapwep */ ! if (malive && u.twoweap && !override_confirmation) ! malive = hmon(mon, uswapwep, 0); if (malive) { /* monster still alive */ if(!rn2(25) && mon->mhp < mon->mhpmax/2 && !(u.uswallow && mon == u.ustuck)) { /* maybe should regurgitate if swallowed? */ if(!rn2(3)) { ! monflee(mon, rnd(100), FALSE, TRUE); ! } else monflee(mon, 0, FALSE, TRUE); ! if(u.ustuck == mon && !u.uswallow && !sticks(youmonst.data)) u.ustuck = 0; } /* Vorpal Blade hit converted to miss */ /* could be headless monster or worm tail */ ! if (mon->mhp == oldhp) { ! *mhit = 0; ! /* a miss does not break conduct */ ! if (uwep && ! (uwep->oclass == WEAPON_CLASS || is_weptool(uwep))) ! --u.uconduct.weaphit; ! } if (mon->wormno && *mhit) cutworm(mon, u.ux+u.dx, u.uy+u.dy, uwep); } *************** *** 475,480 **** --- 503,511 ---- boolean get_dmg_bonus = TRUE; boolean ispoisoned = FALSE, needpoismsg = FALSE, poiskilled = FALSE; boolean silvermsg = FALSE; + #ifdef STEED + boolean jousting = FALSE; + #endif boolean valid_weapon_attack = FALSE; int wtype; struct obj *monwep; *************** *** 544,552 **** ((wtype = uwep_skill_type()) != P_NONE && P_SKILL(wtype) >= P_SKILLED) && ((monwep = MON_WEP(mon)) != 0 && ! weapon_type(monwep) != P_WHIP && ! !obj_resists(monwep, ! 50 + 15 * greatest_erosion(monwep), 100))) { /* * 2.5% chance of shattering defender's weapon when * using a two-handed weapon; less if uwep is rusted. --- 575,583 ---- ((wtype = uwep_skill_type()) != P_NONE && P_SKILL(wtype) >= P_SKILLED) && ((monwep = MON_WEP(mon)) != 0 && ! !is_flimsy(monwep) && ! !obj_resists(monwep, ! 50 + 15 * greatest_erosion(obj), 100))) { /* * 2.5% chance of shattering defender's weapon when * using a two-handed weapon; less if uwep is rusted. *************** *** 554,570 **** * -bisecting hit, in case of special artifact damage; * the percentage chance is (1/20)*(50/100).] */ ! monwep->owornmask &= ~W_WEP; MON_NOWEP(mon); mon->weapon_check = NEED_WEAPON; ! pline("%s %s shatter%s from the force of your blow!", s_suffix(Monnam(mon)), xname(monwep), ! (monwep->quan) == 1L ? "s" : ""); m_useup(mon, monwep); /* If someone just shattered MY weapon, I'd flee! */ ! if (rn2(4) && !mon->mflee) { ! mon->mflee = 1; ! mon->mfleetim = d(2,3); } hittxt = TRUE; } --- 585,600 ---- * -bisecting hit, in case of special artifact damage; * the percentage chance is (1/20)*(50/100).] */ ! setmnotwielded(mon,monwep); MON_NOWEP(mon); mon->weapon_check = NEED_WEAPON; ! pline("%s %s %s from the force of your blow!", s_suffix(Monnam(mon)), xname(monwep), ! otense(monwep, "shatter")); m_useup(mon, monwep); /* If someone just shattered MY weapon, I'd flee! */ ! if (rn2(4)) { ! monflee(mon, d(2,3), TRUE, TRUE); } hittxt = TRUE; } *************** *** 579,584 **** --- 609,619 ---- if (objects[obj->otyp].oc_material == SILVER && hates_silver(mdat)) silvermsg = TRUE; + #ifdef STEED + if (u.usteed && !thrown && + weapon_type(obj) == P_LANCE && mon != u.ustuck) + jousting = TRUE; + #endif if(!thrown && obj == uwep && obj->otyp == BOOMERANG && !rnl(3)) { pline("As you hit %s, %s breaks into splinters.", *************** *** 607,613 **** } } else if(obj->oclass == POTION_CLASS) { if (obj->quan > 1L) ! setworn(splitobj(obj, 1L), W_WEP); else setuwep((struct obj *)0); freeinv(obj); --- 642,648 ---- } } else if(obj->oclass == POTION_CLASS) { if (obj->quan > 1L) ! obj = splitobj(obj, 1L); else setuwep((struct obj *)0); freeinv(obj); *************** *** 705,711 **** (cnt > 1L) ? "some" : "an"; You("hit %s with %s egg%s.", mon_nam(mon), eggp, plur(cnt)); ! if (touch_petrifies(mdat)) { pline_The("egg%s %s alive any more...", plur(cnt), (cnt == 1L) ? "isn't" : "aren't"); --- 740,746 ---- (cnt > 1L) ? "some" : "an"; You("hit %s with %s egg%s.", mon_nam(mon), eggp, plur(cnt)); ! if (touch_petrifies(mdat) && !stale_egg(obj)) { pline_The("egg%s %s alive any more...", plur(cnt), (cnt == 1L) ? "isn't" : "aren't"); *************** *** 728,736 **** } case CLOVE_OF_GARLIC: /* no effect against demons */ if (is_undead(mdat)) { ! mon->mflee = 1; ! mon->mfleetim += d(2,4); ! pline("%s turns to flee!", Monnam(mon)); } tmp = 1; break; --- 763,769 ---- } case CLOVE_OF_GARLIC: /* no effect against demons */ if (is_undead(mdat)) { ! monflee(mon, d(2, 4), FALSE, TRUE); } tmp = 1; break; *************** *** 835,842 **** } if (obj && !rn2(nopoison)) { obj->opoisoned = FALSE; ! Your("%s%s no longer poisoned.", xname(obj), ! (obj->quan == 1L) ? " is" : "s are"); /**FIXME**/ } if (resists_poison(mon)) needpoismsg = TRUE; --- 868,875 ---- } if (obj && !rn2(nopoison)) { obj->opoisoned = FALSE; ! Your("%s %s no longer poisoned.", xname(obj), ! otense(obj, "are")); } if (resists_poison(mon)) needpoismsg = TRUE; *************** *** 859,887 **** } } /* VERY small chance of stunning opponent if unarmed. */ if (tmp > 1 && !thrown && !obj && !uwep && !uarm && !uarms && !Upolyd) { if (rnd(100) < P_SKILL(P_BARE_HANDED_COMBAT) && !bigmonst(mdat) && !thick_skinned(mdat)) { if (canspotmon(mon)) ! pline("%s staggers from your powerful strike!", ! Monnam(mon)); ! mon->mstun = 1; hittxt = TRUE; - if (mon->mcanmove && mon != u.ustuck) { - xchar mdx, mdy; - - /* see if the monster has a place to move into */ - mdx = mon->mx + u.dx; - mdy = mon->my + u.dy; - if (goodpos(mdx, mdy, mon)) { - remove_monster(mon->mx, mon->my); - newsym(mon->mx, mon->my); - place_monster(mon, mdx, mdy); - newsym(mon->mx, mon->my); - set_apparxy(mon); - } - } } } --- 892,915 ---- } } + #ifdef STEED + if (jousting) { + You("joust %s%s", + mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); + mhurtle(mon, u.dx, u.dy, 1); + hittxt = TRUE; + } else + #endif + /* VERY small chance of stunning opponent if unarmed. */ if (tmp > 1 && !thrown && !obj && !uwep && !uarm && !uarms && !Upolyd) { if (rnd(100) < P_SKILL(P_BARE_HANDED_COMBAT) && !bigmonst(mdat) && !thick_skinned(mdat)) { if (canspotmon(mon)) ! pline("%s %s from your powerful strike!", Monnam(mon), ! makeplural(stagger(mon->data, "stagger"))); ! mhurtle(mon, u.dx, u.dy, 1); hittxt = TRUE; } } *************** *** 889,900 **** if(mon->mhp < 1) destroyed = TRUE; if (mon->mtame && (!mon->mflee || mon->mfleetim) && tmp > 0) { - unsigned fleetim; - abuse_dog(mon); ! mon->mflee = TRUE; /* Rick Richardson */ ! fleetim = mon->mfleetim + (unsigned)(10 * rnd(tmp)); ! mon->mfleetim = min(fleetim,127); } if((mdat == &mons[PM_BLACK_PUDDING] || mdat == &mons[PM_BROWN_PUDDING]) && obj && obj == uwep --- 917,924 ---- if(mon->mhp < 1) destroyed = TRUE; if (mon->mtame && (!mon->mflee || mon->mfleetim) && tmp > 0) { abuse_dog(mon); ! monflee(mon, 10 * rnd(tmp), FALSE, FALSE); } if((mdat == &mons[PM_BLACK_PUDDING] || mdat == &mons[PM_BROWN_PUDDING]) && obj && obj == uwep *************** *** 907,917 **** } } ! if(!hittxt && !destroyed) { ! if(thrown) ! /* thrown => obj exists */ ! hit(xname(obj), mon, exclam(tmp) ); ! else if(!flags.verbose) You("hit it."); else You("%s %s%s", Role_if(PM_BARBARIAN) ? "smite" : "hit", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); } --- 931,940 ---- } } ! if (!hittxt && /*( thrown => obj exists )*/ ! (!destroyed || (thrown && m_shot.n > 1 && m_shot.o == obj->otyp))) { ! if (thrown) hit(mshot_xname(obj), mon, exclam(tmp)); ! else if (!flags.verbose) You("hit it."); else You("%s %s%s", Role_if(PM_BARBARIAN) ? "smite" : "hit", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); } *************** *** 991,997 **** /* avoid "slippery slippery cloak" for undiscovered oilskin cloak */ (obj->greased || objects[obj->otyp].oc_name_known) ? ! xname(obj) : "cloak"); if (obj->greased && !rn2(2)) { pline_The("grease wears off."); --- 1014,1020 ---- /* avoid "slippery slippery cloak" for undiscovered oilskin cloak */ (obj->greased || objects[obj->otyp].oc_name_known) ? ! xname(obj) : cloak_simple_name(obj)); if (obj->greased && !rn2(2)) { pline_The("grease wears off."); *************** *** 1013,1023 **** STATIC_OVL void demonpet() { struct permonst *pm; struct monst *dtmp; pline("Some hell-p has arrived!"); ! pm = !rn2(6) ? &mons[ndemon(u.ualign.type)] : youmonst.data; if ((dtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS)) != 0) (void)tamedog(dtmp, (struct obj *)0); exercise(A_WIS, TRUE); --- 1036,1048 ---- STATIC_OVL void demonpet() { + int i; struct permonst *pm; struct monst *dtmp; pline("Some hell-p has arrived!"); ! i = !rn2(6) ? ndemon(u.ualign.type) : NON_PM; ! pm = i != NON_PM ? &mons[i] : youmonst.data; if ((dtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS)) != 0) (void)tamedog(dtmp, (struct obj *)0); exercise(A_WIS, TRUE); *************** *** 1069,1076 **** mon_nam(mdef)); else You("seduce %s and %s starts to take off %s clothes.", ! mon_nam(mdef), he[pronoun_gender(mdef)], ! his[pronoun_gender(mdef)]); } while ((otmp = mdef->minvent) != 0) { --- 1094,1100 ---- mon_nam(mdef)); else You("seduce %s and %s starts to take off %s clothes.", ! mon_nam(mdef), mhe(mdef), mhis(mdef)); } while ((otmp = mdef->minvent) != 0) { *************** *** 1078,1089 **** obj_extract_self(otmp); if ((unwornmask = otmp->owornmask) != 0L) { mdef->misc_worn_check &= ~unwornmask; otmp->owornmask = 0L; update_mon_intrinsics(mdef, otmp, FALSE); if (otmp == stealoid) /* special message for final item */ pline("%s finishes taking off %s suit.", ! Monnam(mdef), his[pronoun_gender(mdef)]); } /* give the object to the character */ otmp = hold_another_object(otmp, "You steal %s.", --- 1102,1115 ---- obj_extract_self(otmp); if ((unwornmask = otmp->owornmask) != 0L) { mdef->misc_worn_check &= ~unwornmask; + if (otmp->owornmask & W_WEP) + setmnotwielded(mdef,otmp); otmp->owornmask = 0L; update_mon_intrinsics(mdef, otmp, FALSE); if (otmp == stealoid) /* special message for final item */ pline("%s finishes taking off %s suit.", ! Monnam(mdef), mhis(mdef)); } /* give the object to the character */ otmp = hold_another_object(otmp, "You steal %s.", *************** *** 1126,1132 **** switch(mattk->adtyp) { case AD_STUN: if(!Blind) ! pline("%s staggers for a moment.", Monnam(mdef)); mdef->mstun = 1; /* fall through to next case */ case AD_WERE: /* no effect on monsters */ --- 1152,1159 ---- switch(mattk->adtyp) { case AD_STUN: if(!Blind) ! pline("%s %s for a moment.", Monnam(mdef), ! makeplural(stagger(mdef->data, "stagger"))); mdef->mstun = 1; /* fall through to next case */ case AD_WERE: /* no effect on monsters */ *************** *** 1149,1154 **** --- 1176,1182 ---- case AD_FIRE: if (!Blind) pline("%s is %s!", Monnam(mdef), + mdef->data == &mons[PM_WATER_ELEMENTAL] ? "boiling" : mattk->aatyp == AT_HUGS ? "being roasted" : "on fire"); if (pd == &mons[PM_STRAW_GOLEM] || *************** *** 1210,1220 **** --- 1238,1266 ---- tmp = 0; break; case AD_SGLD: + #ifndef GOLDOBJ if (mdef->mgold) { u.ugold += mdef->mgold; mdef->mgold = 0; Your("purse feels heavier."); } + #else + /* This you as a leprechaun, so steal + real gold only, no lesser coins */ + { + struct obj *mongold = findgold(mdef->minvent); + if (mongold) { + obj_extract_self(mongold); + if (merge_choice(invent, mongold) || inv_cnt() < 52) { + addinv(mongold); + Your("purse feels heavier."); + } else { + You("grab %s's gold, but find no room in your knapsack.", mon_nam(mdef)); + dropy(mongold); + } + } + } + #endif exercise(A_DEX, TRUE); tmp = 0; break; *************** *** 1277,1284 **** hurtmarmor(mdef, AD_RUST); tmp = 0; break; ! case AD_CORRODE: ! hurtmarmor(mdef, AD_CORRODE); tmp = 0; break; case AD_DCAY: --- 1323,1330 ---- hurtmarmor(mdef, AD_RUST); tmp = 0; break; ! case AD_CORR: ! hurtmarmor(mdef, AD_CORR); tmp = 0; break; case AD_DCAY: *************** *** 1310,1327 **** if (notonhead || !has_head(mdef->data)) { pline("%s doesn't seem harmed.", Monnam(mdef)); tmp = 0; break; } if (m_slips_free(mdef, mattk)) break; if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) { pline("%s helmet blocks your attack to %s head.", ! s_suffix(Monnam(mdef)), his[pronoun_gender(mdef)]); break; } You("eat %s brain!", s_suffix(mon_nam(mdef))); u.uconduct.food++; if (!vegan(mdef->data)) u.uconduct.unvegan++; if (!vegetarian(mdef->data)) --- 1356,1384 ---- if (notonhead || !has_head(mdef->data)) { pline("%s doesn't seem harmed.", Monnam(mdef)); tmp = 0; + if (!Unchanging && mdef->data == &mons[PM_GREEN_SLIME]) { + if (!Slimed) { + You("suck in some slime and don't feel very well."); + Slimed = 10L; + } + } break; } if (m_slips_free(mdef, mattk)) break; if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) { pline("%s helmet blocks your attack to %s head.", ! s_suffix(Monnam(mdef)), mhis(mdef)); break; } You("eat %s brain!", s_suffix(mon_nam(mdef))); u.uconduct.food++; + if (touch_petrifies(mdef->data) && !Stone_resistance && !Stoned) { + Stoned = 5; + killer_format = KILLED_BY_AN; + delayed_killer = mdef->data->mname; + } if (!vegan(mdef->data)) u.uconduct.unvegan++; if (!vegetarian(mdef->data)) *************** *** 1387,1395 **** case AD_SLIM: if (!rn2(4) && mdef->data != &mons[PM_FIRE_VORTEX] && mdef->data != &mons[PM_FIRE_ELEMENTAL] && mdef->data != &mons[PM_GREEN_SLIME]) { You("turn %s into slime.", mon_nam(mdef)); ! (void) newcham(mdef, &mons[PM_GREEN_SLIME]); tmp = 0; } break; --- 1444,1453 ---- case AD_SLIM: if (!rn2(4) && mdef->data != &mons[PM_FIRE_VORTEX] && mdef->data != &mons[PM_FIRE_ELEMENTAL] && + mdef->data != &mons[PM_SALAMANDER] && mdef->data != &mons[PM_GREEN_SLIME]) { You("turn %s into slime.", mon_nam(mdef)); ! (void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE); tmp = 0; } break; *************** *** 1515,1521 **** for (otmp = mdef->minvent; otmp; otmp = otmp->nobj) (void) snuff_lit(otmp); ! if(!touch_petrifies(mdef->data) || Stone_resistance) { #ifdef LINT /* static char msgbuf[BUFSZ]; */ char msgbuf[BUFSZ]; #else --- 1573,1580 ---- for (otmp = mdef->minvent; otmp; otmp = otmp->nobj) (void) snuff_lit(otmp); ! if((!touch_petrifies(mdef->data) || Stone_resistance) && ! (Unchanging || mdef->data != &mons[PM_GREEN_SLIME])) { #ifdef LINT /* static char msgbuf[BUFSZ]; */ char msgbuf[BUFSZ]; #else *************** *** 1554,1565 **** newuhs(FALSE); xkilled(mdef,2); if (mdef->mhp > 0) { /* monster lifesaved */ ! You("hurriedly regurgitate the sizzling in your stomach."); } else { ! u.uhunger += mdef->data->cnutrit; Sprintf(msgbuf, "You totally digest %s.", mon_nam(mdef)); ! if ((tmp = 3 + (mdef->data->cwt >> 6)) != 0) { /* setting afternmv = end_engulf is tempting, * but will cause problems if the player is * attacked (which uses his real location) or --- 1613,1631 ---- newuhs(FALSE); xkilled(mdef,2); if (mdef->mhp > 0) { /* monster lifesaved */ ! You("hurriedly regurgitate the sizzling in your %s.", ! body_part(STOMACH)); } else { ! tmp = 1 + (mdef->data->cwt >> 8); ! if (corpse_chance(mdef, &youmonst, TRUE) && ! !(mvitals[monsndx(mdef->data)].mvflags & ! G_NOCORPSE)) { ! /* nutrition only if there can be a corpse */ ! u.uhunger += (mdef->data->cnutrit+1) / 2; ! } else tmp = 0; Sprintf(msgbuf, "You totally digest %s.", mon_nam(mdef)); ! if (tmp != 0) { /* setting afternmv = end_engulf is tempting, * but will cause problems if the player is * attacked (which uses his real location) or *************** *** 1669,1675 **** register struct monst *mon; register int tmp; { ! register struct attack *mattk; int i, sum[NATTK], hittmp = 0; int nsum = 0; int dhit = 0; --- 1735,1741 ---- register struct monst *mon; register int tmp; { ! struct attack *mattk, alt_attk; int i, sum[NATTK], hittmp = 0; int nsum = 0; int dhit = 0; *************** *** 1677,1683 **** for(i = 0; i < NATTK; i++) { sum[i] = 0; ! mattk = &(youmonst.data->mattk[i]); switch(mattk->aatyp) { case AT_WEAP: use_weapon: --- 1743,1749 ---- for(i = 0; i < NATTK; i++) { sum[i] = 0; ! mattk = getmattk(youmonst.data, i, sum, &alt_attk); switch(mattk->aatyp) { case AT_WEAP: use_weapon: *************** *** 1702,1708 **** if (!known_hitum(mon,&dhit,mattk)) { sum[i] = 2; break; ! } else sum[i] = 1; /* might be a worm that gets cut in half */ if (m_at(u.ux+u.dx, u.uy+u.dy) != mon) return((boolean)(nsum != 0)); /* Do not print "You hit" message, since known_hitum --- 1768,1774 ---- if (!known_hitum(mon,&dhit,mattk)) { sum[i] = 2; break; ! } else sum[i] = dhit; /* might be a worm that gets cut in half */ if (m_at(u.ux+u.dx, u.uy+u.dy) != mon) return((boolean)(nsum != 0)); /* Do not print "You hit" message, since known_hitum *************** *** 1804,1811 **** if (mon->data == &mons[PM_SHADE]) Your("attempt to surround %s is harmless.", mon_nam(mon)); ! else sum[i]= gulpum(mon,mattk); } else missum(mon, mattk); break; --- 1870,1887 ---- if (mon->data == &mons[PM_SHADE]) Your("attempt to surround %s is harmless.", mon_nam(mon)); ! else { sum[i]= gulpum(mon,mattk); + if (sum[i] == 2 && + (mon->data->mlet == S_ZOMBIE || + mon->data->mlet == S_MUMMY) && + rn2(5) && + !Sick_resistance) { + You_feel("%ssick.", + (Sick) ? "very " : ""); + mdamageu(mon, rnd(8)); + } + } } else missum(mon, mattk); break; *************** *** 1889,1900 **** mdamageu(mon, tmp); if(!rn2(30)) erode_armor(&youmonst, TRUE); } ! if(mhit && !rn2(6)) { if (aatyp == AT_KICK) { ! if (uarmf) ! (void) rust_dmg(uarmf, xname(uarmf), 3, TRUE, &youmonst); ! } else if (aatyp == AT_WEAP || aatyp == AT_CLAW || aatyp == AT_MAGC || aatyp == AT_TUCH) ! erode_weapon(uwep, TRUE); } exercise(A_STR, FALSE); break; --- 1965,1977 ---- mdamageu(mon, tmp); if(!rn2(30)) erode_armor(&youmonst, TRUE); } ! if (mhit) { if (aatyp == AT_KICK) { ! if (uarmf && !rn2(6)) ! (void)rust_dmg(uarmf, xname(uarmf), 3, TRUE, &youmonst); ! } else if (aatyp == AT_WEAP || aatyp == AT_CLAW || ! aatyp == AT_MAGC || aatyp == AT_TUCH) ! passive_obj(mon, (struct obj*)0, &(ptr->mattk[i])); } exercise(A_STR, FALSE); break; *************** *** 1918,1939 **** break; case AD_RUST: if(mhit && !mon->mcan) { ! if (aatyp == AT_KICK) { ! if (uarmf) ! (void) rust_dmg(uarmf, xname(uarmf), 1, TRUE, &youmonst); ! } else if (aatyp == AT_WEAP || aatyp == AT_CLAW || ! aatyp == AT_MAGC || aatyp == AT_TUCH) ! erode_weapon(uwep, FALSE); } break; ! case AD_CORRODE: if(mhit && !mon->mcan) { ! if (aatyp == AT_KICK) { ! if (uarmf) ! (void) rust_dmg(uarmf, xname(uarmf), 3, TRUE, &youmonst); ! } else if (aatyp == AT_WEAP || aatyp == AT_CLAW || ! aatyp == AT_MAGC || aatyp == AT_TUCH) ! erode_weapon(uwep, TRUE); } break; case AD_MAGM: --- 1995,2016 ---- break; case AD_RUST: if(mhit && !mon->mcan) { ! if (aatyp == AT_KICK) { ! if (uarmf) ! (void)rust_dmg(uarmf, xname(uarmf), 1, TRUE, &youmonst); ! } else if (aatyp == AT_WEAP || aatyp == AT_CLAW || ! aatyp == AT_MAGC || aatyp == AT_TUCH) ! passive_obj(mon, (struct obj*)0, &(ptr->mattk[i])); } break; ! case AD_CORR: if(mhit && !mon->mcan) { ! if (aatyp == AT_KICK) { ! if (uarmf) ! (void)rust_dmg(uarmf, xname(uarmf), 3, TRUE, &youmonst); ! } else if (aatyp == AT_WEAP || aatyp == AT_CLAW || ! aatyp == AT_MAGC || aatyp == AT_TUCH) ! passive_obj(mon, (struct obj*)0, &(ptr->mattk[i])); } break; case AD_MAGM: *************** *** 1947,1963 **** } break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ ! { ! struct obj *obj = (aatyp == AT_KICK) ? uarmf : ! uwep ? uwep : uarmg; ! ! if (mhit && !mon->mcan && obj) { ! if (drain_item(obj) && (obj->known || ! obj->oclass == ARMOR_CLASS)) ! Your("%s less effective.", aobjnam(obj, "seem")); ! } ! break; } default: break; } --- 2024,2039 ---- } break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ ! if (mhit) { ! struct obj *obj = (struct obj *)0; ! ! if (aatyp == AT_KICK) { ! obj = uarmf; ! if (!obj) break; ! } ! passive_obj(mon, obj, &(ptr->mattk[i])); } + break; default: break; } *************** *** 1994,1999 **** --- 2070,2076 ---- You("momentarily stiffen."); } else { /* gelatinous cube */ You("are frozen by %s!", mon_nam(mon)); + nomovemsg = 0; /* default: "you can move again" */ nomul(-tmp); exercise(A_DEX, FALSE); } *************** *** 2049,2054 **** --- 2126,2193 ---- return(malive | mhit); } + /* + * Special (passive) attacks on an attacking object by monsters done here. + * Assumes the attack was successful. + */ + void + passive_obj(mon, obj, mattk) + register struct monst *mon; + register struct obj *obj; /* null means pick uwep, uswapwep or uarmg */ + struct attack *mattk; /* null means we find one internally */ + { + register struct permonst *ptr = mon->data; + register int i; + + /* if caller hasn't specified an object, use uwep, uswapwep or uarmg */ + if (!obj) { + obj = (u.twoweap && uswapwep && !rn2(2)) ? uswapwep : uwep; + if (!obj && mattk->adtyp == AD_ENCH) + obj = uarmg; /* no weapon? then must be gloves */ + if (!obj) return; /* no object to affect */ + } + + /* if caller hasn't specified an attack, find one */ + if (!mattk) { + for(i = 0; ; i++) { + if(i >= NATTK) return; /* no passive attacks */ + if(ptr->mattk[i].aatyp == AT_NONE) break; /* try this one */ + } + mattk = &(ptr->mattk[i]); + } + + switch(mattk->adtyp) { + + case AD_ACID: + if(!rn2(6)) { + erode_obj(obj, TRUE, FALSE); + } + break; + case AD_RUST: + if(!mon->mcan) { + erode_obj(obj, FALSE, FALSE); + } + break; + case AD_CORR: + if(!mon->mcan) { + erode_obj(obj, TRUE, FALSE); + } + break; + case AD_ENCH: + if (!mon->mcan) { + if (drain_item(obj) && carried(obj) && + (obj->known || obj->oclass == ARMOR_CLASS)) { + Your("%s less effective.", aobjnam(obj, "seem")); + } + break; + } + default: + break; + } + + if (carried(obj)) update_inventory(); + } + /* Note: caller must ascertain mtmp is mimicking... */ void stumble_onto_mimic(mtmp) *************** *** 2149,2156 **** if (mtmp->mhp > 0) { if (!flags.mon_moving) setmangry(mtmp); if (tmp < 9 && !mtmp->isshk && rn2(4)) { ! mtmp->mflee = 1; ! if (rn2(4)) mtmp->mfleetim = rnd(100); } mtmp->mcansee = 0; mtmp->mblinded = (tmp < 3) ? 0 : rnd(1 + 50/tmp); --- 2288,2297 ---- if (mtmp->mhp > 0) { if (!flags.mon_moving) setmangry(mtmp); if (tmp < 9 && !mtmp->isshk && rn2(4)) { ! if (rn2(4)) ! monflee(mtmp, rnd(100), FALSE, TRUE); ! else ! monflee(mtmp, 0, FALSE, TRUE); } mtmp->mcansee = 0; mtmp->mblinded = (tmp < 3) ? 0 : rnd(1 + 50/tmp); *** nethack-3.3.1/src/u_init.c Thu Feb 14 07:59:30 2002 --- nethack-3.4.0/src/u_init.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)u_init.c 3.3 2000/06/11 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)u_init.c 3.4 2002/03/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,21 **** Bitfield(trbless,2); }; ! static void FDECL(ini_inv, (struct trobj *)); ! static void FDECL(knows_object,(int)); ! static void FDECL(knows_class,(CHAR_P)); ! static boolean FDECL(restricted_spell_discipline, (int)); #define UNDEF_TYP 0 #define UNDEF_SPE '\177' --- 12,21 ---- Bitfield(trbless,2); }; ! STATIC_DCL void FDECL(ini_inv, (struct trobj *)); ! STATIC_DCL void FDECL(knows_object,(int)); ! STATIC_DCL void FDECL(knows_class,(CHAR_P)); ! STATIC_DCL boolean FDECL(restricted_spell_discipline, (int)); #define UNDEF_TYP 0 #define UNDEF_SPE '\177' *************** *** 33,38 **** --- 33,39 ---- { FOOD_RATION, 0, FOOD_CLASS, 3, 0 }, { PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS }, { TINNING_KIT, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS }, + { TOUCHSTONE, 0, GEM_CLASS, 1, 0 }, { SACK, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; *************** *** 69,76 **** { 0, 0, 0, 0, 0 } }; static struct trobj Knight[] = { ! { LONG_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, ! { SPEAR, 2, WEAPON_CLASS, 1, UNDEF_BLESS }, { RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, --- 70,77 ---- { 0, 0, 0, 0, 0 } }; static struct trobj Knight[] = { ! { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, ! { LANCE, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, *************** *** 80,86 **** { 0, 0, 0, 0, 0 } }; static struct trobj Monk[] = { ! #define M_BOOK 2 { LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS }, { ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, --- 81,87 ---- { 0, 0, 0, 0, 0 } }; static struct trobj Monk[] = { ! #define M_BOOK 2 { LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS }, { ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, *************** *** 212,217 **** --- 213,224 ---- { WAN_WISHING, 3, WAND_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; + #ifdef GOLDOBJ + static struct trobj Money[] = { + { GOLD_PIECE, 0 , GOLD_CLASS, 1, 0 }, + { 0, 0, 0, 0, 0 } + }; + #endif /* race-based substitutions for initial inventory; the weaker cloak for elven rangers is intentional--they shoot better */ *************** *** 269,275 **** { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED }, { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED }, ! { P_FLAIL, P_BASIC }, { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_SKILLED }, { P_TRIDENT, P_SKILLED }, { P_BOW, P_BASIC }, { P_ATTACK_SPELL, P_SKILLED }, --- 276,282 ---- { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED }, { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED }, ! { P_FLAIL, P_BASIC }, { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_BASIC }, { P_SPEAR, P_SKILLED }, { P_TRIDENT, P_SKILLED }, { P_BOW, P_BASIC }, { P_ATTACK_SPELL, P_SKILLED }, *************** *** 382,396 **** static struct def_skill Skill_Ran[] = { { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, ! { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, ! { P_SHORT_SWORD, P_BASIC }, { P_MORNING_STAR, P_BASIC }, ! { P_FLAIL, P_SKILLED }, { P_HAMMER, P_BASIC }, { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED }, ! { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_EXPERT }, ! { P_TRIDENT, P_BASIC }, { P_BOW, P_EXPERT }, ! { P_SLING, P_EXPERT }, { P_CROSSBOW, P_EXPERT }, ! { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED }, ! { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_BASIC }, { P_HEALING_SPELL, P_BASIC }, { P_DIVINATION_SPELL, P_EXPERT }, { P_ESCAPE_SPELL, P_BASIC }, --- 389,403 ---- static struct def_skill Skill_Ran[] = { { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, ! { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, ! { P_SHORT_SWORD, P_BASIC }, { P_MORNING_STAR, P_BASIC }, ! { P_FLAIL, P_SKILLED }, { P_HAMMER, P_BASIC }, { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED }, ! { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_EXPERT }, ! { P_TRIDENT, P_BASIC }, { P_BOW, P_EXPERT }, ! { P_SLING, P_EXPERT }, { P_CROSSBOW, P_EXPERT }, ! { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED }, ! { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_BASIC }, { P_HEALING_SPELL, P_BASIC }, { P_DIVINATION_SPELL, P_EXPERT }, { P_ESCAPE_SPELL, P_BASIC }, *************** *** 485,491 **** }; ! static void knows_object(obj) register int obj; { --- 492,498 ---- }; ! STATIC_OVL void knows_object(obj) register int obj; { *************** *** 496,502 **** /* Know ordinary (non-magical) objects of a certain class, * like all gems except the loadstone and luckstone. */ ! static void knows_class(sym) register char sym; { --- 503,509 ---- /* Know ordinary (non-magical) objects of a certain class, * like all gems except the loadstone and luckstone. */ ! STATIC_OVL void knows_class(sym) register char sym; { *************** *** 601,608 **** if(!rn2(10)) ini_inv(Tinopener); else if(!rn2(4)) ini_inv(Lamp); else if(!rn2(10)) ini_inv(Magicmarker); - knows_class(GEM_CLASS); knows_object(SACK); skill_init(Skill_A); break; case PM_BARBARIAN: --- 608,615 ---- if(!rn2(10)) ini_inv(Tinopener); else if(!rn2(4)) ini_inv(Lamp); else if(!rn2(10)) ini_inv(Magicmarker); knows_object(SACK); + knows_object(TOUCHSTONE); skill_init(Skill_A); break; case PM_BARBARIAN: *************** *** 622,628 **** --- 629,639 ---- skill_init(Skill_C); break; case PM_HEALER: + #ifndef GOLDOBJ u.ugold = u.ugold0 = rn1(1000, 1001); + #else + u.umoney0 = rn1(1000, 1001); + #endif ini_inv(Healer); if(!rn2(25)) ini_inv(Lamp); knows_object(POT_FULL_HEALING); *************** *** 664,701 **** */ break; case PM_RANGER: - #if 0 /* superseded by inv_subs[] */ - switch (rn2(100) / 20) { - case 0: /* Special racial bow */ - case 1: - case 2: - switch (Race_switch) { - case PM_ELF: - Ranger[RAN_BOW].trotyp = ELVEN_BOW; - Ranger[RAN_TWO_ARROWS].trotyp = - Ranger[RAN_ZERO_ARROWS].trotyp = ELVEN_ARROW; - break; - case PM_GNOME: - Ranger[RAN_BOW].trotyp = CROSSBOW; - Ranger[RAN_TWO_ARROWS].trotyp = - Ranger[RAN_ZERO_ARROWS].trotyp = CROSSBOW_BOLT; - break; - case PM_ORC: - Ranger[RAN_BOW].trotyp = ORCISH_BOW; - Ranger[RAN_TWO_ARROWS].trotyp = - Ranger[RAN_ZERO_ARROWS].trotyp = ORCISH_ARROW; - break; - default: break; /* Use default bow + arrow */ - } - break; - case 3: /* Missiles */ - Ranger[RAN_BOW].trotyp = BOOMERANG; - Ranger[RAN_TWO_ARROWS].trotyp = - Ranger[RAN_ZERO_ARROWS].trotyp = DART; - break; - default: break; /* Use default bow + arrow */ - } - #endif /*0*/ Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50); Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30); ini_inv(Ranger); --- 675,680 ---- *************** *** 703,709 **** --- 682,692 ---- break; case PM_ROGUE: Rogue[R_DAGGERS].trquan = rn1(10, 6); + #ifndef GOLDOBJ u.ugold = u.ugold0 = 0; + #else + u.umoney0 = 0; + #endif ini_inv(Rogue); if(!rn2(5)) ini_inv(Blindfold); knows_object(SACK); *************** *** 720,726 **** --- 703,713 ---- #ifdef TOURIST case PM_TOURIST: Tourist[T_DARTS].trquan = rn1(20, 21); + #ifndef GOLDOBJ u.ugold = u.ugold0 = rnd(1000); + #else + u.umoney0 = rnd(1000); + #endif ini_inv(Tourist); if(!rn2(25)) ini_inv(Tinopener); else if(!rn2(25)) ini_inv(Leash); *************** *** 730,736 **** break; #endif case PM_VALKYRIE: - flags.female = TRUE; ini_inv(Valkyrie); if(!rn2(6)) ini_inv(Lamp); knows_class(WEAPON_CLASS); --- 717,722 ---- *************** *** 819,829 **** default: /* impossible */ break; } ! if (discover) ini_inv(Wishing); u.ugold0 += hidden_gold(); /* in case sack has gold in it */ find_ac(); /* get initial ac value */ init_attr(75); /* init attribute values */ --- 805,825 ---- default: /* impossible */ break; } ! if (discover) ini_inv(Wishing); + #ifdef WIZARD + if (wizard) + read_wizkit(); + #endif + + #ifndef GOLDOBJ u.ugold0 += hidden_gold(); /* in case sack has gold in it */ + #else + if (u.umoney0) ini_inv(Money); + u.umoney0 += hidden_gold(); /* in case sack has gold in it */ + #endif find_ac(); /* get initial ac value */ init_attr(75); /* init attribute values */ *************** *** 850,856 **** } /* skills aren't initialized, so we use the role-specific skill lists */ ! static boolean restricted_spell_discipline(otyp) int otyp; { --- 846,852 ---- } /* skills aren't initialized, so we use the role-specific skill lists */ ! STATIC_OVL boolean restricted_spell_discipline(otyp) int otyp; { *************** *** 883,889 **** return TRUE; } ! static void ini_inv(trop) register struct trobj *trop; { --- 879,885 ---- return TRUE; } ! STATIC_OVL void ini_inv(trop) register struct trobj *trop; { *************** *** 933,939 **** || otyp == POT_ACID || otyp == SCR_AMNESIA || otyp == SCR_FIRE - || otyp == SCR_STINKING_CLOUD || otyp == SCR_BLANK_PAPER || otyp == SPE_BLANK_PAPER || otyp == RIN_AGGRAVATE_MONSTER --- 929,934 ---- *************** *** 984,1003 **** nocreate4 = otyp; } ! obj->dknown = obj->bknown = obj->rknown = 1; ! if (objects[otyp].oc_uses_known) obj->known = 1; ! obj->cursed = 0; ! if (obj->opoisoned && u.ualign.type != A_CHAOTIC) ! obj->opoisoned = 0; ! if(obj->oclass == WEAPON_CLASS || obj->oclass == TOOL_CLASS) { ! obj->quan = (long) trop->trquan; ! trop->trquan = 1; } ! if(trop->trspe != UNDEF_SPE) ! obj->spe = trop->trspe; ! if(trop->trbless != UNDEF_BLESS) ! obj->blessed = trop->trbless; ! /* defined after setting otyp+quan + blessedness */ obj->owt = weight(obj); obj = addinv(obj); --- 979,1010 ---- nocreate4 = otyp; } ! #ifdef GOLDOBJ ! if (trop->trclass == GOLD_CLASS) { ! /* no "blessed" or "identified" money */ ! obj->quan = u.umoney0; ! } else { ! #endif ! obj->dknown = obj->bknown = obj->rknown = 1; ! if (objects[otyp].oc_uses_known) obj->known = 1; ! obj->cursed = 0; ! if (obj->opoisoned && u.ualign.type != A_CHAOTIC) ! obj->opoisoned = 0; ! if (obj->oclass == WEAPON_CLASS || ! obj->oclass == TOOL_CLASS) { ! obj->quan = (long) trop->trquan; ! trop->trquan = 1; ! } else if (obj->oclass == GEM_CLASS && ! is_graystone(obj) && obj->otyp != FLINT) { ! obj->quan = 1L; ! } ! if (trop->trspe != UNDEF_SPE) ! obj->spe = trop->trspe; ! if (trop->trbless != UNDEF_BLESS) ! obj->blessed = trop->trbless; ! #ifdef GOLDOBJ } ! #endif /* defined after setting otyp+quan + blessedness */ obj->owt = weight(obj); obj = addinv(obj); *************** *** 1009,1017 **** discover_object(POT_OIL, TRUE, FALSE); if(obj->oclass == ARMOR_CLASS){ ! if (is_shield(obj) && !uarms) setworn(obj, W_ARMS); ! else if (is_helmet(obj) && !uarmh) setworn(obj, W_ARMH); else if (is_gloves(obj) && !uarmg) setworn(obj, W_ARMG); --- 1016,1025 ---- discover_object(POT_OIL, TRUE, FALSE); if(obj->oclass == ARMOR_CLASS){ ! if (is_shield(obj) && !uarms) { setworn(obj, W_ARMS); ! if (uswapwep) setuswapwep((struct obj *) 0); ! } else if (is_helmet(obj) && !uarmh) setworn(obj, W_ARMH); else if (is_gloves(obj) && !uarmg) setworn(obj, W_ARMG); *** nethack-3.3.1/src/vault.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/vault.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vault.c 3.3 96/06/05 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vault.c 3.4 2001/05/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 7,12 **** --- 7,15 ---- STATIC_DCL struct monst *NDECL(findgd); + #define g_monnam(mtmp) \ + x_monnam(mtmp, ARTICLE_NONE, (char *)0, SUPPRESS_IT, FALSE) + #ifdef OVLB STATIC_DCL boolean FDECL(clear_fcorr, (struct monst *,BOOLEAN_P)); *************** *** 23,28 **** --- 26,33 ---- register int fcx, fcy, fcbeg; register struct monst *mtmp; + if (!on_level(&(EGD(grd)->gdlevel), &u.uz)) return TRUE; + while((fcbeg = EGD(grd)->fcbeg) < EGD(grd)->fcend) { fcx = EGD(grd)->fakecorr[fcbeg].fx; fcy = EGD(grd)->fakecorr[fcbeg].fy; *************** *** 142,148 **** char buf[BUFSZ]; register int x, y, dd, gx, gy; int lx = 0, ly = 0; ! /* first find the goal for the guard */ for(dd = 2; (dd < ROWNO || dd < COLNO); dd++) { for(y = u.uy-dd; y <= u.uy+dd; ly = y, y++) { --- 147,155 ---- char buf[BUFSZ]; register int x, y, dd, gx, gy; int lx = 0, ly = 0; ! #ifdef GOLDOBJ ! long umoney; ! #endif /* first find the goal for the guard */ for(dd = 2; (dd < ROWNO || dd < COLNO); dd++) { for(y = u.uy-dd; y <= u.uy+dd; ly = y, y++) { *************** *** 233,241 **** } reset_faint(); /* if fainted - wake up */ ! pline("Suddenly one of the Vault's guards enters!"); newsym(guard->mx,guard->my); ! if (Strangled || youmonst.data->msound == MS_SILENT) { verbalize("I'll be back when you're ready to speak to me!"); mongone(guard); return; --- 240,256 ---- } reset_faint(); /* if fainted - wake up */ ! pline("Suddenly one of the Vault's %s enters!", ! makeplural(g_monnam(guard))); newsym(guard->mx,guard->my); ! if ((youmonst.m_ap_type == M_AP_OBJECT && ! youmonst.mappearance == GOLD_PIECE) || u.uundetected) { ! /* You're mimicking a pile of gold or you're hidden. */ ! pline("Puzzled, %s turns around and leaves.", mhe(guard)); ! mongone(guard); ! return; ! } ! if (Strangled || is_silent(youmonst.data)) { verbalize("I'll be back when you're ready to speak to me!"); mongone(guard); return; *************** *** 271,276 **** --- 286,292 ---- return; } verbalize("I don't know you."); + #ifndef GOLDOBJ if (!u.ugold && !hidden_gold()) verbalize("Please follow me."); else { *************** *** 279,284 **** --- 295,311 ---- verbalize("Most likely all your gold was stolen from this vault."); verbalize("Please drop that gold and follow me."); } + #else + umoney = money_cnt(invent); + if (!umoney && !hidden_gold()) + verbalize("Please follow me."); + else { + if (!umoney) + verbalize("You have hidden money."); + verbalize("Most likely all your money was stolen from this vault."); + verbalize("Please drop that money and follow me."); + } + #endif EGD(guard)->gdx = gx; EGD(guard)->gdy = gy; EGD(guard)->fcbeg = 0; *************** *** 404,410 **** if(movedgold || fixed) { if(in_fcorridor(grd, grd->mx, grd->my) || cansee(grd->mx, grd->my)) ! pline_The("guard whispers an incantation."); else You_hear("a distant chant."); if(movedgold) pline("A mysterious force moves the gold into the vault."); --- 431,437 ---- if(movedgold || fixed) { if(in_fcorridor(grd, grd->mx, grd->my) || cansee(grd->mx, grd->my)) ! pline_The("%s whispers an incantation.", g_monnam(grd)); else You_hear("a distant chant."); if(movedgold) pline("A mysterious force moves the gold into the vault."); *************** *** 431,438 **** grd_in_vault = *in_rooms(grd->mx, grd->my, VAULT)? TRUE : FALSE; boolean disappear_msg_seen = FALSE, semi_dead = (grd->mhp <= 0); register boolean u_carry_gold = ((u.ugold + hidden_gold()) > 0L); ! if(!on_level(&(egrd->gdlevel), &u.uz)) return(-1); nx = ny = m = n = 0; if(!u_in_vault && !grd_in_vault) --- 458,469 ---- grd_in_vault = *in_rooms(grd->mx, grd->my, VAULT)? TRUE : FALSE; boolean disappear_msg_seen = FALSE, semi_dead = (grd->mhp <= 0); + #ifndef GOLDOBJ register boolean u_carry_gold = ((u.ugold + hidden_gold()) > 0L); ! #else ! long umoney = money_cnt(invent); ! register boolean u_carry_gold = ((umoney + hidden_gold()) > 0L); ! #endif if(!on_level(&(egrd->gdlevel), &u.uz)) return(-1); nx = ny = m = n = 0; if(!u_in_vault && !grd_in_vault) *************** *** 463,471 **** (u_carry_gold || um_dist(grd->mx, grd->my, 1))) { if(egrd->warncnt == 3) verbalize("I repeat, %sfollow me!", ! u_carry_gold ? (!u.ugold ? "drop that hidden gold and " : "drop that gold and ") : ""); if(egrd->warncnt == 7) { m = grd->mx; n = grd->my; --- 494,509 ---- (u_carry_gold || um_dist(grd->mx, grd->my, 1))) { if(egrd->warncnt == 3) verbalize("I repeat, %sfollow me!", ! u_carry_gold ? ( ! #ifndef GOLDOBJ ! !u.ugold ? "drop that hidden gold and " : "drop that gold and ") : ""); + #else + !umoney ? + "drop that hidden money and " : + "drop that money and ") : ""); + #endif if(egrd->warncnt == 7) { m = grd->mx; n = grd->my; *************** *** 490,502 **** newsym(m,n); grd->mpeaceful = 0; letknow: ! if(!cansee(grd->mx, grd->my)) You_hear("the shrill sound of a guard's whistle."); else You(um_dist(grd->mx, grd->my, 2) ? "see an angry %s approaching." : "are confronted by an angry %s.", ! l_monnam(grd)); return(-1); } else { verbalize("Well, begone."); --- 528,540 ---- newsym(m,n); grd->mpeaceful = 0; letknow: ! if (!cansee(grd->mx, grd->my) || !mon_visible(grd)) You_hear("the shrill sound of a guard's whistle."); else You(um_dist(grd->mx, grd->my, 2) ? "see an angry %s approaching." : "are confronted by an angry %s.", ! g_monnam(grd)); return(-1); } else { verbalize("Well, begone."); *************** *** 512,518 **** !egrd->gddone && !in_fcorridor(grd, u.ux, u.uy) && levl[egrd->fakecorr[0].fx][egrd->fakecorr[0].fy].typ == egrd->fakecorr[0].ftyp) { ! pline_The("guard, confused, disappears."); disappear_msg_seen = TRUE; goto cleanup; } --- 550,556 ---- !egrd->gddone && !in_fcorridor(grd, u.ux, u.uy) && levl[egrd->fakecorr[0].fx][egrd->fakecorr[0].fy].typ == egrd->fakecorr[0].ftyp) { ! pline_The("%s, confused, disappears.", g_monnam(grd)); disappear_msg_seen = TRUE; goto cleanup; } *************** *** 547,554 **** --- 585,597 ---- if (m == u.ux && n == u.uy) { struct obj *gold = g_at(m,n); /* Grab the gold from between the hero's feet. */ + #ifndef GOLDOBJ grd->mgold += gold->quan; delobj(gold); + #else + obj_extract_self(gold); + add_to_minv(grd, gold); + #endif newsym(m,n); } else if (m == x && n == y) { mpickgold(grd); /* does a newsym */ *************** *** 687,693 **** if(!semi_dead && (in_fcorridor(grd, u.ux, u.uy) || cansee(x, y))) { if (!disappear_msg_seen) ! pline("Suddenly, the guard disappears."); return(1); } return(-2); --- 730,736 ---- if(!semi_dead && (in_fcorridor(grd, u.ux, u.uy) || cansee(x, y))) { if (!disappear_msg_seen) ! pline("Suddenly, the %s disappears.", g_monnam(grd)); return(1); } return(-2); *************** *** 706,720 **** paygd() { register struct monst *grd = findgd(); struct obj *gold; int gx,gy; char buf[BUFSZ]; if (!u.ugold || !grd) return; if (u.uinvault) { ! Your("%ld zorkmid%s goes into the Magic Memory Vault.", ! u.ugold, plur(u.ugold)); gx = u.ux; gy = u.uy; } else { --- 749,778 ---- paygd() { register struct monst *grd = findgd(); + #ifndef GOLDOBJ struct obj *gold; + #else + long umoney = money_cnt(invent); + struct obj *coins, *nextcoins; + #endif int gx,gy; char buf[BUFSZ]; + #ifndef GOLDOBJ if (!u.ugold || !grd) return; + #else + if (!umoney || !grd) return; + #endif if (u.uinvault) { ! Your("%ld %s goes into the Magic Memory Vault.", ! #ifndef GOLDOBJ ! u.ugold, ! currency(u.ugold)); ! #else ! umoney, ! currency(umoney)); ! #endif gx = u.ux; gy = u.uy; } else { *************** *** 731,738 **** --- 789,807 ---- plname, mons[u.umonster].mname); make_grave(gx, gy, buf); } + #ifndef GOLDOBJ place_object(gold = mkgoldobj(u.ugold), gx, gy); stackobj(gold); + #else + for (coins = invent; coins; coins = nextcoins) { + nextcoins = coins->nobj; + if (objects[coins->otyp].oc_class == GOLD_CLASS) { + freeinv(coins); + place_object(coins, gx, gy); + stackobj(coins); + } + } + #endif mongone(grd); } *** nethack-3.3.1/src/version.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/version.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)version.c 3.3 1999/12/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)version.c 3.4 1999/12/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 68,74 **** version_data->entity_count != VERSION_SANITY1 || version_data->struct_sizes != VERSION_SANITY2) { if (complain) ! pline("Configuration incompatability for file \"%s\".", filename); return FALSE; } --- 68,74 ---- version_data->entity_count != VERSION_SANITY1 || version_data->struct_sizes != VERSION_SANITY2) { if (complain) ! pline("Configuration incompatibility for file \"%s\".", filename); return FALSE; } *** nethack-3.3.1/src/vision.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/vision.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vision.c 3.3 99/02/18 */ /* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vision.c 3.4 1999/02/18 */ /* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 242,247 **** --- 242,248 ---- } } + iflags.vision_inited = 1; /* vision is ready */ vision_full_recalc = 1; /* we want to run vision_recalc() */ } *************** *** 510,516 **** int oldseenv; /* previous seenv value */ vision_full_recalc = 0; /* reset flag */ ! if (in_mklev) return; #ifdef GCC_WARN row = 0; --- 511,517 ---- int oldseenv; /* previous seenv value */ vision_full_recalc = 0; /* reset flag */ ! if (in_mklev || !iflags.vision_inited) return; #ifdef GCC_WARN row = 0; *************** *** 725,736 **** /* * We see this position because it is lit. */ ! if (IS_DOOR(lev->typ) && !viz_clear[row][col]) { /* ! * Make sure doors, boulders or mimics don't show up * at the end of dark hallways. We do this by checking * the adjacent position. If it is lit, then we can see ! * the door, otherwise we can't. */ dx = u.ux - col; dx = sign(dx); flev = &(levl[col+dx][row+dy]); --- 726,738 ---- /* * We see this position because it is lit. */ ! if ((IS_DOOR(lev->typ) || lev->typ == SDOOR || ! IS_WALL(lev->typ)) && !viz_clear[row][col]) { /* ! * Make sure doors, walls, boulders or mimics don't show up * at the end of dark hallways. We do this by checking * the adjacent position. If it is lit, then we can see ! * the door or wall, otherwise we can't. */ dx = u.ux - col; dx = sign(dx); flev = &(levl[col+dx][row+dy]); *************** *** 793,799 **** colbump[u.ux] = colbump[u.ux+1] = 0; skip: ! newsym(u.ux,u.uy); /* Make sure the hero shows up! */ /* Set the new min and max pointers. */ viz_rmin = next_rmin; --- 795,807 ---- colbump[u.ux] = colbump[u.ux+1] = 0; skip: ! /* This newsym() caused a crash delivering msg about failure to open ! * dungeon file init_dungeons() -> panic() -> done(11) -> ! * vision_recalc(2) -> newsym() -> crash! u.ux and u.uy are 0 and ! * program_state.panicking == 1 under those circumstances ! */ ! if (!program_state.panicking) ! newsym(u.ux, u.uy); /* Make sure the hero shows up! */ /* Set the new min and max pointers. */ viz_rmin = next_rmin; *** nethack-3.3.1/src/weapon.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/weapon.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)weapon.c 3.3 2000/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)weapon.c 3.4 2002/02/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 26,31 **** --- 26,33 ---- #define PN_ESCAPE_SPELL (-13) #define PN_MATTER_SPELL (-14) + STATIC_DCL void FDECL(give_may_advance_msg, (int)); + #ifndef OVLB STATIC_DCL NEARDATA const short skill_names_indices[]; *************** *** 93,98 **** --- 95,102 ---- #endif /* OVLB */ STATIC_DCL boolean FDECL(can_advance, (int, BOOLEAN_P)); + STATIC_DCL boolean FDECL(could_advance, (int)); + STATIC_DCL boolean FDECL(peaked_skill, (int)); STATIC_DCL int FDECL(slots_required, (int)); #ifdef OVL1 *************** *** 181,186 **** --- 185,191 ---- * Second edition AD&D came out a few years later; luckily it used the same * table. As of this writing (1999), third edition is in progress but not * released. Let's see if the weapon table stays the same. --KAA + * October 2000: It didn't. Oh, well. */ /* *************** *** 507,518 **** /* only strong monsters can wield big (esp. long) weapons */ /* big weapon is basically the same as bimanual */ /* all monsters can wield the remaining weapons */ ! for (i = 0; i < SIZE(hwep); i++) if (((strong && !wearing_shield) || !objects[hwep[i]].oc_bimanual) && (objects[hwep[i]].oc_material != SILVER || !hates_silver(mtmp->data))) Oselect(hwep[i]); /* failure */ return (struct obj *)0; --- 512,526 ---- /* only strong monsters can wield big (esp. long) weapons */ /* big weapon is basically the same as bimanual */ /* all monsters can wield the remaining weapons */ ! for (i = 0; i < SIZE(hwep); i++) { ! if (hwep[i] == CORPSE && !(mtmp->misc_worn_check & W_ARMG)) ! continue; if (((strong && !wearing_shield) || !objects[hwep[i]].oc_bimanual) && (objects[hwep[i]].oc_material != SILVER || !hates_silver(mtmp->data))) Oselect(hwep[i]); + } /* failure */ return (struct obj *)0; *************** *** 538,544 **** return; } if (!attacktype(mon->data, AT_WEAP)) { ! mw_tmp->owornmask &= ~W_WEP; MON_NOWEP(mon); mon->weapon_check = NO_WEAPON_WANTED; obj_extract_self(obj); --- 546,552 ---- return; } if (!attacktype(mon->data, AT_WEAP)) { ! setmnotwielded(mon, mw_tmp); MON_NOWEP(mon); mon->weapon_check = NO_WEAPON_WANTED; obj_extract_self(obj); *************** *** 565,571 **** * polymorphed into little monster. But it's not quite clear how to * handle this anyway.... */ ! mon->weapon_check = NEED_WEAPON; } /* Let a monster try to wield a weapon, based on mon->weapon_check. --- 573,580 ---- * polymorphed into little monster. But it's not quite clear how to * handle this anyway.... */ ! if (!(mw_tmp->cursed && mon->weapon_check == NO_WEAPON_WANTED)) ! mon->weapon_check = NEED_WEAPON; } /* Let a monster try to wield a weapon, based on mon->weapon_check. *************** *** 615,622 **** if (bimanual(mw_tmp)) mon_hand = makeplural(mon_hand); Sprintf(welded_buf, "%s welded to %s %s", ! (mw_tmp->quan == 1L) ? "is" : "are", ! his[pronoun_gender(mon)], mon_hand); if (obj->otyp == PICK_AXE) { pline("Since %s weapon%s %s,", --- 624,631 ---- if (bimanual(mw_tmp)) mon_hand = makeplural(mon_hand); Sprintf(welded_buf, "%s welded to %s %s", ! otense(mw_tmp, "are"), ! mhis(mon), mon_hand); if (obj->otyp == PICK_AXE) { pline("Since %s weapon%s %s,", *************** *** 637,654 **** return 1; } mon->mw = obj; /* wield obj */ ! if (mw_tmp) mw_tmp->owornmask &= ~W_WEP; mon->weapon_check = NEED_WEAPON; if (canseemon(mon)) { ! pline("%s wields %s!", Monnam(mon), doname(obj)); ! if (obj->cursed && obj->otyp != CORPSE) { ! pline("%s %s to %s %s!", ! The(xname(obj)), ! (obj->quan == 1L) ? "welds itself" ! : "weld themselves", ! s_suffix(mon_nam(mon)), mbodypart(mon,HAND)); ! obj->bknown = 1; ! } } obj->owornmask = W_WEP; return 1; --- 646,669 ---- return 1; } mon->mw = obj; /* wield obj */ ! setmnotwielded(mon, mw_tmp); mon->weapon_check = NEED_WEAPON; if (canseemon(mon)) { ! pline("%s wields %s!", Monnam(mon), doname(obj)); ! if (obj->cursed && obj->otyp != CORPSE) { ! pline("%s %s to %s %s!", ! Tobjnam(obj, "weld"), ! is_plural(obj) ? "themselves" : "itself", ! s_suffix(mon_nam(mon)), mbodypart(mon,HAND)); ! obj->bknown = 1; ! } ! } ! if (artifact_light(obj) && !obj->lamplit) { ! begin_burn(obj, FALSE); ! if (canseemon(mon)) ! pline("%s brilliantly in %s %s!", ! Tobjnam(obj, "glow"), ! s_suffix(mon_nam(mon)), mbodypart(mon,HAND)); } obj->owornmask = W_WEP; return 1; *************** *** 750,755 **** --- 765,771 ---- } /* return true if this skill can be advanced */ + /*ARGSUSED*/ STATIC_OVL boolean can_advance(skill, speedy) int skill; *************** *** 766,771 **** --- 782,811 ---- && u.weapon_slots >= slots_required(skill))); } + /* return true if this skill could be advanced if more slots were available */ + STATIC_OVL boolean + could_advance(skill) + int skill; + { + return !P_RESTRICTED(skill) + && P_SKILL(skill) < P_MAX_SKILL(skill) && ( + (P_ADVANCE(skill) >= + (unsigned) practice_needed_to_advance(P_SKILL(skill)) + && u.skills_advanced < P_SKILL_LIMIT)); + } + + /* return true if this skill has reached its maximum and there's been enough + practice to become eligible for the next step if that had been possible */ + STATIC_OVL boolean + peaked_skill(skill) + int skill; + { + return !P_RESTRICTED(skill) + && P_SKILL(skill) >= P_MAX_SKILL(skill) && ( + (P_ADVANCE(skill) >= + (unsigned) practice_needed_to_advance(P_SKILL(skill)))); + } + STATIC_OVL void skill_advance(skill) int skill; *************** *** 775,782 **** u.skill_record[u.skills_advanced++] = skill; /* subtly change the advance message to indicate no more advancement */ You("are now %s skilled in %s.", ! P_SKILL(skill) >= P_MAX_SKILL(skill) ? "most" : "more", ! P_NAME(skill)); } static struct skill_range { --- 815,822 ---- u.skill_record[u.skills_advanced++] = skill; /* subtly change the advance message to indicate no more advancement */ You("are now %s skilled in %s.", ! P_SKILL(skill) >= P_MAX_SKILL(skill) ? "most" : "more", ! P_NAME(skill)); } static struct skill_range { *************** *** 799,812 **** int enhance_weapon_skill() { ! int pass, i, n, len, longest, to_advance; ! char buf[BUFSZ], buf2[BUFSZ]; menu_item *selected; anything any; winid win; boolean speedy = FALSE; - #ifdef WIZARD if (wizard && yn("Advance skills without practice?") == 'y') speedy = TRUE; --- 839,853 ---- int enhance_weapon_skill() { ! int pass, i, n, len, longest, ! to_advance, eventually_advance, maxxed_cnt; ! char buf[BUFSZ], sklnambuf[BUFSZ]; ! const char *prefix; menu_item *selected; anything any; winid win; boolean speedy = FALSE; #ifdef WIZARD if (wizard && yn("Advance skills without practice?") == 'y') speedy = TRUE; *************** *** 814,828 **** do { /* find longest available skill name, count those that can advance */ ! for (longest = 0, to_advance = 0, i = 0; i < P_NUM_SKILLS; i++) { ! if (!P_RESTRICTED(i) && (len = strlen(P_NAME(i))) > longest) longest = len; if (can_advance(i, speedy)) to_advance++; } win = create_nhwindow(NHW_MENU); start_menu(win); /* List the skills, making ones that could be advanced selectable. List the miscellaneous skills first. Possible future enhancement: list spell skills before --- 855,898 ---- do { /* find longest available skill name, count those that can advance */ ! to_advance = eventually_advance = maxxed_cnt = 0; ! for (longest = 0, i = 0; i < P_NUM_SKILLS; i++) { ! if (P_RESTRICTED(i)) continue; ! if ((len = strlen(P_NAME(i))) > longest) longest = len; if (can_advance(i, speedy)) to_advance++; + else if (could_advance(i)) eventually_advance++; + else if (peaked_skill(i)) maxxed_cnt++; } win = create_nhwindow(NHW_MENU); start_menu(win); + /* start with a legend if any entries will be annotated + with "*" or "#" below */ + if (eventually_advance > 0 || maxxed_cnt > 0) { + any.a_int = 0; + if (eventually_advance > 0) { + Sprintf(buf, + "(Skill%s flagged by \"*\" may be enhanced %s.)", + plur(eventually_advance), + (u.ulevel < MAXULEV) ? + "when you're more experienced" : + "if skill slots become available"); + add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, + buf, MENU_UNSELECTED); + } + if (maxxed_cnt > 0) { + Sprintf(buf, + "(Skill%s flagged by \"#\" cannot be enhanced any further.)", + plur(maxxed_cnt)); + add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, + buf, MENU_UNSELECTED); + } + add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, + "", MENU_UNSELECTED); + } + /* List the skills, making ones that could be advanced selectable. List the miscellaneous skills first. Possible future enhancement: list spell skills before *************** *** 838,869 **** if (P_RESTRICTED(i)) continue; /* ! * Sigh, this assumes a monospaced font. * The 12 is the longest skill level name. * The " " is room for a selection letter and dash, "a - ". */ ! #ifdef WIZARD ! if (wizard) ! Sprintf(buf2, " %s%-*s %-12s %4d(%4d)", ! to_advance == 0 || can_advance(i, speedy) ? "" : " " , ! longest, P_NAME(i), ! skill_level_name(i, buf), ! P_ADVANCE(i), practice_needed_to_advance(P_SKILL(i))); else #endif ! Sprintf(buf2, " %s %-*s [%s]", ! to_advance == 0 || can_advance(i, speedy) ? "" : " ", ! longest, P_NAME(i), ! skill_level_name(i, buf)); ! any.a_int = can_advance(i, speedy) ? i+1 : 0; ! add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf2, MENU_UNSELECTED); } ! Strcpy(buf, to_advance ? "Pick a skill to advance:" : "Current skills:"); #ifdef WIZARD ! if (wizard && !speedy) Sprintf(eos(buf), " (%d slot%s available)", ! u.weapon_slots, plur(u.weapon_slots)); #endif end_menu(win, buf); n = select_menu(win, to_advance ? PICK_ONE : PICK_NONE, &selected); --- 908,962 ---- if (P_RESTRICTED(i)) continue; /* ! * Sigh, this assumes a monospaced font unless ! * iflags.menu_tab_sep is set in which case it puts ! * tabs between columns. * The 12 is the longest skill level name. * The " " is room for a selection letter and dash, "a - ". */ ! if (can_advance(i, speedy)) ! prefix = ""; /* will be preceded by menu choice */ ! else if (could_advance(i)) ! prefix = " * "; ! else if (peaked_skill(i)) ! prefix = " # "; else + prefix = (to_advance + eventually_advance + + maxxed_cnt > 0) ? " " : ""; + (void) skill_level_name(i, sklnambuf); + #ifdef WIZARD + if (wizard) { + if (!iflags.menu_tab_sep) + Sprintf(buf, " %s%-*s %-12s %5d(%4d)", + prefix, longest, P_NAME(i), sklnambuf, + P_ADVANCE(i), + practice_needed_to_advance(P_SKILL(i))); + else + Sprintf(buf, " %s%s\t%s\t%5d(%4d)", + prefix, P_NAME(i), sklnambuf, + P_ADVANCE(i), + practice_needed_to_advance(P_SKILL(i))); + } else #endif ! { ! if (!iflags.menu_tab_sep) ! Sprintf(buf, " %s %-*s [%s]", ! prefix, longest, P_NAME(i), sklnambuf); ! else ! Sprintf(buf, " %s%s\t[%s]", ! prefix, P_NAME(i), sklnambuf); ! } any.a_int = can_advance(i, speedy) ? i+1 : 0; ! add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, ! buf, MENU_UNSELECTED); } ! Strcpy(buf, (to_advance > 0) ? "Pick a skill to advance:" : ! "Current skills:"); #ifdef WIZARD ! if (wizard && !speedy) ! Sprintf(eos(buf), " (%d slot%s available)", ! u.weapon_slots, plur(u.weapon_slots)); #endif end_menu(win, buf); n = select_menu(win, to_advance ? PICK_ONE : PICK_NONE, &selected); *************** *** 991,1000 **** weapon_hit_bonus(weapon) struct obj *weapon; { ! int type, skill, bonus = 0; static const char bad_skill[] = "weapon_hit_bonus: bad skill %d"; ! type = u.twoweap ? P_TWO_WEAPON_COMBAT : weapon_type(weapon); if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { --- 1084,1096 ---- weapon_hit_bonus(weapon) struct obj *weapon; { ! int type, wep_type, skill, bonus = 0; static const char bad_skill[] = "weapon_hit_bonus: bad skill %d"; ! wep_type = weapon_type(weapon); ! /* use two weapon skill only if attacking with one of the wielded weapons */ ! type = (u.twoweap && (weapon == uwep || weapon == uswapwep)) ? ! P_TWO_WEAPON_COMBAT : wep_type; if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { *************** *** 1008,1016 **** } } else if (type == P_TWO_WEAPON_COMBAT) { skill = P_SKILL(P_TWO_WEAPON_COMBAT); ! if (P_SKILL(weapon->otyp) < skill) skill = P_SKILL(weapon->otyp); switch (skill) { ! default: impossible(bad_skill, P_SKILL(type)); /* fall through */ case P_ISRESTRICTED: case P_UNSKILLED: bonus = -9; break; case P_BASIC: bonus = -7; break; --- 1104,1112 ---- } } else if (type == P_TWO_WEAPON_COMBAT) { skill = P_SKILL(P_TWO_WEAPON_COMBAT); ! if (P_SKILL(wep_type) < skill) skill = P_SKILL(wep_type); switch (skill) { ! default: impossible(bad_skill, skill); /* fall through */ case P_ISRESTRICTED: case P_UNSKILLED: bonus = -9; break; case P_BASIC: bonus = -7; break; *************** *** 1018,1025 **** case P_EXPERT: bonus = -3; break; } } else if (type == P_BARE_HANDED_COMBAT) { ! /* restricted == 0 */ ! bonus = ((P_SKILL(type) + 1) * (martial_bonus() ? 2 : 1)) / 2; } #ifdef STEED --- 1114,1131 ---- case P_EXPERT: bonus = -3; break; } } else if (type == P_BARE_HANDED_COMBAT) { ! /* ! * b.h. m.a. ! * unskl: +1 n/a ! * basic: +1 +3 ! * skild: +2 +4 ! * exprt: +2 +5 ! * mastr: +3 +6 ! * grand: +3 +7 ! */ ! bonus = P_SKILL(type); ! bonus = max(bonus,P_UNSKILLED) - 1; /* unskilled => 0 */ ! bonus = ((bonus + 2) * (martial_bonus() ? 2 : 1)) / 2; } #ifdef STEED *************** *** 1047,1055 **** weapon_dam_bonus(weapon) struct obj *weapon; { ! int type, skill, bonus = 0; ! type = u.twoweap ? P_TWO_WEAPON_COMBAT : weapon_type(weapon); if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { --- 1153,1164 ---- weapon_dam_bonus(weapon) struct obj *weapon; { ! int type, wep_type, skill, bonus = 0; ! wep_type = weapon_type(weapon); ! /* use two weapon skill only if attacking with one of the wielded weapons */ ! type = (u.twoweap && (weapon == uwep || weapon == uswapwep)) ? ! P_TWO_WEAPON_COMBAT : wep_type; if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { *************** *** 1064,1070 **** } } else if (type == P_TWO_WEAPON_COMBAT) { skill = P_SKILL(P_TWO_WEAPON_COMBAT); ! if (P_SKILL(weapon->otyp) < skill) skill = P_SKILL(weapon->otyp); switch (skill) { default: case P_ISRESTRICTED: --- 1173,1179 ---- } } else if (type == P_TWO_WEAPON_COMBAT) { skill = P_SKILL(P_TWO_WEAPON_COMBAT); ! if (P_SKILL(wep_type) < skill) skill = P_SKILL(wep_type); switch (skill) { default: case P_ISRESTRICTED: *************** *** 1074,1080 **** case P_EXPERT: bonus = 1; break; } } else if (type == P_BARE_HANDED_COMBAT) { ! bonus = (P_SKILL(type) * (martial_bonus() ? 3 : 1)) / 2; } #ifdef STEED --- 1183,1200 ---- case P_EXPERT: bonus = 1; break; } } else if (type == P_BARE_HANDED_COMBAT) { ! /* ! * b.h. m.a. ! * unskl: 0 n/a ! * basic: +1 +3 ! * skild: +1 +4 ! * exprt: +2 +6 ! * mastr: +2 +7 ! * grand: +3 +9 ! */ ! bonus = P_SKILL(type); ! bonus = max(bonus,P_UNSKILLED) - 1; /* unskilled => 0 */ ! bonus = ((bonus + 1) * (martial_bonus() ? 3 : 1)) / 2; } #ifdef STEED *************** *** 1163,1168 **** --- 1283,1304 ---- P_ADVANCE(skill) = practice_needed_to_advance(P_SKILL(skill)-1); } } + } + + void + setmnotwielded(mon,obj) + register struct monst *mon; + register struct obj *obj; + { + if (!obj) return; + if (artifact_light(obj) && obj->lamplit) { + end_burn(obj, FALSE); + if (canseemon(mon)) + pline("%s in %s %s %s glowing.", The(xname(obj)), + s_suffix(mon_nam(mon)), mbodypart(mon,HAND), + otense(obj, "stop")); + } + obj->owornmask &= ~W_WEP; } #endif /* OVLB */ *** nethack-3.3.1/src/were.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/were.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)were.c 3.3 97/05/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)were.c 3.4 1997/05/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 82,88 **** /* regenerate by 1/4 of the lost hit points */ mon->mhp += (mon->mhpmax - mon->mhp) / 4; newsym(mon->mx,mon->my); ! mon_break_armor(mon); possibly_unwield(mon); } --- 82,88 ---- /* regenerate by 1/4 of the lost hit points */ mon->mhp += (mon->mhpmax - mon->mhp) / 4; newsym(mon->mx,mon->my); ! mon_break_armor(mon, FALSE); possibly_unwield(mon); } *** nethack-3.3.1/src/wield.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/wield.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wield.c 3.3 2000/06/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wield.c 3.4 2001/12/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 50,56 **** */ ! static int FDECL(ready_weapon, (struct obj *)); /* elven weapons vibrate warningly when enchanted beyond a limit */ #define is_elven_weapon(optr) ((optr)->otyp == ELVEN_ARROW\ --- 50,56 ---- */ ! STATIC_DCL int FDECL(ready_weapon, (struct obj *)); /* elven weapons vibrate warningly when enchanted beyond a limit */ #define is_elven_weapon(optr) ((optr)->otyp == ELVEN_ARROW\ *************** *** 84,94 **** * 5. Emptying the slot, by passing a null object. NEVER pass * zeroobj! * - * Note: setuwep() with a null obj, and uwepgone(), are NOT the same! - * Sometimes unwielding a weapon can kill you, and lifesaving will then - * put it back into your hand. If lifesaving is permitted to do this, - * use setwuep((struct obj *)0); otherwise use uwepgone(). - * * If the item is being moved from another slot, it is the caller's * responsibility to handle that. It's also the caller's responsibility * to print the appropriate messages. --- 84,89 ---- *************** *** 97,104 **** --- 92,108 ---- setuwep(obj) register struct obj *obj; { + struct obj *olduwep = uwep; + if (obj == uwep) return; /* necessary to not set unweapon */ + /* This message isn't printed in the caller because it happens + * *whenever* Sunsword is unwielded, from whatever cause. + */ setworn(obj, W_WEP); + if (uwep == obj && artifact_light(olduwep) && olduwep->lamplit) { + end_burn(olduwep, FALSE); + if (!Blind) pline("%s glowing.", Tobjnam(olduwep, "stop")); + } /* Note: Explicitly wielding a pick-axe will not give a "bashing" * message. Wielding one via 'a'pplying it will. * 3.2.2: Wielding arbitrary objects will give bashing message too. *************** *** 106,119 **** if (obj) { unweapon = (obj->oclass == WEAPON_CLASS) ? is_launcher(obj) || is_ammo(obj) || ! is_missile(obj) || is_pole(obj) : ! !is_weptool(obj); } else unweapon = TRUE; /* for "bare hands" message */ update_inventory(); } ! static int ready_weapon(wep) struct obj *wep; { --- 110,126 ---- if (obj) { unweapon = (obj->oclass == WEAPON_CLASS) ? is_launcher(obj) || is_ammo(obj) || ! is_missile(obj) || (is_pole(obj) ! #ifdef STEED ! && !u.usteed ! #endif ! ) : !is_weptool(obj); } else unweapon = TRUE; /* for "bare hands" message */ update_inventory(); } ! STATIC_OVL int ready_weapon(wep) struct obj *wep; { *************** *** 174,179 **** --- 181,192 ---- /* KMH -- Talking artifacts are finally implemented */ arti_speak(wep); + if (artifact_light(wep) && !wep->lamplit) { + begin_burn(wep, FALSE); + if (!Blind) + pline("%s to glow brilliantly!", Tobjnam(wep, "begin")); + } + #if 0 /* we'll get back to this someday, but it's not balanced yet */ if (Race_if(PM_ELF) && !wep->oartifact && *************** *** 227,233 **** int dowield() { ! register struct obj *wep; int result; /* May we attempt this? */ --- 240,246 ---- int dowield() { ! register struct obj *wep, *oldwep; int result; /* May we attempt this? */ *************** *** 267,275 **** } /* Set your new primary weapon */ ! if (flags.pushweapon && uwep) ! setuswapwep(uwep); result = ready_weapon(wep); untwoweapon(); return (result); --- 280,289 ---- } /* Set your new primary weapon */ ! oldwep = uwep; result = ready_weapon(wep); + if (flags.pushweapon && oldwep && uwep != oldwep) + setuswapwep(oldwep); untwoweapon(); return (result); *************** *** 355,361 **** } else if (newquiver == uwep) { /* Prevent accidentally readying the main weapon */ pline("%s already being used as a weapon!", ! (uwep->quan == 1L) ? "That is" : "They are"); return(0); } else if (newquiver->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL #ifdef STEED --- 369,375 ---- } else if (newquiver == uwep) { /* Prevent accidentally readying the main weapon */ pline("%s already being used as a weapon!", ! !is_plural(uwep) ? "That is" : "They are"); return(0); } else if (newquiver->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL #ifdef STEED *************** *** 393,415 **** struct obj *otmp; #define NOT_WEAPON(obj) (!is_weptool(obj) && obj->oclass != WEAPON_CLASS) ! if (Upolyd) ! You("can only use two weapons in your normal form."); else if (!uwep || !uswapwep) Your("%s%s%s empty.", uwep ? "left " : uswapwep ? "right " : "", body_part(HAND), (!uwep && !uswapwep) ? "s are" : " is"); else if (NOT_WEAPON(uwep) || NOT_WEAPON(uswapwep)) { otmp = NOT_WEAPON(uwep) ? uwep : uswapwep; pline("%s %s.", Yname2(otmp), ! (otmp->quan) > 1L ? "aren't weapons" : "isn't a weapon"); } else if (bimanual(uwep) || bimanual(uswapwep)) { otmp = bimanual(uwep) ? uwep : uswapwep; pline("%s isn't one-handed.", Yname2(otmp)); } else if (uarms) You_cant("use two weapons while wearing a shield."); else if (uswapwep->oartifact) ! pline("%s resists being held second to another weapon!", ! Yname2(uswapwep)); else if (!uarmg && !Stone_resistance && (uswapwep->otyp == CORPSE && touch_petrifies(&mons[uswapwep->corpsenm]))) { char kbuf[BUFSZ]; --- 407,429 ---- struct obj *otmp; #define NOT_WEAPON(obj) (!is_weptool(obj) && obj->oclass != WEAPON_CLASS) ! if (!could_twoweap(youmonst.data)) ! You_cant("use two weapons in your current form."); else if (!uwep || !uswapwep) Your("%s%s%s empty.", uwep ? "left " : uswapwep ? "right " : "", body_part(HAND), (!uwep && !uswapwep) ? "s are" : " is"); else if (NOT_WEAPON(uwep) || NOT_WEAPON(uswapwep)) { otmp = NOT_WEAPON(uwep) ? uwep : uswapwep; pline("%s %s.", Yname2(otmp), ! is_plural(otmp) ? "aren't weapons" : "isn't a weapon"); } else if (bimanual(uwep) || bimanual(uswapwep)) { otmp = bimanual(uwep) ? uwep : uswapwep; pline("%s isn't one-handed.", Yname2(otmp)); } else if (uarms) You_cant("use two weapons while wearing a shield."); else if (uswapwep->oartifact) ! pline("%s %s being held second to another weapon!", ! Yname2(uswapwep), otense(uswapwep, "resist")); else if (!uarmg && !Stone_resistance && (uswapwep->otyp == CORPSE && touch_petrifies(&mons[uswapwep->corpsenm]))) { char kbuf[BUFSZ]; *************** *** 419,431 **** Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } else if (Glib || uswapwep->cursed) { struct obj *obj = uswapwep; ! Your("%s from your %s!", aobjnam(obj, "slip"), ! makeplural(body_part(HAND))); if (!Glib) obj->bknown = TRUE; - setuswapwep((struct obj *) 0); dropx(obj); } else return (TRUE); --- 433,446 ---- Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } else if (Glib || uswapwep->cursed) { + char str[BUFSZ]; struct obj *obj = uswapwep; ! /* Avoid trashing makeplural's static buffer */ ! Strcpy(str, makeplural(body_part(HAND))); ! Your("%s from your %s!", aobjnam(obj, "slip"), str); if (!Glib) obj->bknown = TRUE; dropx(obj); } else return (TRUE); *************** *** 464,469 **** --- 479,488 ---- uwepgone() { if (uwep) { + if (artifact_light(uwep) && uwep->lamplit) { + end_burn(uwep, FALSE); + if (!Blind) pline("%s glowing.", Tobjnam(uwep, "stop")); + } setworn((struct obj *)0, W_WEP); unweapon = TRUE; update_inventory(); *************** *** 499,529 **** return; } ! /* Maybe rust weapon, or corrode it if acid damage is called for */ void ! erode_weapon(target, acid_dmg) ! struct obj *target; boolean acid_dmg; { int erosion; struct monst *victim; boolean vismon; if (!target) return; ! if (!carried(target) && !mcarried(target)) ! panic("erode whose weapon? (%d)", (int)target->where); ! victim = carried(target) ? &youmonst : target->ocarry; ! vismon = (victim != &youmonst) && canseemon(victim); erosion = acid_dmg ? target->oeroded2 : target->oeroded; if (target->greased) { ! grease_protect(target,(char *)0,FALSE,victim); } else if (target->oclass == SCROLL_CLASS) { #ifdef MAIL ! if(target->otyp != SCR_MAIL) #endif { if (!Blind) { if (victim == &youmonst) --- 518,552 ---- return; } ! /* Maybe rust object, or corrode it if acid damage is called for */ void ! erode_obj(target, acid_dmg, fade_scrolls) ! struct obj *target; /* object (e.g. weapon or armor) to erode */ boolean acid_dmg; + boolean fade_scrolls; { int erosion; struct monst *victim; boolean vismon; + boolean visobj; if (!target) return; ! victim = carried(target) ? &youmonst : ! mcarried(target) ? target->ocarry : (struct monst *)0; ! vismon = victim && (victim != &youmonst) && canseemon(victim); ! visobj = !victim && cansee(bhitpos.x, bhitpos.y); /* assume thrown */ erosion = acid_dmg ? target->oeroded2 : target->oeroded; if (target->greased) { ! grease_protect(target,(char *)0,victim); } else if (target->oclass == SCROLL_CLASS) { + if(fade_scrolls && target->otyp != SCR_BLANK_PAPER #ifdef MAIL ! && target->otyp != SCR_MAIL #endif + ) { if (!Blind) { if (victim == &youmonst) *************** *** 531,536 **** --- 554,561 ---- else if (vismon) pline("%s's %s.", Monnam(victim), aobjnam(target, "fade")); + else if (visobj) + pline_The("%s.", aobjnam(target, "fade")); } target->otyp = SCR_BLANK_PAPER; target->spe = 0; *************** *** 543,548 **** --- 568,574 ---- else if (vismon) pline("%s's %s not affected.", Monnam(victim), aobjnam(target, "are")); + /* no message if not carried */ } if (target->oerodeproof) target->rknown = TRUE; } else if (erosion < MAX_ERODE) { *************** *** 555,560 **** --- 581,591 ---- aobjnam(target, acid_dmg ? "corrode" : "rust"), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); + else if (visobj) + pline_The("%s%s!", + aobjnam(target, acid_dmg ? "corrode" : "rust"), + erosion+1 == MAX_ERODE ? " completely" : + erosion ? " further" : ""); if (acid_dmg) target->oeroded2++; else *************** *** 569,574 **** --- 600,609 ---- pline("%s's %s completely %s.", Monnam(victim), aobjnam(target, "look"), acid_dmg ? "corroded" : "rusty"); + else if (visobj) + pline_The("%s completely %s.", + aobjnam(target, "look"), + acid_dmg ? "corroded" : "rusty"); } } } *************** *** 615,623 **** if(((uwep->spe > 5 && amount >= 0) || (uwep->spe < -5 && amount < 0)) && rn2(3)) { if (!Blind) ! Your("%s %s for a while and then evaporate%s.", aobjnam(uwep, "violently glow"), color, ! uwep->quan == 1L ? "s" : ""); else Your("%s.", aobjnam(uwep, "evaporate")); --- 650,658 ---- if(((uwep->spe > 5 && amount >= 0) || (uwep->spe < -5 && amount < 0)) && rn2(3)) { if (!Blind) ! Your("%s %s for a while and then %s.", aobjnam(uwep, "violently glow"), color, ! otense(uwep, "evaporate")); else Your("%s.", aobjnam(uwep, "evaporate")); *************** *** 674,680 **** savewornmask = obj->owornmask; Your("%s %s welded to your %s!", ! xname(obj), (obj->quan == 1L) ? "is" : "are", bimanual(obj) ? (const char *)makeplural(body_part(HAND)) : body_part(HAND)); obj->owornmask = savewornmask; --- 709,715 ---- savewornmask = obj->owornmask; Your("%s %s welded to your %s!", ! xname(obj), otense(obj, "are"), bimanual(obj) ? (const char *)makeplural(body_part(HAND)) : body_part(HAND)); obj->owornmask = savewornmask; *** nethack-3.3.1/src/windows.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/windows.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)windows.c 3.3 96/05/19 */ /* Copyright (c) D. Cohrs, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)windows.c 3.4 1996/05/19 */ /* Copyright (c) D. Cohrs, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 37,42 **** --- 37,45 ---- #include "winGnome.h" extern struct window_procs Gnome_procs; #endif + #ifdef MSWIN_GRAPHICS + extern struct window_procs mswin_procs; + #endif STATIC_DCL void FDECL(def_raw_print, (const char *s)); *************** *** 75,80 **** --- 78,86 ---- #ifdef GNOME_GRAPHICS { &Gnome_procs, 0 }, #endif + #ifdef MSWIN_GRAPHICS + { &mswin_procs, 0 }, + #endif { 0, 0 } /* must be last */ }; *************** *** 126,129 **** --- 132,146 ---- return 0; } + /*ARGSUSED*/ + void + genl_preference_update(pref) + const char *pref; + { + /* window ports are expected to provide + their own preference update routine + for the preference capabilities that + they support. + Just return in this genl one. */ + } /*windows.c*/ *** nethack-3.3.1/src/wizard.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/wizard.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wizard.c 3.3 99/03/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wizard.c 3.4 2001/12/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 64,74 **** if(ttmp->ttyp == MAGIC_PORTAL) { int du = distu(ttmp->tx, ttmp->ty); if (du <= 9) ! pline("%s feels hot!", The(xname(amu))); else if (du <= 64) ! pline("%s feels very warm.", The(xname(amu))); else if (du <= 144) ! pline("%s feels warm.", The(xname(amu))); /* else, the amulet feels normal */ break; } --- 64,74 ---- if(ttmp->ttyp == MAGIC_PORTAL) { int du = distu(ttmp->tx, ttmp->ty); if (du <= 9) ! pline("%s hot!", Tobjnam(amu, "feel")); else if (du <= 64) ! pline("%s very warm.", Tobjnam(amu, "feel")); else if (du <= 144) ! pline("%s warm.", Tobjnam(amu, "feel")); /* else, the amulet feels normal */ break; } *************** *** 240,246 **** { long strat, dstrat; ! if(!is_covetous(mtmp->data)) return(STRAT_NONE); switch((mtmp->mhp*3)/mtmp->mhpmax) { /* 0-3 */ --- 240,251 ---- { long strat, dstrat; ! if (!is_covetous(mtmp->data) || ! /* perhaps a shopkeeper has been polymorphed into a master ! lich; we don't want it teleporting to the stairs to heal ! because that will leave its shop untended */ ! (mtmp->isshk && inhishop(mtmp))) ! return STRAT_NONE; switch((mtmp->mhp*3)/mtmp->mhpmax) { /* 0-3 */ *************** *** 336,363 **** return(0); } if(where == STRAT_GROUND) { ! if(!MON_AT(tx, ty) || (mtmp->mx == tx && mtmp->my == ty)) { ! /* teleport to it and pick it up */ ! rloc_to(mtmp, tx, ty); /* clean old pos */ ! ! if ((otmp = on_ground(which_arti(targ))) != 0) { ! if (cansee(mtmp->mx, mtmp->my)) ! pline("%s picks up %s.", ! Monnam(mtmp), ! (distu(mtmp->my, mtmp->my) <= 5) ? ! doname(otmp) : distant_name(otmp, doname)); ! obj_extract_self(otmp); ! (void) mpickobj(mtmp, otmp); ! return(1); ! } else return(0); ! } } else { /* a monster has it - 'port beside it. */ (void) mnearto(mtmp, tx, ty, TRUE); return(0); } } } ! /* NOTREACHED */ return(0); } --- 341,372 ---- return(0); } if(where == STRAT_GROUND) { ! if(!MON_AT(tx, ty) || (mtmp->mx == tx && mtmp->my == ty)) { ! /* teleport to it and pick it up */ ! rloc_to(mtmp, tx, ty); /* clean old pos */ ! ! if ((otmp = on_ground(which_arti(targ))) != 0) { ! if (cansee(mtmp->mx, mtmp->my)) ! pline("%s picks up %s.", ! Monnam(mtmp), ! (distu(mtmp->my, mtmp->my) <= 5) ? ! doname(otmp) : distant_name(otmp, doname)); ! obj_extract_self(otmp); ! (void) mpickobj(mtmp, otmp); ! return(1); ! } else return(0); ! } else { ! /* a monster is standing on it - cause some trouble */ ! if (!rn2(5)) mnexto(mtmp); ! return(0); ! } } else { /* a monster has it - 'port beside it. */ (void) mnearto(mtmp, tx, ty, TRUE); return(0); } } } ! /*NOTREACHED*/ return(0); } *************** *** 405,437 **** /* create some nasty monsters, aligned or neutral with the caster */ /* a null caster defaults to a chaotic caster (e.g. the wizard) */ ! void nasty(mcast) struct monst *mcast; { register struct monst *mtmp; register int i, j, tmp; int castalign = (mcast ? mcast->data->maligntyp : -1); ! if(!rn2(10) && Inhell) msummon(&mons[PM_WIZARD_OF_YENDOR]); ! else { tmp = (u.ulevel > 3) ? u.ulevel/3 : 1; /* just in case -- rph */ ! for(i = rnd(tmp); i > 0; --i) for(j=0; j<20; j++) { if ((mtmp = makemon(&mons[pick_nasty()], ! u.ux, u.uy, NO_MM_FLAGS)) != 0) { mtmp->msleeping = mtmp->mpeaceful = mtmp->mtame = 0; set_malign(mtmp); } else /* GENOD? */ mtmp = makemon((struct permonst *)0, ! u.ux, u.uy, NO_MM_FLAGS); if(mtmp && (mtmp->data->maligntyp == 0 || ! sgn(mtmp->data->maligntyp) == sgn(castalign)) ) break; } } ! return; } /* Let's resurrect the wizard, for some unexpected fun. */ --- 414,457 ---- /* create some nasty monsters, aligned or neutral with the caster */ /* a null caster defaults to a chaotic caster (e.g. the wizard) */ ! int nasty(mcast) struct monst *mcast; { register struct monst *mtmp; register int i, j, tmp; int castalign = (mcast ? mcast->data->maligntyp : -1); + coord bypos; + int count=0; ! if(!rn2(10) && Inhell) { ! msummon(&mons[PM_WIZARD_OF_YENDOR]); ! count++; ! } else { tmp = (u.ulevel > 3) ? u.ulevel/3 : 1; /* just in case -- rph */ ! /* if we don't have a casting monster, the nasties appear around you */ ! bypos.x = u.ux; ! bypos.y = u.uy; for(i = rnd(tmp); i > 0; --i) for(j=0; j<20; j++) { + if (mcast && + !enexto(&bypos, mcast->mux, mcast->muy, mcast->data)) + continue; if ((mtmp = makemon(&mons[pick_nasty()], ! bypos.x, bypos.y, NO_MM_FLAGS)) != 0) { mtmp->msleeping = mtmp->mpeaceful = mtmp->mtame = 0; set_malign(mtmp); } else /* GENOD? */ mtmp = makemon((struct permonst *)0, ! bypos.x, bypos.y, NO_MM_FLAGS); if(mtmp && (mtmp->data->maligntyp == 0 || ! sgn(mtmp->data->maligntyp) == sgn(castalign)) ) { ! count++; break; + } } } ! return count; } /* Let's resurrect the wizard, for some unexpected fun. */ *************** *** 501,507 **** break; case 3: aggravate(); break; ! case 4: nasty((struct monst *)0); break; case 5: resurrect(); break; --- 521,527 ---- break; case 3: aggravate(); break; ! case 4: (void)nasty((struct monst *)0); break; case 5: resurrect(); break; *** nethack-3.3.1/src/worm.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/worm.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)worm.c 3.3 95/01/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)worm.c 3.4 1995/01/28 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/src/worn.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/worn.c Thu Mar 21 07:37:37 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)worn.c 3.3 2000/02/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)worn.c 3.4 2002/02/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 6,11 **** --- 6,12 ---- STATIC_DCL void FDECL(m_lose_armor, (struct monst *,struct obj *)); STATIC_DCL void FDECL(m_dowear_type, (struct monst *,long,BOOLEAN_P)); + STATIC_DCL int FDECL(extra_pref, (struct monst *, struct obj *)); const struct worn { long w_mask; *************** *** 114,129 **** if (!obj) return; if (obj == uwep || obj == uswapwep) u.twoweap = 0; for(wp = worn; wp->w_mask; wp++) ! if(obj == *(wp->w_obj)) { ! *(wp->w_obj) = 0; ! p = objects[obj->otyp].oc_oprop; ! u.uprops[p].extrinsic = u.uprops[p].extrinsic & ~wp->w_mask; ! obj->owornmask &= ~wp->w_mask; ! if (obj->oartifact) ! set_artifact_intrinsic(obj, 0, wp->w_mask); ! if ((p = w_blocks(obj,wp->w_mask)) != 0) ! u.uprops[p].blocked &= ~wp->w_mask; ! } update_inventory(); } --- 115,130 ---- if (!obj) return; if (obj == uwep || obj == uswapwep) u.twoweap = 0; for(wp = worn; wp->w_mask; wp++) ! if(obj == *(wp->w_obj)) { ! *(wp->w_obj) = 0; ! p = objects[obj->otyp].oc_oprop; ! u.uprops[p].extrinsic = u.uprops[p].extrinsic & ~wp->w_mask; ! obj->owornmask &= ~wp->w_mask; ! if (obj->oartifact) ! set_artifact_intrinsic(obj, 0, wp->w_mask); ! if ((p = w_blocks(obj,wp->w_mask)) != 0) ! u.uprops[p].blocked &= ~wp->w_mask; ! } update_inventory(); } *************** *** 140,154 **** } void ! mon_adjust_speed(mon, adjust) struct monst *mon; int adjust; /* positive => increase speed, negative => decrease */ { struct obj *otmp; switch (adjust) { case 2: mon->permspeed = MFAST; break; case 1: if (mon->permspeed == MSLOW) mon->permspeed = 0; --- 141,159 ---- } void ! mon_adjust_speed(mon, adjust, obj) struct monst *mon; int adjust; /* positive => increase speed, negative => decrease */ + struct obj *obj; /* item to make known if effect can be seen */ { struct obj *otmp; + boolean give_msg = !in_mklev; + unsigned int oldspeed = mon->mspeed; switch (adjust) { case 2: mon->permspeed = MFAST; + give_msg = FALSE; /* special case monster creation */ break; case 1: if (mon->permspeed == MSLOW) mon->permspeed = 0; *************** *** 162,167 **** --- 167,173 ---- break; case -2: mon->permspeed = MSLOW; + give_msg = FALSE; /* (not currently used) */ break; } *************** *** 172,177 **** --- 178,200 ---- mon->mspeed = MFAST; else mon->mspeed = mon->permspeed; + + if (give_msg && mon->mspeed != oldspeed && canseemon(mon)) { + /* fast to slow (skipping intermediate state) or vice versa */ + const char *howmuch = (mon->mspeed + oldspeed == MFAST + MSLOW) ? + "much " : ""; + + if (adjust > 0 || mon->mspeed == MFAST) + pline("%s is suddenly moving %sfaster.", Monnam(mon), howmuch); + else + pline("%s seems to be moving %sslower.", Monnam(mon), howmuch); + + /* might discover an object if we see the speed change happen, but + avoid making possibly forgotten book known when casting its spell */ + if (obj != 0 && obj->dknown && + objects[obj->otyp].oc_class != SPBOOK_CLASS) + makeknown(obj->otyp); + } } /* armor put on or taken off; might be magical variety */ *************** *** 195,201 **** mon->minvis = !mon->invis_blkd; break; case FAST: ! mon_adjust_speed(mon, 0); break; /* properties handled elsewhere */ case ANTIMAGIC: --- 218,224 ---- mon->minvis = !mon->invis_blkd; break; case FAST: ! mon_adjust_speed(mon, 0, obj); break; /* properties handled elsewhere */ case ANTIMAGIC: *************** *** 230,236 **** mon->minvis = mon->perminvis; break; case FAST: ! mon_adjust_speed(mon, 0); break; case FIRE_RES: case COLD_RES: --- 253,259 ---- mon->minvis = mon->perminvis; break; case FAST: ! mon_adjust_speed(mon, 0, obj); break; case FIRE_RES: case COLD_RES: *************** *** 404,410 **** * it would forget spe and once again think the object is better * than what it already has. */ ! if (best && (ARM_BONUS(best) >= ARM_BONUS(obj))) continue; best = obj; } outer_break: --- 427,434 ---- * it would forget spe and once again think the object is better * than what it already has. */ ! if (best && (ARM_BONUS(best) + extra_pref(mon,best) >= ARM_BONUS(obj) + extra_pref(mon,obj))) ! continue; best = obj; } outer_break: *************** *** 476,493 **** } void ! mon_break_armor(mon) struct monst *mon; { register struct obj *otmp; struct permonst *mdat = mon->data; boolean vis = cansee(mon->mx, mon->my); ! const char *pronoun = him[pronoun_gender(mon)], ! *ppronoun = his[pronoun_gender(mon)]; if (breakarm(mdat)) { if ((otmp = which_armor(mon, W_ARM)) != 0) { ! if (vis) pline("%s breaks out of %s armor!", Monnam(mon), ppronoun); else You_hear("a cracking sound."); --- 500,564 ---- } void ! clear_bypasses() ! { ! struct obj *otmp, *nobj; ! ! for (otmp = fobj; otmp; otmp = nobj) { ! nobj = otmp->nobj; ! if (otmp->bypass) { ! otmp->bypass = 0; ! #if 0 ! /* setting otmp->bypass changes mergability. ! * If monster can ever drop anything that ! * can and should merge, this code block ! * should be enabled. ! */ ! { ! struct obj *obj; ! xchar ox, oy; ! (void) get_obj_location(otmp, &ox, &oy, 0); ! obj_extract_self(otmp); ! obj = merge_choice(fobj, otmp); ! /* If it can't merge, then place it */ ! if (!obj || (obj && !merged(&obj, &otmp))) ! place_object(otmp, ox, oy); ! newsym(ox, oy); ! } ! #endif ! } ! } ! flags.bypasses = FALSE; ! } ! ! void ! bypass_obj(obj) ! struct obj *obj; ! { ! obj->bypass = 1; ! flags.bypasses = TRUE; ! } ! ! void ! mon_break_armor(mon, polyspot) struct monst *mon; + boolean polyspot; { register struct obj *otmp; struct permonst *mdat = mon->data; boolean vis = cansee(mon->mx, mon->my); ! const char *pronoun = mhim(mon), ! *ppronoun = mhis(mon); if (breakarm(mdat)) { if ((otmp = which_armor(mon, W_ARM)) != 0) { ! if ((Is_dragon_scales(otmp) && ! mdat == Dragon_scales_to_pm(otmp)) || ! (Is_dragon_mail(otmp) && mdat == Dragon_mail_to_pm(otmp))) ! ; /* no message here; ! "the dragon merges with his scaly armor" is odd ! and the monster's previous form is already gone */ ! else if (vis) pline("%s breaks out of %s armor!", Monnam(mon), ppronoun); else You_hear("a cracking sound."); *************** *** 496,506 **** if ((otmp = which_armor(mon, W_ARMC)) != 0) { if (otmp->oartifact) { if (vis) ! pline("%s cloak falls off!", s_suffix(Monnam(mon))); m_lose_armor(mon, otmp); } else { if (vis) ! pline("%s cloak tears apart!", s_suffix(Monnam(mon))); else You_hear("a ripping sound."); m_useup(mon, otmp); --- 567,580 ---- if ((otmp = which_armor(mon, W_ARMC)) != 0) { if (otmp->oartifact) { if (vis) ! pline("%s %s falls off!", s_suffix(Monnam(mon)), ! cloak_simple_name(otmp)); ! if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } else { if (vis) ! pline("%s %s tears apart!", s_suffix(Monnam(mon)), ! cloak_simple_name(otmp)); else You_hear("a ripping sound."); m_useup(mon, otmp); *************** *** 522,538 **** s_suffix(Monnam(mon)), pronoun); else You_hear("a thud."); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMC)) != 0) { if (vis) { if (is_whirly(mon->data)) ! pline("%s cloak falls, unsupported!", ! s_suffix(Monnam(mon))); else ! pline("%s shrinks out of %s cloak!", Monnam(mon), ! ppronoun); } m_lose_armor(mon, otmp); } #ifdef TOURIST --- 596,614 ---- s_suffix(Monnam(mon)), pronoun); else You_hear("a thud."); + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMC)) != 0) { if (vis) { if (is_whirly(mon->data)) ! pline("%s %s falls, unsupported!", ! s_suffix(Monnam(mon)), cloak_simple_name(otmp)); else ! pline("%s shrinks out of %s %s!", Monnam(mon), ! ppronoun, cloak_simple_name(otmp)); } + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } #ifdef TOURIST *************** *** 545,550 **** --- 621,627 ---- pline("%s becomes much too small for %s shirt!", Monnam(mon), ppronoun); } + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } #endif *************** *** 555,560 **** --- 632,638 ---- pline("%s drops %s gloves%s!", Monnam(mon), ppronoun, MON_WEP(mon) ? " and weapon" : ""); possibly_unwield(mon); + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMS)) != 0) { *************** *** 563,568 **** --- 641,647 ---- ppronoun); else You_hear("a clank."); + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMH)) != 0) { *************** *** 571,576 **** --- 650,656 ---- s_suffix(Monnam(mon)), surface(mon->mx, mon->my)); else You_hear("a clank."); + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } } *************** *** 585,596 **** --- 665,678 ---- s_suffix(Monnam(mon)), verysmall(mdat) ? "slide" : "are pushed", ppronoun); } + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } } #ifdef STEED if (!can_saddle(mon)) { if ((otmp = which_armor(mon, W_SADDLE)) != 0) { + if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); if (vis) pline("%s saddle falls off.", s_suffix(Monnam(mon))); *************** *** 615,618 **** --- 697,714 ---- return; } + /* bias a monster's preferences towards armor that has special benefits. */ + /* currently only does speed boots, but might be expanded if monsters get to + use more armor abilities */ + static int + extra_pref(mon, obj) + struct monst *mon; + struct obj *obj; + { + if (obj) { + if (obj->otyp == SPEED_BOOTS && mon->permspeed != MFAST) + return 20; + } + return 0; + } /*worn.c*/ *** nethack-3.3.1/src/write.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/write.c Thu Mar 21 07:37:38 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)write.c 3.3 96/05/05 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" --- 1,4 ---- ! /* SCCS Id: @(#)write.c 3.4 2001/11/29 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" *************** *** 85,92 **** return 0; } else if (Glib) { dropx(pen); ! pline("%s slips from your %s.", The(xname(pen)), ! makeplural(body_part(FINGER))); return 1; } --- 85,92 ---- return 0; } else if (Glib) { dropx(pen); ! pline("%s from your %s.", ! Tobjnam(pen, "slip"), makeplural(body_part(FINGER))); return 1; } *************** *** 178,194 **** curseval = bcsign(pen) + bcsign(paper); exercise(A_WIS, TRUE); /* dry out marker */ ! if(pen->spe < actualcost) { Your("marker dries out!"); /* scrolls disappear, spellbooks don't */ ! if (paper->oclass == SPBOOK_CLASS) pline_The( "spellbook is left unfinished and your writing fades."); ! else { pline_The("scroll is now useless and disappears!"); useup(paper); } - pen->spe = 0; obfree(new_obj, (struct obj *) 0); return(1); } --- 178,195 ---- curseval = bcsign(pen) + bcsign(paper); exercise(A_WIS, TRUE); /* dry out marker */ ! if (pen->spe < actualcost) { ! pen->spe = 0; Your("marker dries out!"); /* scrolls disappear, spellbooks don't */ ! if (paper->oclass == SPBOOK_CLASS) { pline_The( "spellbook is left unfinished and your writing fades."); ! update_inventory(); /* pen charges */ ! } else { pline_The("scroll is now useless and disappears!"); useup(paper); } obfree(new_obj, (struct obj *) 0); return(1); } *************** *** 200,209 **** (rnl(Role_if(PM_WIZARD) ? 3 : 15))) { You("%s to write that!", by_descr ? "fail" : "don't know how"); /* scrolls disappear, spellbooks don't */ ! if (paper->oclass == SPBOOK_CLASS) You( "write in your best handwriting: \"My Diary\", but it quickly fades."); ! else { if (by_descr) { Strcpy(namebuf, OBJ_DESCR(objects[new_obj->otyp])); wipeout_text(namebuf, (6+MAXULEV - u.ulevel)/6, 0); --- 201,211 ---- (rnl(Role_if(PM_WIZARD) ? 3 : 15))) { You("%s to write that!", by_descr ? "fail" : "don't know how"); /* scrolls disappear, spellbooks don't */ ! if (paper->oclass == SPBOOK_CLASS) { You( "write in your best handwriting: \"My Diary\", but it quickly fades."); ! update_inventory(); /* pen charges */ ! } else { if (by_descr) { Strcpy(namebuf, OBJ_DESCR(objects[new_obj->otyp])); wipeout_text(namebuf, (6+MAXULEV - u.ulevel)/6, 0); *** nethack-3.3.1/src/zap.c Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/src/zap.c Thu Mar 21 07:37:38 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)zap.c 3.3 2000/08/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)zap.c 3.4 2002/02/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 28,34 **** STATIC_DCL int FDECL(zhitm, (struct monst *,int,int,struct obj **)); STATIC_DCL void FDECL(zhitu, (int,int,const char *,XCHAR_P,XCHAR_P)); STATIC_DCL void FDECL(revive_egg, (struct obj *)); ! STATIC_DCL boolean FDECL(hits_bars, (int)); #ifdef STEED STATIC_DCL boolean FDECL(zap_steed, (struct obj *)); #endif --- 28,34 ---- STATIC_DCL int FDECL(zhitm, (struct monst *,int,int,struct obj **)); STATIC_DCL void FDECL(zhitu, (int,int,const char *,XCHAR_P,XCHAR_P)); STATIC_DCL void FDECL(revive_egg, (struct obj *)); ! STATIC_DCL boolean FDECL(hits_bars, (struct obj *)); #ifdef STEED STATIC_DCL boolean FDECL(zap_steed, (struct obj *)); #endif *************** *** 139,145 **** case WAN_SLOW_MONSTER: case SPE_SLOW_MONSTER: if (!resist(mtmp, otmp->oclass, 0, NOTELL)) { ! mon_adjust_speed(mtmp, -1); if (u.uswallow && (mtmp == u.ustuck) && is_whirly(mtmp->data)) { You("disrupt %s!", mon_nam(mtmp)); --- 139,146 ---- case WAN_SLOW_MONSTER: case SPE_SLOW_MONSTER: if (!resist(mtmp, otmp->oclass, 0, NOTELL)) { ! mon_adjust_speed(mtmp, -1, otmp); ! m_dowear(mtmp, FALSE); /* might want speed boots */ if (u.uswallow && (mtmp == u.ustuck) && is_whirly(mtmp->data)) { You("disrupt %s!", mon_nam(mtmp)); *************** *** 149,156 **** } break; case WAN_SPEED_MONSTER: ! if (!resist(mtmp, otmp->oclass, 0, NOTELL)) ! mon_adjust_speed(mtmp, 1); break; case WAN_UNDEAD_TURNING: case SPE_TURN_UNDEAD: --- 150,159 ---- } break; case WAN_SPEED_MONSTER: ! if (!resist(mtmp, otmp->oclass, 0, NOTELL)) { ! mon_adjust_speed(mtmp, 1, otmp); ! m_dowear(mtmp, FALSE); /* might want speed boots */ ! } break; case WAN_UNDEAD_TURNING: case SPE_TURN_UNDEAD: *************** *** 163,170 **** if(dbldam) dmg *= 2; if (otyp == SPE_TURN_UNDEAD) dmg += spell_damage_bonus(); ! if(!resist(mtmp, otmp->oclass, dmg, NOTELL)) ! mtmp->mflee = TRUE; } break; case WAN_POLYMORPH: --- 166,175 ---- if(dbldam) dmg *= 2; if (otyp == SPE_TURN_UNDEAD) dmg += spell_damage_bonus(); ! flags.bypasses = TRUE; /* for make_corpse() */ ! if (!resist(mtmp, otmp->oclass, dmg, NOTELL)) { ! if (mtmp->mhp > 0) monflee(mtmp, 0, FALSE, TRUE); ! } } break; case WAN_POLYMORPH: *************** *** 175,191 **** it guard against involuntary polymorph attacks too... */ shieldeff(mtmp->mx, mtmp->my); } else if (!resist(mtmp, otmp->oclass, 0, NOTELL)) { ! if (!rn2(25)) { if (canseemon(mtmp)) { pline("%s shudders!", Monnam(mtmp)); makeknown(otyp); } /* no corpse after system shock */ xkilled(mtmp, 3); ! } ! else if (newcham(mtmp, (struct permonst *)0) ) if (!Hallucination && canspotmon(mtmp)) makeknown(otyp); } break; case WAN_CANCELLATION: --- 180,201 ---- it guard against involuntary polymorph attacks too... */ shieldeff(mtmp->mx, mtmp->my); } else if (!resist(mtmp, otmp->oclass, 0, NOTELL)) { ! /* natural shapechangers aren't affected by system shock ! (unless protection from shapechangers is interfering ! with their metabolism...) */ ! if (mtmp->cham == CHAM_ORDINARY && !rn2(25)) { if (canseemon(mtmp)) { pline("%s shudders!", Monnam(mtmp)); makeknown(otyp); } + /* flags.bypasses = TRUE; ## for make_corpse() */ /* no corpse after system shock */ xkilled(mtmp, 3); ! } else if (newcham(mtmp, (struct permonst *)0, ! (otyp != POT_POLYMORPH))) { if (!Hallucination && canspotmon(mtmp)) makeknown(otyp); + } } break; case WAN_CANCELLATION: *************** *** 250,255 **** --- 260,269 ---- mtmp->mhp += d(6, otyp == SPE_EXTRA_HEALING ? 8 : 4); if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; + if (mtmp->mblinded) { + mtmp->mblinded = 0; + mtmp->mcansee = 1; + } if (canseemon(mtmp)) pline("%s looks%s better.", Monnam(mtmp), otyp == SPE_EXTRA_HEALING ? " much" : "" ); *************** *** 280,286 **** if (monsndx(mtmp->data) == PM_STONE_GOLEM) { char *name = Monnam(mtmp); /* turn into flesh golem */ ! if (newcham(mtmp, &mons[PM_FLESH_GOLEM])) { if (canseemon(mtmp)) pline("%s turns to flesh!", name); } else { --- 294,300 ---- if (monsndx(mtmp->data) == PM_STONE_GOLEM) { char *name = Monnam(mtmp); /* turn into flesh golem */ ! if (newcham(mtmp, &mons[PM_FLESH_GOLEM], FALSE)) { if (canseemon(mtmp)) pline("%s turns to flesh!", name); } else { *************** *** 302,313 **** mtmp->mhp > 0) { mtmp->mhp -= dmg; mtmp->mhpmax -= dmg; ! if (mtmp->mhp <= 0 || mtmp->mhpmax <= 0 || mtmp->m_lev <= 0) ! xkilled(mtmp, 1); else { ! mtmp->m_lev--; ! if (canseemon(mtmp)) ! pline("%s suddenly seems weaker!", Monnam(mtmp)); } } break; --- 316,327 ---- mtmp->mhp > 0) { mtmp->mhp -= dmg; mtmp->mhpmax -= dmg; ! if (mtmp->mhp <= 0 || mtmp->mhpmax <= 0 || mtmp->m_lev < 1) ! xkilled(mtmp, 1); else { ! mtmp->m_lev--; ! if (canseemon(mtmp)) ! pline("%s suddenly seems weaker!", Monnam(mtmp)); } } break; *************** *** 344,353 **** mstatusline(mtmp); if (notonhead) return; /* don't show minvent for long worm tail */ if (mtmp->minvent || mtmp->mgold) { for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) otmp->dknown = 1; /* treat as "seen" */ ! (void) display_minventory(mtmp, MINV_ALL); } else { pline("%s is not carrying anything.", noit_Monnam(mtmp)); } --- 358,371 ---- mstatusline(mtmp); if (notonhead) return; /* don't show minvent for long worm tail */ + #ifndef GOLDOBJ if (mtmp->minvent || mtmp->mgold) { + #else + if (mtmp->minvent) { + #endif for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) otmp->dknown = 1; /* treat as "seen" */ ! (void) display_minventory(mtmp, MINV_ALL, (char *)0); } else { pline("%s is not carrying anything.", noit_Monnam(mtmp)); } *************** *** 442,448 **** if (mtmp2->mhpmax <= 0 && !is_rider(mtmp2->data)) return (struct monst *)0; mtmp = makemon(mtmp2->data, ! cc->x, cc->y, NO_MINVENT|MM_NOWAIT); if (!mtmp) return mtmp; /* heal the monster */ --- 460,466 ---- if (mtmp2->mhpmax <= 0 && !is_rider(mtmp2->data)) return (struct monst *)0; mtmp = makemon(mtmp2->data, ! cc->x, cc->y, NO_MINVENT|MM_NOWAIT|MM_NOCOUNTBIRTH); if (!mtmp) return mtmp; /* heal the monster */ *************** *** 451,457 **** mtmp2->mhp = mtmp2->mhpmax; /* Get these ones from mtmp */ mtmp2->minvent = mtmp->minvent; /*redundant*/ ! mtmp2->m_id = mtmp->m_id; mtmp2->mx = mtmp->mx; mtmp2->my = mtmp->my; mtmp2->mux = mtmp->mux; --- 469,479 ---- mtmp2->mhp = mtmp2->mhpmax; /* Get these ones from mtmp */ mtmp2->minvent = mtmp->minvent; /*redundant*/ ! /* monster ID is available if the monster died in the current ! game, but should be zero if the corpse was in a bones level ! (we cleared it when loading bones) */ ! if (!mtmp2->m_id) ! mtmp2->m_id = mtmp->m_id; mtmp2->mx = mtmp->mx; mtmp2->my = mtmp->my; mtmp2->mux = mtmp->mux; *************** *** 468,473 **** --- 490,496 ---- mtmp2->mlstmv = mtmp->mlstmv; mtmp2->m_ap_type = mtmp->m_ap_type; /* set these ones explicitly */ + mtmp2->mavenge = 0; mtmp2->meating = 0; mtmp2->mleashed = 0; mtmp2->mtrapped = 0; *************** *** 485,490 **** --- 508,545 ---- } /* + * get_container_location() returns the following information + * about the outermost container: + * loc argument gets set to: + * OBJ_INVENT if in hero's inventory; return 0. + * OBJ_FLOOR if on the floor; return 0. + * OBJ_BURIED if buried; return 0. + * OBJ_MINVENT if in monster's inventory; return monster. + * container_nesting is updated with the nesting depth of the containers + * if applicable. + */ + struct monst * + get_container_location(obj, loc, container_nesting) + struct obj *obj; + int *loc; + int *container_nesting; + { + if (!obj || !loc) + return 0; + + if (container_nesting) *container_nesting = 0; + while (obj && obj->where == OBJ_CONTAINED) { + if (container_nesting) *container_nesting += 1; + obj = obj->ocontainer; + } + if (obj) { + *loc = obj->where; /* outermost container's location */ + if (obj->where == OBJ_MINVENT) return obj->ocarry; + } + return (struct monst *)0; + } + + /* * Attempt to revive the given corpse, return the revived monster if * successful. Note: this does NOT use up the corpse if it fails. */ *************** *** 493,508 **** register struct obj *obj; { register struct monst *mtmp = (struct monst *)0; schar savetame = 0; boolean recorporealization = FALSE; ! if(obj->otyp == CORPSE) { int montype = obj->corpsenm; xchar x, y; ! /* only for invent, minvent, or floor */ ! if (!get_obj_location(obj, &x, &y, 0)) ! return (struct monst *) 0; if (MON_AT(x,y)) { coord new_xy; --- 548,604 ---- register struct obj *obj; { register struct monst *mtmp = (struct monst *)0; + struct obj *container = (struct obj *)0; + int container_nesting = 0; schar savetame = 0; boolean recorporealization = FALSE; ! boolean in_container = FALSE; if(obj->otyp == CORPSE) { int montype = obj->corpsenm; xchar x, y; ! if (obj->where == OBJ_CONTAINED) { ! /* deal with corpses in [possibly nested] containers */ ! struct monst *carrier; ! int holder = 0; ! ! container = obj->ocontainer; ! carrier = get_container_location(container, &holder, ! &container_nesting); ! switch(holder) { ! case OBJ_MINVENT: ! x = carrier->mx; y = carrier->my; ! in_container = TRUE; ! break; ! case OBJ_INVENT: ! x = u.ux; y = u.uy; ! in_container = TRUE; ! break; ! case OBJ_FLOOR: ! if (!get_obj_location(obj, &x, &y, CONTAINED_TOO)) ! return (struct monst *) 0; ! in_container = TRUE; ! break; ! default: ! return (struct monst *)0; ! } ! } else { ! /* only for invent, minvent, or floor */ ! if (!get_obj_location(obj, &x, &y, 0)) ! return (struct monst *) 0; ! } ! if (in_container) { ! /* Rules for revival from containers: ! - the container cannot be locked ! - the container cannot be heavily nested (>2 is arbitrary) ! - the container cannot be a statue or bag of holding ! (except in very rare cases for the latter) ! */ ! if (!x || !y || container->olocked || container_nesting > 2 || ! container->otyp == STATUE || ! (container->otyp == BAG_OF_HOLDING && rn2(40))) ! return (struct monst *)0; ! } if (MON_AT(x,y)) { coord new_xy; *************** *** 517,523 **** NO_MINVENT|MM_NOWAIT); if (mtmp) { mtmp->mhp = mtmp->mhpmax = 100; ! mon_adjust_speed(mtmp, 2); /* MFAST */ } } else { if (obj->oxlth && (obj->oattached == OATTACHED_MONST)) { --- 613,619 ---- NO_MINVENT|MM_NOWAIT); if (mtmp) { mtmp->mhp = mtmp->mhpmax = 100; ! mon_adjust_speed(mtmp, 2, (struct obj *)0); /* MFAST */ } } else { if (obj->oxlth && (obj->oattached == OATTACHED_MONST)) { *************** *** 528,534 **** wary_dog(mtmp, TRUE); } else mtmp = makemon(&mons[montype], x, y, ! NO_MINVENT|MM_NOWAIT); if (mtmp) { if (obj->oxlth && (obj->oattached == OATTACHED_M_ID)) { unsigned m_id; --- 624,630 ---- wary_dog(mtmp, TRUE); } else mtmp = makemon(&mons[montype], x, y, ! NO_MINVENT|MM_NOWAIT|MM_NOCOUNTBIRTH); if (mtmp) { if (obj->oxlth && (obj->oattached == OATTACHED_M_ID)) { unsigned m_id; *************** *** 554,559 **** --- 650,659 ---- /* Monster retains its name */ if (obj->onamelth) mtmp = christen_monst(mtmp, ONAME(obj)); + /* flag the quest leader as alive. */ + if (mtmp->data->msound == MS_LEADER || mtmp->m_id == + quest_status.leader_m_id) + quest_status.leader_is_dead = FALSE; } } if (mtmp) { *************** *** 584,596 **** x = obj->ox, y = obj->oy; /* not useupf(), which charges */ if (obj->quan > 1L) ! (void) splitobj(obj, 1L); delobj(obj); newsym(x, y); break; case OBJ_MINVENT: m_useup(obj->ocarry, obj); break; default: panic("revive"); } --- 684,700 ---- x = obj->ox, y = obj->oy; /* not useupf(), which charges */ if (obj->quan > 1L) ! obj = splitobj(obj, 1L); delobj(obj); newsym(x, y); break; case OBJ_MINVENT: m_useup(obj->ocarry, obj); break; + case OBJ_CONTAINED: + obj_extract_self(obj); + obfree(obj, (struct obj *) 0); + break; default: panic("revive"); } *************** *** 792,798 **** { boolean u_ring; - /* Is this a charged/enchanted object? */ if (!obj || (!objects[obj->otyp].oc_charged && obj->oclass != WEAPON_CLASS && --- 896,901 ---- *************** *** 852,857 **** --- 955,961 ---- flags.botl = 1; break; } + if (carried(obj)) update_inventory(); return (TRUE); } *************** *** 1018,1024 **** mtmp = makemon(mdat, obj->ox, obj->oy, NO_MM_FLAGS); polyuse(obj, okind, (int)mons[pm_index].cwt); ! if(!Blind && mtmp) { pline("Some %sobjects meld, and %s arises from the pile!", material, a_monnam(mtmp)); } --- 1122,1128 ---- mtmp = makemon(mdat, obj->ox, obj->oy, NO_MM_FLAGS); polyuse(obj, okind, (int)mons[pm_index].cwt); ! if(mtmp && cansee(mtmp->mx, mtmp->my)) { pline("Some %sobjects meld, and %s arises from the pile!", material, a_monnam(mtmp)); } *************** *** 1048,1056 **** /* if quan > 1 then some will survive intact */ if (obj->quan > 1L) { if (obj->quan > LARGEST_INT) ! (void) splitobj(obj, (long)rnd(30000)); else ! (void) splitobj(obj, (long)rnd((int)obj->quan - 1)); } /* appropriately add damage to bill */ --- 1152,1160 ---- /* if quan > 1 then some will survive intact */ if (obj->quan > 1L) { if (obj->quan > LARGEST_INT) ! obj = splitobj(obj, (long)rnd(30000)); else ! obj = splitobj(obj, (long)rnd((int)obj->quan - 1)); } /* appropriately add damage to bill */ *************** *** 1072,1082 **** * "polymorph" case). If ID is set to a specific object, inhibit fusing * n objects into 1. This could have been added as a flag, but currently * it is tied to not being the standard polymorph case. The new polymorphed ! * object replaces obj in its link chains. * * This should be safe to call for an object anywhere. */ ! void poly_obj(obj, id) struct obj *obj; int id; --- 1176,1187 ---- * "polymorph" case). If ID is set to a specific object, inhibit fusing * n objects into 1. This could have been added as a flag, but currently * it is tied to not being the standard polymorph case. The new polymorphed ! * object replaces obj in its link chains. Return value is a pointer to ! * the new object. * * This should be safe to call for an object anywhere. */ ! struct obj * poly_obj(obj, id) struct obj *obj; int id; *************** *** 1219,1225 **** while (otmp->otyp == SPE_POLYMORPH) otmp->otyp = rnd_class(SPE_DIG, SPE_BLANK_PAPER); /* reduce spellbook abuse */ ! otmp->spestudied += 1; break; case GEM_CLASS: --- 1324,1330 ---- while (otmp->otyp == SPE_POLYMORPH) otmp->otyp = rnd_class(SPE_DIG, SPE_BLANK_PAPER); /* reduce spellbook abuse */ ! otmp->spestudied = obj->spestudied + 1; break; case GEM_CLASS: *************** *** 1295,1301 **** if ((!obj->no_charge || (Has_contents(obj) && ! (contained_cost(obj, shkp, 0L, FALSE) != 0L))) && inhishop(shkp)) { if(shkp->mpeaceful) { if(*u.ushops && *in_rooms(u.ux, u.uy, 0) == --- 1400,1406 ---- if ((!obj->no_charge || (Has_contents(obj) && ! (contained_cost(obj, shkp, 0L, FALSE, FALSE) != 0L))) && inhishop(shkp)) { if(shkp->mpeaceful) { if(*u.ushops && *in_rooms(u.ux, u.uy, 0) == *************** *** 1310,1316 **** } } delobj(obj); ! return; } /* --- 1415,1421 ---- } } delobj(obj); ! return otmp; } /* *************** *** 1323,1330 **** { int res = 1; /* affected object by default */ /* ! * Some parts of this function expect the object to on the floor * obj->{ox,oy} to be valid. The exception to this (so far) is * for the STONE_TO_FLESH spell. */ --- 1428,1467 ---- { int res = 1; /* affected object by default */ + if (obj->bypass) { + /* The bypass bit is currently only used as follows: + * + * POLYMORPH - When a monster being polymorphed drops something + * from its inventory as a result of the change. + * If the items fall to the floor, they are not + * subject to direct subsequent polymorphing + * themselves on that same zap. This makes it + * consistent with items that remain in the + * monster's inventory. They are not polymorphed + * either. + * UNDEAD_TURNING - When an undead creature gets killed via + * undead turning, prevent its corpse from being + * immediately revived by the same effect. + * + * The bypass bit on all objects is reset each turn, whenever + * flags.bypasses is set. + * + * We check the obj->bypass bit above AND flags.bypasses + * as a safeguard against any stray occurrence left in an obj + * struct someplace, although that should never happen. + */ + if (flags.bypasses) + return 0; + else { + #ifdef DEBUG + pline("%s for a moment.", Tobjnam(obj, "pulsate")); + #endif + obj->bypass = 0; + } + } + /* ! * Some parts of this function expect the object to be on the floor * obj->{ox,oy} to be valid. The exception to this (so far) is * for the STONE_TO_FLESH spell. */ *************** *** 1361,1376 **** do_osshock(obj); break; } ! poly_obj(obj, STRANGE_OBJECT); newsym(obj->ox,obj->oy); break; case WAN_PROBING: res = !obj->dknown; /* target object has now been "seen (up close)" */ obj->dknown = 1; ! if (Has_contents(obj)) { if (!obj->cobj) ! pline("%s is empty.", The(xname(obj))); else { struct obj *o; /* view contents (not recursively) */ --- 1498,1513 ---- do_osshock(obj); break; } ! obj = poly_obj(obj, STRANGE_OBJECT); newsym(obj->ox,obj->oy); break; case WAN_PROBING: res = !obj->dknown; /* target object has now been "seen (up close)" */ obj->dknown = 1; ! if (Is_container(obj) || obj->otyp == STATUE) { if (!obj->cobj) ! pline("%s empty.", Tobjnam(obj, "are")); else { struct obj *o; /* view contents (not recursively) */ *************** *** 1454,1460 **** switch (objects[obj->otyp].oc_class) { case ROCK_CLASS: /* boulders and statues */ if (obj->otyp == BOULDER) { ! poly_obj(obj, HUGE_CHUNK_OF_MEAT); if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ goto smell; --- 1591,1597 ---- switch (objects[obj->otyp].oc_class) { case ROCK_CLASS: /* boulders and statues */ if (obj->otyp == BOULDER) { ! obj = poly_obj(obj, HUGE_CHUNK_OF_MEAT); if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ goto smell; *************** *** 1472,1478 **** /* Unlikely to get here since genociding * monsters also sets the G_NOCORPSE flag. */ ! poly_obj(obj, CORPSE); break; } } else { /* new rock class object... */ --- 1609,1615 ---- /* Unlikely to get here since genociding * monsters also sets the G_NOCORPSE flag. */ ! obj = poly_obj(obj, CORPSE); break; } } else { /* new rock class object... */ *************** *** 1502,1514 **** } /* maybe add weird things to become? */ case RING_CLASS: /* some of the rings are stone */ ! poly_obj(obj, MEAT_RING); goto smell; case WAND_CLASS: /* marble wand */ ! poly_obj(obj, MEAT_STICK); goto smell; case GEM_CLASS: /* rocks & gems */ ! poly_obj(obj, MEATBALL); smell: if (herbivorous(youmonst.data) && !carnivorous(youmonst.data)) --- 1639,1651 ---- } /* maybe add weird things to become? */ case RING_CLASS: /* some of the rings are stone */ ! obj = poly_obj(obj, MEAT_RING); goto smell; case WAND_CLASS: /* marble wand */ ! obj = poly_obj(obj, MEAT_STICK); goto smell; case GEM_CLASS: /* rocks & gems */ ! obj = poly_obj(obj, MEATBALL); smell: if (herbivorous(youmonst.data) && !carnivorous(youmonst.data)) *************** *** 1667,1675 **** pline("%s glows and fades.", The(xname(obj))); /* make him pay for knowing !NODIR */ } else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].oc_dir == NODIR)) { ! if ((damage = zapyourself(obj, TRUE)) != 0) ! losehp(damage, self_pronoun("zapped %sself with a wand", "him"), ! NO_KILLER_PREFIX); } else { /* Are we having fun yet? --- 1804,1814 ---- pline("%s glows and fades.", The(xname(obj))); /* make him pay for knowing !NODIR */ } else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].oc_dir == NODIR)) { ! if ((damage = zapyourself(obj, TRUE)) != 0) { ! char buf[BUFSZ]; ! Sprintf(buf, "zapped %sself with a wand", uhim()); ! losehp(damage, buf, NO_KILLER_PREFIX); ! } } else { /* Are we having fun yet? *************** *** 1684,1690 **** current_wand = 0; } if (obj && obj->spe < 0) { ! pline("%s turns to dust.", The(xname(obj))); useup(obj); } update_inventory(); /* maybe used a charge */ --- 1823,1829 ---- current_wand = 0; } if (obj && obj->spe < 0) { ! pline("%s to dust.", Tobjnam(obj, "turn")); useup(obj); } update_inventory(); /* maybe used a charge */ *************** *** 1697,1702 **** --- 1836,1842 ---- boolean ordinary; { int damage = 0; + char buf[BUFSZ]; switch(obj->otyp) { case WAN_STRIKING: *************** *** 1731,1742 **** if (!resists_blnd(&youmonst)) { You(are_blinded_by_the_flash); make_blinded((long)rnd(100),FALSE); } break; case SPE_FIREBALL: You("explode a fireball on top of yourself!"); ! explode(u.ux, u.uy, 11, d(6,6), WAND_CLASS); break; case WAN_FIRE: makeknown(WAN_FIRE); --- 1871,1883 ---- if (!resists_blnd(&youmonst)) { You(are_blinded_by_the_flash); make_blinded((long)rnd(100),FALSE); + if (!Blind) Your(vision_clears); } break; case SPE_FIREBALL: You("explode a fireball on top of yourself!"); ! explode(u.ux, u.uy, 11, d(6,6), WAND_CLASS, EXPL_FIERY); break; case WAN_FIRE: makeknown(WAN_FIRE); *************** *** 1788,1794 **** makeknown(WAN_POLYMORPH); case SPE_POLYMORPH: if (!Unchanging) ! polyself(); break; case WAN_CANCELLATION: --- 1929,1935 ---- makeknown(WAN_POLYMORPH); case SPE_POLYMORPH: if (!Unchanging) ! polyself(FALSE); break; case WAN_CANCELLATION: *************** *** 1873,1880 **** : "You seem no deader than before."); break; } killer_format = NO_KILLER_PREFIX; - killer = self_pronoun("shot %sself with a death ray","him"); You("irradiate yourself with pure energy!"); You("die."); makeknown(obj->otyp); --- 2014,2022 ---- : "You seem no deader than before."); break; } + Sprintf(buf, "shot %sself with a death ray", uhim()); + killer = buf; killer_format = NO_KILLER_PREFIX; You("irradiate yourself with pure energy!"); You("die."); makeknown(obj->otyp); *************** *** 1910,1915 **** --- 2052,2058 ---- You(are_blinded_by_the_flash); make_blinded((long)damage, FALSE); makeknown(obj->otyp); + if (!Blind) Your(vision_clears); } damage = 0; /* reset */ break; *************** *** 2101,2112 **** --- 2244,2258 ---- int x, y, xx, yy, ptmp; struct obj *otmp; struct engr *e; + struct trap *ttmp; char buf[BUFSZ]; /* some wands have special effects other than normal bhitpile */ /* drawbridge might change */ x = xx = u.ux; /* is zap location */ y = yy = u.uy; /* is drawbridge (portcullis) position */ + ttmp = t_at(x, y); /* trap if there is one */ + switch (obj->otyp) { case WAN_PROBING: ptmp = 0; *************** *** 2156,2166 **** ceiling(x, y), body_part(HEAD)); losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), "falling rock", KILLED_BY_AN); ! if ((otmp = mksobj_at(ROCK, x, y, FALSE)) != 0) { (void)xname(otmp); /* set dknown, maybe bknown */ stackobj(otmp); } newsym(x, y); } break; case SPE_STONE_TO_FLESH: --- 2302,2327 ---- ceiling(x, y), body_part(HEAD)); losehp(rnd((uarmh && is_metallic(uarmh)) ? 2 : 6), "falling rock", KILLED_BY_AN); ! if ((otmp = mksobj_at(ROCK, x, y, FALSE, FALSE)) != 0) { (void)xname(otmp); /* set dknown, maybe bknown */ stackobj(otmp); } newsym(x, y); + } else if (!striking && ttmp && ttmp->ttyp == TRAPDOOR && u.dz > 0) { + if (!Blind) { + if (ttmp->tseen) { + pline("A trap door beneath you closes up then vanishes."); + disclose = TRUE; + } else { + You("see a swirl of %s beneath you.", + is_ice(x,y) ? "frost" : "dust"); + } + } else { + You_hear("a twang followed by a thud."); + } + deltrap(ttmp); + ttmp = (struct trap *)0; + newsym(x, y); } break; case SPE_STONE_TO_FLESH: *************** *** 2172,2184 **** } else if (u.dz > 0 && !OBJ_AT(u.ux, u.uy)) { /* Print this message only if there wasn't an engraving ! affected here. */ e = engr_at(u.ux, u.uy); ! if (!(e && e->engr_type == ENGRAVE)) ! pline("Blood pools at your %s.", ! makeplural(body_part(FOOT))); } break; default: break; --- 2333,2351 ---- } else if (u.dz > 0 && !OBJ_AT(u.ux, u.uy)) { /* Print this message only if there wasn't an engraving ! affected here. If water or ice, act like waterlevel case. */ e = engr_at(u.ux, u.uy); ! if (!(e && e->engr_type == ENGRAVE)) { ! if (is_pool(u.ux, u.uy) || is_ice(u.ux, u.uy)) ! pline(nothing_happens); ! else ! pline("Blood %ss %s your %s.", ! is_lava(u.ux, u.uy) ? "boil" : "pool", ! Levitation ? "beneath" : "at", ! makeplural(body_part(FOOT))); } + } break; default: break; *************** *** 2218,2226 **** case SPE_FORCE_BOLT: wipe_engr_at(x, y, d(2,4)); break; - case SPE_DRAIN_LIFE: - u_wipe_engr(3); - break; default: break; } --- 2385,2390 ---- *************** *** 2365,2373 **** register struct monst *mtmp; register const char *force; /* usually either "." or "!" */ { ! if(!cansee(bhitpos.x,bhitpos.y) || !flags.verbose) ! pline("%s hits it.", The(str)); ! else pline("%s hits %s%s", The(str), mon_nam(mtmp), force); } void --- 2529,2539 ---- register struct monst *mtmp; register const char *force; /* usually either "." or "!" */ { ! if((!cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp)) ! || !flags.verbose) ! pline("%s %s it.", The(str), vtense(str, "hit")); ! else pline("%s %s %s%s", The(str), vtense(str, "hit"), ! mon_nam(mtmp), force); } void *************** *** 2375,2382 **** register const char *str; register struct monst *mtmp; { ! pline("%s misses %s.", The(str), ! (cansee(bhitpos.x,bhitpos.y) && flags.verbose) ? mon_nam(mtmp) : "it"); } #endif /*OVL0*/ --- 2541,2549 ---- register const char *str; register struct monst *mtmp; { ! pline("%s %s %s.", The(str), vtense(str, "miss"), ! ((cansee(bhitpos.x,bhitpos.y) || canspotmon(mtmp)) ! && flags.verbose) ? mon_nam(mtmp) : "it"); } #endif /*OVL0*/ *************** *** 2384,2397 **** /* return TRUE if obj_type can't pass through iron bars */ static boolean ! hits_bars(obj_type) ! int obj_type; { /* ! There should be a _lot_ of things here..., but lets start ! with what started this change... */ ! if (obj_type == HEAVY_IRON_BALL) return TRUE; return FALSE; } --- 2551,2569 ---- /* return TRUE if obj_type can't pass through iron bars */ static boolean ! hits_bars(obj) ! struct obj *obj; { + int obj_type = obj->otyp; /* ! There should be a _lot_ of things here..., but iron ball ! started this change and boulders, chests, and boxes were added later... ! Corpses and statues that are at least medium size are also screened. */ ! if (obj_type == BOULDER || obj_type == HEAVY_IRON_BALL || obj_type == LARGE_BOX || ! obj_type == CHEST || obj_type == ICE_BOX || ! ((obj_type == CORPSE || obj_type == STATUE) ! && mons[obj->corpsenm].msize >= MZ_MEDIUM)) return TRUE; return FALSE; } *************** *** 2455,2470 **** } if(is_pick(obj) && inside_shop(x, y) && ! shkcatch(obj, x, y)) { tmp_at(DISP_END, 0); ! return(m_at(x, y)); } typ = levl[bhitpos.x][bhitpos.y].typ; /* iron bars will block anything big enough */ if ((weapon == THROWN_WEAPON || weapon == KICKED_WEAPON) ! && typ == IRONBARS && hits_bars(obj->otyp)) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; --- 2627,2642 ---- } if(is_pick(obj) && inside_shop(x, y) && ! (mtmp = shkcatch(obj, x, y))) { tmp_at(DISP_END, 0); ! return(mtmp); } typ = levl[bhitpos.x][bhitpos.y].typ; /* iron bars will block anything big enough */ if ((weapon == THROWN_WEAPON || weapon == KICKED_WEAPON) ! && typ == IRONBARS && hits_bars(obj)) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; *************** *** 2498,2518 **** if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my); ! /* TODO: FLASHED_LIGHT hitting invisible monster ! should pass through instead of stop... */ ! if(weapon != ZAPPED_WAND) { ! if(weapon != INVIS_BEAM) tmp_at(DISP_END, 0); ! if (cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp)) { if (weapon != INVIS_BEAM) { ! map_invisible(bhitpos.x, bhitpos.y); ! return(mtmp); } ! } else ! return(mtmp); ! } ! if (weapon != INVIS_BEAM) { ! (*fhitm)(mtmp, obj); ! range -= 3; } } else { if (weapon == ZAPPED_WAND && obj->otyp == WAN_PROBING && --- 2670,2706 ---- if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my); ! if (weapon != FLASHED_LIGHT) { ! if(weapon != ZAPPED_WAND) { ! if(weapon != INVIS_BEAM) tmp_at(DISP_END, 0); ! if (cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp)) { ! if (weapon != INVIS_BEAM) { ! map_invisible(bhitpos.x, bhitpos.y); ! return(mtmp); ! } ! } else ! return(mtmp); ! } if (weapon != INVIS_BEAM) { ! (*fhitm)(mtmp, obj); ! range -= 3; } ! } else { ! /* FLASHED_LIGHT hitting invisible monster ! should pass through instead of stop so ! we call flash_hits_mon() directly rather ! than returning mtmp back to caller. That ! allows the flash to keep on going. Note ! that we use mtmp->minvis not canspotmon() ! because it makes no difference whether ! the hero can see the monster or not.*/ ! if (mtmp->minvis) { ! obj->ox = u.ux, obj->oy = u.uy; ! (void) flash_hits_mon(mtmp, obj); ! } else { ! tmp_at(DISP_END, 0); ! return(mtmp); /* caller will call flash_hits_mon */ ! } } } else { if (weapon == ZAPPED_WAND && obj->otyp == WAN_PROBING && *************** *** 2574,2580 **** delay_output(); /* kicked objects fall in pools */ if((weapon == KICKED_WEAPON) && ! is_pool(bhitpos.x, bhitpos.y)) break; #ifdef SINKS if(IS_SINK(typ) && weapon != FLASHED_LIGHT) --- 2762,2769 ---- delay_output(); /* kicked objects fall in pools */ if((weapon == KICKED_WEAPON) && ! (is_pool(bhitpos.x, bhitpos.y) || ! is_lava(bhitpos.x, bhitpos.y))) break; #ifdef SINKS if(IS_SINK(typ) && weapon != FLASHED_LIGHT) *************** *** 2800,2806 **** break; } tmp = d(nd,6); ! if (!rn2(6)) erode_weapon(MON_WEP(mon), TRUE); if (!rn2(6)) erode_armor(mon, TRUE); break; } --- 2989,2995 ---- break; } tmp = d(nd,6); ! if (!rn2(6)) erode_obj(MON_WEP(mon), TRUE, TRUE); if (!rn2(6)) erode_armor(mon, TRUE); break; } *************** *** 2810,2815 **** --- 2999,3005 ---- if (tmp > 0 && type >= 0 && resist(mon, type < ZT_SPELL(0) ? WAND_CLASS : '\0', 0, NOTELL)) tmp /= 2; + if (tmp < 0) tmp = 0; /* don't allow negative damage */ #ifdef WIZ_PATCH_DEBUG pline("zapped monster hp = %d (= %d - %d)", mon->mhp-tmp,mon->mhp,tmp); #endif *************** *** 2928,2935 **** exercise(A_STR, FALSE); } /* using two weapons at once makes both of them more vulnerable */ ! if (!rn2(u.twoweap ? 3 : 6)) erode_weapon(uwep, TRUE); ! if (u.twoweap && !rn2(3)) erode_weapon(uswapwep, TRUE); if (!rn2(6)) erode_armor(&youmonst, TRUE); break; } --- 3118,3125 ---- exercise(A_STR, FALSE); } /* using two weapons at once makes both of them more vulnerable */ ! if (!rn2(u.twoweap ? 3 : 6)) erode_obj(uwep, TRUE, TRUE); ! if (u.twoweap && !rn2(3)) erode_obj(uswapwep, TRUE, TRUE); if (!rn2(6)) erode_armor(&youmonst, TRUE); break; } *************** *** 2949,2957 **** * return the number of scrolls and spellbooks burned */ int ! burn_floor_paper(x, y, give_feedback) int x, y; boolean give_feedback; /* caller needs to decide about visibility checks */ { struct obj *obj, *obj2; long i, scrquan, delquan; --- 3139,3148 ---- * return the number of scrolls and spellbooks burned */ int ! burn_floor_paper(x, y, give_feedback, u_caused) int x, y; boolean give_feedback; /* caller needs to decide about visibility checks */ + boolean u_caused; { struct obj *obj, *obj2; long i, scrquan, delquan; *************** *** 2972,2979 **** /* save name before potential delobj() */ what = !give_feedback ? 0 : (x == u.ux && y == u.uy) ? xname(obj) : distant_name(obj, xname); ! /* not useupf(), which charges */ ! if (delquan < scrquan) obj->quan -= delquan; else delobj(obj); cnt += delquan; if (give_feedback) { --- 3163,3171 ---- /* save name before potential delobj() */ what = !give_feedback ? 0 : (x == u.ux && y == u.uy) ? xname(obj) : distant_name(obj, xname); ! /* useupf(), which charges, only if hero caused damage */ ! if (u_caused) useupf(obj, delquan); ! else if (delquan < scrquan) obj->quan -= delquan; else delobj(obj); cnt += delquan; if (give_feedback) { *************** *** 3105,3111 **** pline("%s disintegrates.", Monnam(mon)); pline("%s body reintegrates before your %s!", s_suffix(Monnam(mon)), ! makeplural(body_part(EYE))); pline("%s resurrects!", Monnam(mon)); } mon->mhp = mon->mhpmax; --- 3297,3304 ---- pline("%s disintegrates.", Monnam(mon)); pline("%s body reintegrates before your %s!", s_suffix(Monnam(mon)), ! (eyecount(youmonst.data) == 1) ? ! body_part(EYE) : makeplural(body_part(EYE))); pline("%s resurrects!", Monnam(mon)); } mon->mhp = mon->mhpmax; *************** *** 3131,3137 **** --- 3324,3332 ---- else hit(fltxt, mon, "!"); } + #ifndef GOLDOBJ mon->mgold = 0L; + #endif /* note: worn amulet of life saving must be preserved in order to operate */ #define oresist_disintegration(obj) \ *************** *** 3204,3209 **** --- 3399,3405 ---- if (abstype == ZT_LIGHTNING && !resists_blnd(&youmonst)) { You(are_blinded_by_the_flash); make_blinded((long)d(nd,50),FALSE); + if (!Blind) Your(vision_clears); } stop_occupation(); nomul(0); *************** *** 3248,3254 **** } tmp_at(DISP_END,0); if (type == ZT_SPELL(ZT_FIRE)) ! explode(sx, sy, type, d(12,6), 0); if (shopdamage) pay_for_damage(abstype == ZT_FIRE ? "burn away" : abstype == ZT_COLD ? "shatter" : --- 3444,3450 ---- } tmp_at(DISP_END,0); if (type == ZT_SPELL(ZT_FIRE)) ! explode(sx, sy, type, d(12,6), 0, EXPL_FIERY); if (shopdamage) pay_for_damage(abstype == ZT_FIRE ? "burn away" : abstype == ZT_COLD ? "shatter" : *************** *** 3312,3317 **** --- 3508,3521 ---- int rangemod = 0; if(abstype == ZT_FIRE) { + struct trap *t = t_at(x, y); + + if (t && t->ttyp == WEB) { + /* a burning web is too flimsy to notice if you can't see it */ + if (cansee(x,y)) Norep("A web bursts into flames!"); + (void) delfloortrap(t); + if (cansee(x,y)) newsym(x,y); + } if(is_ice(x, y)) { melt_ice(x, y); } else if(is_pool(x,y)) { *************** *** 3465,3471 **** } if(OBJ_AT(x, y) && abstype == ZT_FIRE) ! if (burn_floor_paper(x, y, FALSE) && couldsee(x, y)) { newsym(x,y); You("%s of smoke.", !Blind ? "see a puff" : "smell a whiff"); --- 3669,3675 ---- } if(OBJ_AT(x, y) && abstype == ZT_FIRE) ! if (burn_floor_paper(x, y, FALSE, type > 0) && couldsee(x, y)) { newsym(x,y); You("%s of smoke.", !Blind ? "see a puff" : "smell a whiff"); *************** *** 3504,3509 **** --- 3708,3715 ---- obj->onamelth = 0; /* no names */ obj->oxlth = 0; /* no extra data */ obj->oattached = OATTACHED_NOTHING; + obj_extract_self(obj); /* move rocks back on top */ + place_object(obj, obj->ox, obj->oy); if(!does_block(obj->ox,obj->oy,&levl[obj->ox][obj->oy])) unblock_point(obj->ox,obj->oy); if(cansee(obj->ox,obj->oy)) *************** *** 3639,3646 **** pline("%s %s %s!", mult, xname(obj), (cnt > 1L) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); ! if(osym == POTION_CLASS && dmgtyp != AD_COLD) ! potionbreathe(obj); if (obj->owornmask) { if (obj->owornmask & W_RING) /* ring being worn */ Ring_gone(obj); --- 3845,3854 ---- pline("%s %s %s!", mult, xname(obj), (cnt > 1L) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); ! if(osym == POTION_CLASS && dmgtyp != AD_COLD) { ! if (!breathless(youmonst.data) || haseyes(youmonst.data)) ! potionbreathe(obj); ! } if (obj->owornmask) { if (obj->owornmask & W_RING) /* ring being worn */ Ring_gone(obj); *************** *** 3779,3786 **** --- 3987,3996 ---- /* attack level */ switch (oclass) { case WAND_CLASS: alev = 12; break; + case TOOL_CLASS: alev = 10; break; case SCROLL_CLASS: alev = 9; break; case POTION_CLASS: alev = 6; break; + case RING_CLASS: alev = 5; break; default: alev = u.ulevel; break; /* spell */ } /* defense level */ *************** *** 3789,3806 **** else if (dlev < 1) dlev = is_mplayer(mtmp->data) ? u.ulevel : 1; resisted = rn2(100 + alev - dlev) < mtmp->data->mr; ! if(resisted) { ! ! if(tell) { ! shieldeff(mtmp->mx, mtmp->my); ! pline("%s resists!", Monnam(mtmp)); ! } ! mtmp->mhp -= damage/2; ! } else mtmp->mhp -= damage; ! if(mtmp->mhp < 1) { if(m_using) monkilled(mtmp, "", AD_RBRE); else killed(mtmp); } return(resisted); } --- 3999,4018 ---- else if (dlev < 1) dlev = is_mplayer(mtmp->data) ? u.ulevel : 1; resisted = rn2(100 + alev - dlev) < mtmp->data->mr; ! if (resisted) { ! if (tell) { ! shieldeff(mtmp->mx, mtmp->my); ! pline("%s resists!", Monnam(mtmp)); ! } ! damage = (damage + 1) / 2; ! } ! if (damage) { ! mtmp->mhp -= damage; ! if (mtmp->mhp < 1) { if(m_using) monkilled(mtmp, "", AD_RBRE); else killed(mtmp); + } } return(resisted); } *************** *** 3809,3841 **** makewish() { char buf[BUFSZ]; ! register struct obj *otmp; int tries = 0; if (flags.verbose) You("may wish for an object."); retry: getlin("For what do you wish?", buf); if(buf[0] == '\033') buf[0] = 0; /* * Note: if they wished for and got a non-object successfully, ! * otmp == &zeroobj */ ! otmp = readobjnam(buf); if (!otmp) { pline("Nothing fitting that description exists in the game."); if (++tries < 5) goto retry; pline(thats_enough_tries); ! if (!(otmp = readobjnam((char *)0))) ! return; /* for safety; should never happen */ } /* KMH, conduct */ u.uconduct.wishes++; if (otmp != &zeroobj) { ! if(otmp->oartifact && !touch_artifact(otmp,&youmonst)) ! dropy(otmp); ! else /* The(aobjnam()) is safe since otmp is unidentified -dlc */ (void) hold_another_object(otmp, u.uswallow ? "Oops! %s out of your reach!" : --- 4021,4073 ---- makewish() { char buf[BUFSZ]; ! struct obj *otmp, nothing; int tries = 0; + nothing = zeroobj; /* lint suppression; only its address matters */ if (flags.verbose) You("may wish for an object."); retry: getlin("For what do you wish?", buf); if(buf[0] == '\033') buf[0] = 0; /* * Note: if they wished for and got a non-object successfully, ! * otmp == &zeroobj. That includes gold, or an artifact that ! * has been denied. Wishing for "nothing" requires a separate ! * value to remain distinct. */ ! otmp = readobjnam(buf, ¬hing, TRUE); if (!otmp) { pline("Nothing fitting that description exists in the game."); if (++tries < 5) goto retry; pline(thats_enough_tries); ! otmp = readobjnam((char *)0, (struct obj *)0, TRUE); ! if (!otmp) return; /* for safety; should never happen */ ! } else if (otmp == ¬hing) { ! /* explicitly wished for "nothing", presumeably attempting ! to retain wishless conduct */ ! return; } /* KMH, conduct */ u.uconduct.wishes++; if (otmp != &zeroobj) { ! /* place_object looses these */ ! boolean crysknife = (otmp->otyp == CRYSKNIFE); ! int oerode = otmp->oerodeproof; ! ! /* in case touching this object turns out to be fatal */ ! place_object(otmp, u.ux, u.uy); ! ! if (otmp->oartifact && !touch_artifact(otmp,&youmonst)) { ! obj_extract_self(otmp); /* remove it from the floor */ ! dropy(otmp); /* now put it back again :-) */ ! } else { ! obj_extract_self(otmp); ! if (crysknife) { ! otmp->otyp = CRYSKNIFE; ! otmp->oerodeproof = oerode; ! } /* The(aobjnam()) is safe since otmp is unidentified -dlc */ (void) hold_another_object(otmp, u.uswallow ? "Oops! %s out of your reach!" : *************** *** 3846,3851 **** --- 4078,4084 ---- Is_airlevel(&u.uz) || u.uinwater ? "slip" : "drop")), (const char *)0); + } u.ublesscnt += rn1(100,50); /* the gods take notice */ } } *** nethack-3.3.1/sys/amiga/amidos.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amidos.c Thu Mar 21 07:37:38 2002 *************** *** 18,24 **** #include #undef COUNT ! #ifdef __SASC_60 # include # include #endif --- 18,24 ---- #include #undef COUNT ! #if defined(__SASC_60) || defined(__GNUC__) # include # include #endif *************** *** 80,93 **** dosh() { int i; ! char buf[ 500 ]; extern struct ExecBase *SysBase; /* Only under 2.0 and later ROMs do we have System() */ if( SysBase->LibNode.lib_Version >= 37 && !amibbs) { getlin("Enter CLI Command...", buf ); ! i = System( buf, NULL ); } else { --- 80,94 ---- dosh() { int i; ! char buf[ BUFSZ ]; extern struct ExecBase *SysBase; /* Only under 2.0 and later ROMs do we have System() */ if( SysBase->LibNode.lib_Version >= 37 && !amibbs) { getlin("Enter CLI Command...", buf ); ! if (buf[0] != '\033') ! i = System( buf, NULL ); } else { *************** *** 225,230 **** --- 226,232 ---- /* This size makes that most files can be copied with two Read()/Write()s */ + #if 0 /* Unused */ #define COPYSIZE 4096 char *CopyFile(from, to) *************** *** 257,263 **** free(buffer); return error; } ! /* this should be replaced */ saveDiskPrompt(start) --- 259,265 ---- free(buffer); return error; } ! #endif /* this should be replaced */ saveDiskPrompt(start) *************** *** 423,429 **** static BPTR OrgDirLock = NO_LOCK; chdir(dir) ! const char *dir; { extern char orgdir[]; --- 425,431 ---- static BPTR OrgDirLock = NO_LOCK; chdir(dir) ! char *dir; { extern char orgdir[]; *** nethack-3.3.1/sys/amiga/amii.hlp Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amii.hlp Thu Mar 21 07:37:39 2002 *************** *** 1,4 **** ! Amiga-specific help file for NetHack 3.3 The Amiga port of NetHack supports a number of additional commands and facilities specific to the Amiga. Listed below are the things --- 1,4 ---- ! Amiga-specific help file for NetHack 3.4 The Amiga port of NetHack supports a number of additional commands and facilities specific to the Amiga. Listed below are the things *** nethack-3.3.1/sys/amiga/amimenu.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amimenu.c Thu Mar 21 07:37:39 2002 *************** *** 90,95 **** { NM_ITEM, "M-w #wipe off your face", 0, 0, 0, (void *)(128+'w')}, { NM_ITEM, " Your #conduct", 0, 0, 0, (void *)'#'}, /* "#co\n" */ { NM_ITEM, " #ride your steed", 0, 0, 0, (void *)'#'}, /* "#ri\n" */ ! { NM_ITEM, " Switch #twoweapon mode on/off", 0, 0, 0, (void *)'#'}, /* "#tw\n" */ { NM_END, NULL, 0, 0, 0, 0} }; --- 90,95 ---- { NM_ITEM, "M-w #wipe off your face", 0, 0, 0, (void *)(128+'w')}, { NM_ITEM, " Your #conduct", 0, 0, 0, (void *)'#'}, /* "#co\n" */ { NM_ITEM, " #ride your steed", 0, 0, 0, (void *)'#'}, /* "#ri\n" */ ! { NM_ITEM, "M-2 Switch #twoweapon mode on/off", 0, 0, 0, (void *)(128+'2')}, { NM_END, NULL, 0, 0, 0, 0} }; *** nethack-3.3.1/sys/amiga/amirip.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amirip.c Thu Mar 21 07:37:39 2002 *************** *** 113,119 **** int line, tw, ww; char *errstr = NULL; ! if(HackScreen->RastPort.BitMap->Depth < 4)goto cleanup; /* Use the users display size */ newwin.Height = amiIDisplay->ypix - newwin.TopEdge; --- 113,119 ---- int line, tw, ww; char *errstr = NULL; ! if(!WINVERS_AMIV || HackScreen->RastPort.BitMap->Depth < 4)goto cleanup; /* Use the users display size */ newwin.Height = amiIDisplay->ypix - newwin.TopEdge; *************** *** 132,137 **** --- 132,142 ---- wh = ripwin->Height; ww = ripwin->Width; + #ifdef HACKFONT + if (HackFont) + SetFont(rp, HackFont); + #endif + tomb_bmhd = ReadImageFiles(load_list, tbmp, &errstr ); if(errstr)goto cleanup; if(tomb_bmhd.w > ww || tomb_bmhd.h > wh)goto cleanup; *************** *** 144,159 **** cmap_white = search_cmap(0,0,0); cmap_black = search_cmap(15,15,15); ! { ! int j,k; ! for( j = 0; j < 4; ++j ){ ! for( k = 0; k < tomb_bmhd.h ; ++k ){ ! memcpy(rp->BitMap->Planes[ j ] +(k+yoff)*(rp->BitMap->BytesPerRow) + (xoff/8), ! tbmp[0]->Planes[ j ] + k*((tomb_bmhd.w+7)/8), ! (tomb_bmhd.w +7)/8 ); ! } ! } ! } /* Put together death description */ switch (killer_format) { --- 149,155 ---- 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, 0xc0, 0xff, NULL); /* Put together death description */ switch (killer_format) { *************** *** 199,205 **** tomb_text(buf); /* Put $ on stone */ ! Sprintf(buf, "%ld Au", u.ugold); buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */ tomb_text(buf); --- 195,206 ---- tomb_text(buf); /* Put $ on stone */ ! Sprintf(buf, "%ld Au", ! #ifndef GOLDOBJ ! u.ugold); ! #else ! done_money); ! #endif buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */ tomb_text(buf); *************** *** 256,262 **** Sprintf(buf, "%4d", getyear()); tomb_text(buf); ! /* dedication */ cno = 1; tomb_line=TEXT_TOP; --- 257,263 ---- Sprintf(buf, "%4d", getyear()); tomb_text(buf); ! #ifdef NH320_DEDICATION /* dedication */ cno = 1; tomb_line=TEXT_TOP; *************** *** 272,278 **** tomb_text("1935-1994"); tomb_text(""); tomb_text("Ascended"); ! /* Fade from black to full color */ dofade(0,16,1); --- 273,279 ---- tomb_text("1935-1994"); tomb_text(""); tomb_text("Ascended"); ! #endif /* Fade from black to full color */ dofade(0,16,1); *** nethack-3.3.1/sys/amiga/amisnd.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amisnd.c Thu Mar 21 07:37:40 2002 *************** *** 158,164 **** if( AudioIO == 0 ) goto killaudio; ! AudioMP = CreatePort( NULL, 0 ); if( AudioMP == 0 ) goto killaudio; --- 158,164 ---- if( AudioIO == 0 ) goto killaudio; ! AudioMP = CreateMsgPort(); if( AudioMP == 0 ) goto killaudio; *************** *** 279,284 **** if( stream ) dlb_fclose( stream ); if( waveptr ) FreeMem( waveptr, samples ); if( device == 0 ) CloseDevice( (struct IORequest *)AudioIO ); ! if( AudioMP ) DeletePort( AudioMP ); if( AudioIO ) FreeMem( AudioIO, sizeof( *AudioIO ) ); } --- 279,284 ---- 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 ) ); } *** nethack-3.3.1/sys/amiga/amistack.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amistack.c Thu Mar 21 07:37:40 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)amistack.c 3.3 2000/05/03 */ /* Copyright (c) Janne Salmijärvi, Tampere, Finland, 2000 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)amistack.c 3.4 2000/05/03 */ /* Copyright (c) Janne Salmijärvi, Tampere, Finland, 2000 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/amiga/amitty.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amitty.c Thu Mar 21 07:37:40 2002 *************** *** 25,31 **** #ifdef TTY_GRAPHICS ! extern long afh_in; void settty(const char *s){ end_screen(); --- 25,33 ---- #ifdef TTY_GRAPHICS ! int amibbs=0; /* BBS mode */ ! char bbs_id[80]=""; /* BBS uid equivalent */ ! long afh_in, afh_out; /* BBS mode Amiga filehandles */ void settty(const char *s){ end_screen(); *** nethack-3.3.1/sys/amiga/amiwind.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/amiwind.c Thu Mar 21 07:37:40 2002 *************** *** 21,27 **** --- 21,31 ---- #define BufferQueueChar(ch) (KbdBuffer[KbdBuffered++] = (ch)) + #ifdef __GNUC__ /* Conflicting includefiles ... */ + struct Device *ConsoleDevice; + #else struct Library *ConsoleDevice; + #endif #include "NH:sys/amiga/amimenu.c" *************** *** 42,49 **** struct Library *DiskfontBase; #endif - extern struct Library *ConsoleDevice; - #define KBDBUFFER 10 static unsigned char KbdBuffer[KBDBUFFER]; unsigned char KbdBuffered; --- 46,51 ---- *************** *** 208,214 **** return( -1 ); } #ifdef CLIPPING ! else if( control ) { EditClipping(); --- 210,216 ---- return( -1 ); } #ifdef CLIPPING ! else if( WINVERS_AMIV && control ) { EditClipping(); *************** *** 290,295 **** --- 292,302 ---- length = numpad[length]; } } + + /* Kludge to allow altmeta on eg. scandinavian keymap (# == shift+alt+3) + and prevent it from interfering with # command (M-#) */ + if (length == ('#'|0x80)) + return '#'; if (alt && flags.altmeta) length |= 0x80; return(length); *************** *** 628,634 **** ConsoleIO.io_Device = 0; if( ConsoleIO.io_Message.mn_ReplyPort ) ! DeletePort( ConsoleIO.io_Message.mn_ReplyPort ); ConsoleIO.io_Message.mn_ReplyPort = 0; /* Strip messages before deleting the port */ --- 635,641 ---- ConsoleIO.io_Device = 0; if( ConsoleIO.io_Message.mn_ReplyPort ) ! DeleteMsgPort( ConsoleIO.io_Message.mn_ReplyPort ); ConsoleIO.io_Message.mn_ReplyPort = 0; /* Strip messages before deleting the port */ *************** *** 638,644 **** while (msg = (struct IntuiMessage *) GetMsg(HackPort)) ReplyMsg((struct Message *) msg); kill_nhwindows( 1 ); ! DeletePort( HackPort ); HackPort = NULL; Permit(); } --- 645,651 ---- while (msg = (struct IntuiMessage *) GetMsg(HackPort)) ReplyMsg((struct Message *) msg); kill_nhwindows( 1 ); ! DeleteMsgPort( HackPort ); HackPort = NULL; Permit(); } *************** *** 700,707 **** } #endif ! if( WINVERS_AMIV && LayersBase) ! { CloseLibrary((struct Library *)LayersBase); LayersBase = NULL; } --- 707,718 ---- } #endif ! if (GadToolsBase) { ! CloseLibrary((struct Library *)GadToolsBase); ! GadToolsBase=NULL; ! } ! ! if (LayersBase) { CloseLibrary((struct Library *)LayersBase); LayersBase = NULL; } *************** *** 866,871 **** --- 877,883 ---- nwin->FirstGadget = ngd; pgd = ngd; ngd->NextGadget = NULL; + ngd->UserData = (APTR) 0x45f35c3d; // magic cookie for FreeNewWindow() } return( nwin ); } *************** *** 877,897 **** register struct Gadget *gd, *pgd; register struct StringInfo *sip; ! for( gd = win->FirstGadget; gd; gd = pgd ) ! { pgd = gd->NextGadget; ! if( gd->GadgetType == STRGADGET ) ! { ! sip = (struct StringInfo *)gd->SpecialInfo; ! free( sip->Buffer ); ! free( sip ); ! } ! else if( gd->GadgetType == PROPGADGET ) ! ! { ! free( (struct PropInfo *)gd->SpecialInfo ); } - free( gd ); } free( win ); } --- 889,906 ---- register struct Gadget *gd, *pgd; register struct StringInfo *sip; ! for( gd = win->FirstGadget; gd; gd = pgd ) { pgd = gd->NextGadget; ! if ((ULONG)gd->UserData == 0x45f35c3d) { ! if( gd->GadgetType == STRGADGET ) { ! sip = (struct StringInfo *)gd->SpecialInfo; ! free( sip->Buffer ); ! free( sip ); ! } else if( gd->GadgetType == PROPGADGET ) { ! free( (struct PropInfo *)gd->SpecialInfo ); ! } ! free( gd ); } } free( win ); } *** nethack-3.3.1/sys/amiga/Build.ami Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/sys/amiga/Build.ami Thu Mar 21 07:37:40 2002 *************** *** 1,6 **** ! Compiling Amiga NetHack 3.2 ! Last Revision: 5 November 1996 for NetHack 3.2.2 We would like to thank each and every one of the people who took --- 1,6 ---- ! Compiling Amiga NetHack 3.4 ! Last Revision: 21 February 2002 for NetHack 3.4.0 We would like to thank each and every one of the people who took *************** *** 15,50 **** 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@linc.cis.upenn.edu, 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. 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.2 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 - almost 7 meg (and subject to change; more if you are ! not doing the simple compile - more on that later). It also needs a ! good bit of memory, especially for linking. II.B. Basic Compilation ! NetHack can be built with SAS/C version 6.55 or the commercial version ! of DICE. The "official" compiler for NetHack 3.2 is SAS/C 6.55 - 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. 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 --- 15,53 ---- 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.4 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 *************** *** 76,103 **** 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). 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). If you wish to modify the Intuition ! windows in HackWB, the (uuencoded) PowerWindows files are provided. 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.55 NOTE WELL - Amiga NetHack has dropped support for SAS/C version 5. ! This version of NetHack was developed with SAS/C 6.55. Earlier versions ! 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: --- 79,105 ---- 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: *************** *** 105,111 **** 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. - (But note that this is not useful for split binaries - see below.) * The 5.10b optimizer did not produce correct code for NetHack. The current optimizer has not been tested. --- 107,112 ---- *************** *** 143,167 **** During compilation, DICE will output a lot of warnings; they can be safely ignored. - - II.C. Advanced Compilation - As mentioned above, NetHack is very large. There are several - techniques under development by the Amiga NetHack Team for dealing - with the situation. As they are completed, they will be documented - here. Before attempting any of them, you MUST do a "normal" build - as documented above; the techniques described below require the - auxiliary files from a normal build to form a complete NetHack - installation. - - II.C.1. Splitter - Splitter addresses two problems with NetHack: first, the long startup - time of the game, and second, the size of the binary (which will not fit - on a single floppy disk). See the file sys/amiga/splitter/split.doc for - information on splitter. The normal install target in Makefile.ami will - build the split version of NetHack as part of the normal install process; - the front ends will run from either the normal version (HackExe:NetHack) - or, preferably, from the split version (NetHack.c#? NetHack.d#?) - the - decision is based on the presence (or absence) of HackExe:NetHack.dir. - Note that the contents of NetHack.dir after a build will generally not - be the correct contents for a floppy based system. - --- 144,146 ---- *** nethack-3.3.1/sys/amiga/Install.ami Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/sys/amiga/Install.ami Thu Mar 21 07:37:40 2002 *************** *** 1,13 **** ! Using and Installing Amiga NetHack 3.3 (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.3.1 ! 0. Pre-intro for NetHack 3.3.1: ! Amiga-specific changes for 3.3.1: Most (around 99%) known bugs fixed (volunteers welcome). HackWB and HackCli are no longer supported. Use the main binary. --- 1,13 ---- ! 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.0 ! 0. Pre-intro for NetHack 3.4.0: ! Amiga-specific changes for 3.4.0: Most (around 99%) known bugs fixed (volunteers welcome). HackWB and HackCli are no longer supported. Use the main binary. *************** *** 24,32 **** 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.3) 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.3); please also see the general guide packaged separately (the file "GuideBook"). To all our visitors, a hearty Welcome! - and please be careful. --- 24,32 ---- 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.4) 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.4); please also see the general guide packaged separately (the file "GuideBook"). To all our visitors, a hearty Welcome! - and please be careful. *************** *** 54,62 **** 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. ! II. Using Amiga NetHack 3.3 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. --- 54,62 ---- 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. *************** *** 71,80 **** menu or by pressing Help key. II.B. The Amiga NetHack WorkBench Front End ! 3.3.1 no longer supports HackWB. II.C. The Amiga NetHack CLI Front End ! 3.3.1 no longer supports CLI Front End 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 --- 71,80 ---- 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 *************** *** 102,109 **** while counting or deselect and reselect the item. The default is to drop all selected items (as before). ! III. Installing Amiga NetHack 3.3 III.A. General Installation Installation should be easy - basically it consists of putting files --- 102,111 ---- 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 *************** *** 114,125 **** 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.0). 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.3 is large. NetHack 3.3 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). --- 116,127 ---- 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.4 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). *** nethack-3.3.1/sys/amiga/Makefile.ami Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/sys/amiga/Makefile.ami Thu Mar 21 07:37:40 2002 *************** *** 1,5 **** # NetHack Makefile. ! # SCCS Id: @(#)Makefile.ami 3.2 2000/01/12 # Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991,1992,1993,1996. # NetHack may be freely redistributed. See license for details. --- 1,5 ---- # NetHack Makefile. ! # SCCS Id: @(#)Makefile.ami 3.4 2002/21/02 # Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991,1992,1993,1996. # NetHack may be freely redistributed. See license for details. *************** *** 131,137 **** # 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 = #[MANX] --- 131,137 ---- # 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] *************** *** 212,232 **** # undefine this to not compile with GSTs #GST=gst=$(GSTFILE) # ! #DEBUG=debug=sf ! OPTFLAGS=opt opttime optpeep optgo optinl optsched optcomp=10 optdep=5 optrdep=5 #optalias +OPTTIME -OPTSIZE ! CFLAGS = data=far nominc $(DEBUG) idir=$(I) cpu=any 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=any afp \ $(DEBUG) $(ERRREXX) define=AMIGA $(GST) ! XXX = data=far ansi nminc idir=$(I) cpu=any 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=any nover nostkchk \ codename=nhcode strmerge $(OPTFLAGS) $(TILES) $(SAVEDS) \ afp $(ERRREXX) $(GST) --- 212,233 ---- # 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) *************** *** 289,295 **** #[SAS6] ! LINK = slink noicons verbose maxhunk 65536 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 --- 290,296 ---- #[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 *************** *** 366,397 **** $(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)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)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)amiwbench.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 \ ! $(O)amistack.o # Objects from assembly sources (because DMake can't handle default rules) AMIGAOBJ2 = \ --- 367,398 ---- $(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)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 = \ *************** *** 516,523 **** 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) \ --- 517,523 ---- 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) \ *************** *** 532,543 **** #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 #$(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: $(HOBJ) $(AMI)ami.lnk $(LINK) $(LNSPEC) $(SBIN)NetHack $(LIN) $(LLINK) $(LLIB) --- 532,541 ---- #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) *************** *** 1334,1340 **** # 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 --- 1332,1338 ---- # 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 *************** *** 1426,1431 **** --- 1424,1431 ---- $(O)makemon.o: $(NHS)makemon.c $(HDEP) $(I)epri.h $(I)emin.h $(I)edog.h + $(O)mapglyph.o: $(NHS)mapglyph.c $(HDEP) + $(O)mcastu.o: $(NHS)mcastu.c $(HDEP) $(O)mhitm.o: $(NHS)mhitm.c $(HDEP) $(I)artifact.h $(I)edog.h *************** *** 1676,1678 **** --- 1676,1679 ---- #notes # install keeps doing re-install because it keeps rebuilding lev_comp??? # fixed(?) - deleted setdate + # make nhdat rebuils sys/amiga objects *** nethack-3.3.1/sys/amiga/NetHack.cnf Thu Feb 14 07:59:31 2002 --- nethack-3.4.0/sys/amiga/NetHack.cnf Thu Mar 21 07:37:41 2002 *************** *** 11,17 **** # use it, options like these should not be set here - use the command line #OPTIONS=name:Janet-V,female,dogname:Fido,fruit:apricot #OPTIONS=packorder:")[%?+/=!(*0_`,scores:10t/2a,noverbose ! # Other general options #OPTIONS=time,rest_on_space,noautopickup --- 11,20 ---- # use it, options like these should not be set here - use the command line #OPTIONS=name:Janet-V,female,dogname:Fido,fruit:apricot #OPTIONS=packorder:")[%?+/=!(*0_`,scores:10t/2a,noverbose ! #OPTIONS=gender:male ! #OPTIONS=role:random ! #OPTIONS=race:random ! #OPTIONS=align:chaotic # Other general options #OPTIONS=time,rest_on_space,noautopickup *************** *** 20,26 **** # My own setup #OPTIONS=nolegacy,fruit:lemon,time,autopickup,checkpoint,showexp,showscore,standout,nonews ! #OPTIONS=nomail,flush,eight_bit_tty,scores:10t/2a,pickup_types:$,suppress_alert:3.3.0 # The windowtype option must be set before any options regarding colors and palette # are set otherwise previously set values will be overridden by the defaults --- 23,29 ---- # My own setup #OPTIONS=nolegacy,fruit:lemon,time,autopickup,checkpoint,showexp,showscore,standout,nonews ! #OPTIONS=nomail,flush,eight_bit_tty,scores:10t/2a,pickup_types:$,suppress_alert:3.3.0,autoquiver # The windowtype option must be set before any options regarding colors and palette # are set otherwise previously set values will be overridden by the defaults *************** *** 34,41 **** # A hard disk configuration. # HACKDIR=NetHack: ! LEVELS=Nethack:levels ! SAVE=Nethack:save # *** CHARACTER GRAPHICS *** # --- 37,49 ---- # A hard disk configuration. # HACKDIR=NetHack: ! LEVELS=Nethack:Levels ! SAVE=Nethack:Save ! BONESDIR=Nethack:Levels ! SCOREDIR=Nethack: ! LOCKDIR=Nethack: ! CONFIGDIR=Nethack: ! DATADIR=Nethack: # *** CHARACTER GRAPHICS *** # *************** *** 60,71 **** 244 245 246 247 239 248 249 250 \ 230 234 231 236 212 237 232 235 233 ! WARNING = 048 049 050 051 052 053 # Monitors vary greatly in their color response. If the default colors # are not good on your monitor, here are some other alternatives for the # font version of the game: # #CBM 1960, set color/contrast for good pure red, green, and blue. True colors. #PENS=000,fff,a61,7bb,0f0,e0c,00f,f00 #CBM 1960, set color/contrast as above, better colors for NetHack. --- 68,81 ---- 244 245 246 247 239 248 249 250 \ 230 234 231 236 212 237 232 235 233 ! WARNINGS = 048 049 050 051 052 053 # Monitors vary greatly in their color response. If the default colors # are not good on your monitor, here are some other alternatives for the # font version of the game: # + # Last color of the palette is always used for the cursor. + # #CBM 1960, set color/contrast for good pure red, green, and blue. True colors. #PENS=000,fff,a61,7bb,0f0,e0c,00f,f00 #CBM 1960, set color/contrast as above, better colors for NetHack. *************** *** 135,144 **** --- 145,169 ---- #TEXTPENS=0,14 #OTHERPENS=1,12 # + # New alternative color scheme for 16 color font mode. + # This changes the colors of monsters, objects etc. + # + # FGPENS and BGPENS define APEN and BPEN for objects and monsters on the map. + # The colors are in the following order: + # black, red, green, brown, blue, magenta, cyan, gray, no color, orange, + # bright green, yellow, bright blue, bright magenta, bright cyan, white + # + DEPTH=4 + PENS=000,fff,830,7ac,181,c06,23e,c00,888,f60,4f4,ff0,4af,f8f,8ff,f00 + FGPENS= 0, 7, 4, 2, 6, 5, 3, 8, 1, 9,10,11,12,13,14, 1 + BGPENS= 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + # # Screen mode selections below should all work for either the font or tile # version of the game. Other modes can be tried and as long as they are at # least 640x200, the game should adapt to them... # + # Select screenmode with a requester + #SCREENMODE=Req # NTSC_MONITOR_ID #SCREENMODE=0x00019000 # PAL_MONITOR_ID *** nethack-3.3.1/sys/amiga/txt2iff.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/txt2iff.c Thu Mar 21 07:37:41 2002 *************** *** 18,27 **** #include #include #ifndef _DCC ! # include ! # include ! # include ! # include #endif void panic(const char *); --- 18,26 ---- #include #include #ifndef _DCC ! # include ! # include ! # include #endif void panic(const char *); *************** *** 60,66 **** #define ID_PLNE MAKE_ID( 'P', 'L', 'N', 'E' ) /* The planes of the image */ - extern struct DOSBase *DOSBase; #ifndef _DCC extern #endif --- 59,64 ---- *************** *** 136,142 **** exit(1); } ! #ifdef _DCC IFFParseBase = OpenLibrary( "iffparse.library", 0 ); if( !IFFParseBase ) { error( "unable to open iffparse.library" ); --- 134,140 ---- exit(1); } ! #if defined(_DCC) || defined(__GNUC__) IFFParseBase = OpenLibrary( "iffparse.library", 0 ); if( !IFFParseBase ) { error( "unable to open iffparse.library" ); *************** *** 284,290 **** printf( "\n%d tiles converted\n", cnt ); ! #ifdef _DCC CloseLibrary( IFFParseBase ); #endif exit( 0 ); --- 282,288 ---- printf( "\n%d tiles converted\n", cnt ); ! #if defined(_DCC) || defined(__GNUC__) CloseLibrary( IFFParseBase ); #endif exit( 0 ); *** nethack-3.3.1/sys/amiga/winami.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/winami.c Thu Mar 21 07:37:41 2002 *************** *** 29,34 **** --- 29,35 ---- struct window_procs amii_procs = { "amii", + WC_COLOR|WC_HILITE_PET|WC_INVERSE, amii_init_nhwindows, amii_player_selection, amii_askname, *************** *** 76,82 **** /* other defs that really should go away (they're tty specific) */ amii_delay_output, amii_delay_output, ! amii_outrip }; /* The view window layout uses the same function names so we can use --- 77,84 ---- /* other defs that really should go away (they're tty specific) */ amii_delay_output, amii_delay_output, ! amii_outrip, ! genl_preference_update }; /* The view window layout uses the same function names so we can use *************** *** 85,90 **** --- 87,93 ---- struct window_procs amiv_procs = { "amitile", + WC_COLOR|WC_HILITE_PET|WC_INVERSE, amii_init_nhwindows, amii_player_selection, amii_askname, *************** *** 132,142 **** /* other defs that really should go away (they're tty specific) */ amii_delay_output, amii_delay_output, ! amii_outrip }; unsigned short amii_initmap[ AMII_MAXCOLORS ]; ! /* Default pens used unless use overides in nethack.cnf. */ unsigned short amii_init_map[ AMII_MAXCOLORS ] = { 0x0000, /* color #0 C_BLACK */ --- 135,146 ---- /* other defs that really should go away (they're tty specific) */ amii_delay_output, amii_delay_output, ! amii_outrip, ! genl_preference_update }; unsigned short amii_initmap[ AMII_MAXCOLORS ]; ! /* Default pens used unless user overides in nethack.cnf. */ unsigned short amii_init_map[ AMII_MAXCOLORS ] = { 0x0000, /* color #0 C_BLACK */ *************** *** 235,242 **** --- 239,248 ---- */ #ifdef INTUI_NEW_LOOK + extern struct Hook fillhook; struct TagItem tags[] = { + { WA_BackFill, (ULONG)&fillhook }, { WA_PubScreenName, (ULONG)"NetHack" }, { TAG_DONE, 0 }, }; *************** *** 262,270 **** |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)"Messages",NULL,NULL,320,40,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,1,1,80,80}, --- 268,278 ---- |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)"Messages",NULL,NULL,320,40,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,1,1,80,80}, *************** *** 278,286 **** |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)"Game Status",NULL,NULL,0,0,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,2,2,78,78}, --- 286,296 ---- |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)"Game Status",NULL,NULL,0,0,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,2,2,78,78}, *************** *** 294,302 **** |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)"Dungeon Map",NULL,NULL,64,64,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,22,22,80,80}, --- 304,314 ---- |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)"Dungeon Map",NULL,NULL,64,64,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,22,22,80,80}, *************** *** 311,319 **** |WFLG_NW_EXTENDED #endif , ! &MenuScroll,NULL,NULL,NULL,NULL,64,32,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,1,1,22,78}, --- 323,333 ---- |WFLG_NW_EXTENDED #endif , ! &MenuScroll,NULL,NULL,NULL,NULL,64,32,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,1,1,22,78}, *************** *** 328,336 **** |WFLG_NW_EXTENDED #endif , ! &MenuScroll,NULL,(UBYTE*)NULL,NULL,NULL,100,32,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,1,1,22,78}, --- 342,352 ---- |WFLG_NW_EXTENDED #endif , ! &MenuScroll,NULL,(UBYTE*)NULL,NULL,NULL,100,32,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,1,1,22,78}, *************** *** 344,352 **** |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)NULL,NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,22,22,80,80}, --- 360,370 ---- |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)NULL,NULL,NULL,-1,-1,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,22,22,80,80}, *************** *** 360,368 **** |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)NULL,NULL,NULL,64,32,0xffff,0xffff,CUSTOMSCREEN, #ifdef INTUI_NEW_LOOK ! tags #endif }, 0,0,22,22,80,80}, --- 378,388 ---- |WFLG_NW_EXTENDED #endif , ! NULL,NULL,(UBYTE*)NULL,NULL,NULL,64,32,0xffff,0xffff, #ifdef INTUI_NEW_LOOK ! PUBLICSCREEN,tags ! #else ! CUSTOMSCREEN #endif }, 0,0,22,22,80,80}, *************** *** 423,432 **** void amii_askname() { ! *plname = 0; do { ! amii_getlin( "Who are you?", plname ); ! } while( strlen( plname ) == 0 ); if( *plname == '\33' ) { --- 443,456 ---- void amii_askname() { ! char plnametmp[300]; /* From winreq.c: sizeof(StrStringSIBuff) */ ! *plnametmp = 0; do { ! amii_getlin( "Who are you?", plnametmp ); ! } while( strlen( plnametmp ) == 0 ); ! ! strncpy(plname, plnametmp, PL_NSIZ-1); /* Avoid overflowing plname[] */ ! plname[PL_NSIZ-1] = 0; if( *plname == '\33' ) { *************** *** 605,617 **** int ticks = 0, aredone = 0, timerdone = 0; long mask, got; ! tport = CreatePort( 0, 0 ); ! trq = (struct timerequest *)CreateExtIO( tport, sizeof( *trq ) ); if( tport == NULL || trq == NULL ) { allocerr: ! if( tport ) DeletePort( tport ); ! if( trq ) DeleteExtIO( (struct IORequest *)trq ); Delay( 8 * 50 ); return; } --- 629,641 ---- int ticks = 0, aredone = 0, timerdone = 0; long mask, got; ! tport = CreateMsgPort(); ! trq = (struct timerequest *)CreateIORequest( tport, sizeof( *trq ) ); if( tport == NULL || trq == NULL ) { allocerr: ! if( tport ) DeleteMsgPort( tport ); ! if( trq ) DeleteIORequest( (struct IORequest *)trq ); Delay( 8 * 50 ); return; } *************** *** 682,689 **** AbortIO( (struct IORequest *)trq ); WaitIO( (struct IORequest *)trq ); CloseDevice( (struct IORequest *)trq ); ! DeleteExtIO( (struct IORequest *) trq ); ! DeletePort( tport ); Delay( 50 * 8 ); return; } --- 706,713 ---- AbortIO( (struct IORequest *)trq ); WaitIO( (struct IORequest *)trq ); CloseDevice( (struct IORequest *)trq ); ! DeleteIORequest( (struct IORequest *) trq ); ! DeleteMsgPort( tport ); Delay( 50 * 8 ); return; } *************** *** 734,741 **** } CloseDevice( (struct IORequest *)trq ); ! DeleteExtIO( (struct IORequest *) trq ); ! DeletePort( tport ); if(w) CloseShWindow( w ); } #endif /* Discarded randwin ... -jhsa */ --- 758,765 ---- } CloseDevice( (struct IORequest *)trq ); ! DeleteIORequest( (struct IORequest *) trq ); ! DeleteMsgPort( tport ); if(w) CloseShWindow( w ); } #endif /* Discarded randwin ... -jhsa */ *************** *** 1176,1182 **** { if (complain) { sprintf( buf, "Can't display %s: %s", fn, ! #ifdef _DCC strerror(errno) #else # ifdef __SASC_60 --- 1200,1206 ---- { if (complain) { sprintf( buf, "Can't display %s: %s", fn, ! #if defined(_DCC) || defined(__GNUC__) strerror(errno) #else # ifdef __SASC_60 *************** *** 1385,1404 **** { int i, k, n; char pick4u = 'n', thisch, lastch = 0; ! char pbuf[QBUFSZ]; winid win; anything any; menu_item *selected = 0; /* Should we randomly pick for the player? */ if (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE || flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE) { ! const char *prompt = "Shall I pick a character for you?"; ! pick4u = amii_yn_function(prompt, "ynq", 'y'); if (pick4u != 'y' && pick4u != 'n') { give_up: /* Quit */ if (selected) free((genericptr_t) selected); exit_nhwindows(NULL); terminate(0); /*NOTREACHED*/ --- 1409,1441 ---- { int i, k, n; char pick4u = 'n', thisch, lastch = 0; ! char pbuf[QBUFSZ], plbuf[QBUFSZ], rolenamebuf[QBUFSZ]; winid win; anything any; menu_item *selected = 0; + rigid_role_checks(); + /* Should we randomly pick for the player? */ if (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE || flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE) { ! char *prompt = build_plselection_prompt(pbuf, QBUFSZ, flags.initrole, ! flags.initrace, flags.initgend, flags.initalign); ! pline("%s", prompt); ! do { /* loop until we get valid input */ ! cursor_on(WIN_MESSAGE); ! pick4u = lowc(WindowGetchar()); ! cursor_off(WIN_MESSAGE); ! if (index(quitchars, pick4u)) pick4u = 'y'; ! } while(!index(ynqchars, pick4u)); ! pbuf[0] = pick4u; ! pbuf[1] = 0; ! amii_addtopl(pbuf); if (pick4u != 'y' && pick4u != 'n') { give_up: /* Quit */ if (selected) free((genericptr_t) selected); + clearlocks(); exit_nhwindows(NULL); terminate(0); /*NOTREACHED*/ *************** *** 1406,1420 **** } } /* 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) { /* Process the choice */ ! if (pick4u == 'y' || flags.initrole == ROLE_RANDOM) { /* Pick a random role */ flags.initrole = pick_role(flags.initrace, flags.initgend, ! flags.initalign); if (flags.initrole < 0) { amii_putstr(WIN_MESSAGE, 0, "Incompatible role!"); flags.initrole = randrole(); --- 1443,1460 ---- } } + (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) { /* 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) { amii_putstr(WIN_MESSAGE, 0, "Incompatible role!"); flags.initrole = randrole(); *************** *** 1430,1442 **** any.a_int = i+1; /* must be non-zero */ thisch = lowc(roles[i].name.m[0]); if (thisch == lastch) thisch = highc(thisch); add_menu(win, NO_GLYPH, &any, thisch, ! 0, ATR_NONE, an(roles[i].name.m), MENU_UNSELECTED); lastch = thisch; } } any.a_int = pick_role(flags.initrace, flags.initgend, ! flags.initalign)+1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randrole()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, --- 1470,1495 ---- 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()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, *************** *** 1444,1450 **** any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, "Quit", MENU_UNSELECTED); ! end_menu(win, "Pick a role"); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 1497,1504 ---- 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); *************** *** 1455,1460 **** --- 1509,1516 ---- 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 */ *************** *** 1462,1470 **** * 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.initrace = pick_race(flags.initrole, flags.initgend, ! flags.initalign); if (flags.initrace < 0) { amii_putstr(WIN_MESSAGE, 0, "Incompatible race!"); flags.initrace = randrace(flags.initrole); --- 1518,1526 ---- * 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) { amii_putstr(WIN_MESSAGE, 0, "Incompatible race!"); flags.initrace = randrace(flags.initrole); *************** *** 1502,1508 **** 0, ATR_NONE, races[i].noun, MENU_UNSELECTED); } any.a_int = pick_race(flags.initrole, flags.initgend, ! flags.initalign)+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, --- 1558,1564 ---- 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, *************** *** 1510,1517 **** 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", ! roles[flags.initrole].name.m); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 1566,1572 ---- 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); *************** *** 1523,1528 **** --- 1578,1585 ---- } flags.initrace = k; } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); } /* Select a gender, if necessary */ *************** *** 1531,1539 **** if (flags.initgend < 0 || !validgend(flags.initrole, flags.initrace, flags.initgend)) { /* pre-selected gender not valid */ ! if (pick4u == 'y' || flags.initgend == ROLE_RANDOM) { flags.initgend = pick_gend(flags.initrole, flags.initrace, ! flags.initalign); if (flags.initgend < 0) { amii_putstr(WIN_MESSAGE, 0, "Incompatible gender!"); flags.initgend = randgend(flags.initrole, flags.initrace); --- 1588,1596 ---- 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) { amii_putstr(WIN_MESSAGE, 0, "Incompatible gender!"); flags.initgend = randgend(flags.initrole, flags.initrace); *************** *** 1571,1577 **** 0, ATR_NONE, genders[i].adj, MENU_UNSELECTED); } any.a_int = pick_gend(flags.initrole, flags.initrace, ! flags.initalign)+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, --- 1628,1634 ---- 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, *************** *** 1579,1587 **** 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 %s", ! races[flags.initrace].adj, ! roles[flags.initrole].name.m); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 1636,1642 ---- 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); *************** *** 1593,1598 **** --- 1648,1655 ---- } flags.initgend = k; } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); } /* Select an alignment, if necessary */ *************** *** 1600,1608 **** if (flags.initalign < 0 || !validalign(flags.initrole, flags.initrace, flags.initalign)) { /* pre-selected alignment not valid */ ! if (pick4u == 'y' || flags.initalign == ROLE_RANDOM) { flags.initalign = pick_align(flags.initrole, flags.initrace, ! flags.initgend); if (flags.initalign < 0) { amii_putstr(WIN_MESSAGE, 0, "Incompatible alignment!"); flags.initalign = randalign(flags.initrole, flags.initrace); --- 1657,1665 ---- 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) { amii_putstr(WIN_MESSAGE, 0, "Incompatible alignment!"); flags.initalign = randalign(flags.initrole, flags.initrace); *************** *** 1640,1646 **** 0, ATR_NONE, aligns[i].adj, MENU_UNSELECTED); } any.a_int = pick_align(flags.initrole, flags.initrace, ! flags.initgend)+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, --- 1697,1703 ---- 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, *************** *** 1648,1659 **** 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 %s %s", ! genders[flags.initgend].adj, ! races[flags.initrace].adj, ! (flags.initgend && roles[flags.initrole].name.f) ? ! roles[flags.initrole].name.f : ! roles[flags.initrole].name.m); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 1705,1711 ---- 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); *** nethack-3.3.1/sys/amiga/winchar.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/winchar.c Thu Mar 21 07:37:41 2002 *************** *** 8,16 **** #include #include #ifndef _DCC ! #include #endif - #include #ifdef TESTING # include "hack.h" --- 8,15 ---- #include #include #ifndef _DCC ! #include #endif #ifdef TESTING # include "hack.h" *************** *** 46,52 **** int amii_extraplanes = 0; extern int reclip; - struct Library *IFFParseBase; struct BitMap *MyAllocBitMap( int xsize, int ysize, int depth, long mflags ); void MyFreeBitMap( struct BitMap *bmp ); --- 45,50 ---- *************** *** 343,349 **** } iffimg[ i ] = MyAllocBitMap( bmhd->w, bmhd->h, ! pictdata.nplanes + amii_extraplanes, MEMF_CLEAR ); if( iffimg[ i ] == NULL ) { char *buf = malloc(80); --- 341,347 ---- } iffimg[ i ] = MyAllocBitMap( bmhd->w, bmhd->h, ! pictdata.nplanes + amii_extraplanes, MEMF_CHIP|MEMF_CLEAR ); if( iffimg[ i ] == NULL ) { char *buf = malloc(80); *************** *** 967,977 **** #ifdef TEXTCOLOR /* * Map our amiga-specific colormap into the colormap specified in color.h. ! * See amiwind.c for the amiga specific colormap. */ ! int foreg[16] = { 0, 7, 4, 2, 6, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; ! int backg[16] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 1, 6, 5, 3, 1 }; #if 0 #define CLR_BLACK 0 #define CLR_RED 1 --- 965,975 ---- #ifdef TEXTCOLOR /* * Map our amiga-specific colormap into the colormap specified in color.h. ! * See winami.c for the amiga specific colormap. */ ! int foreg[AMII_MAXCOLORS] = { 0, 7, 4, 2, 6, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; ! int backg[AMII_MAXCOLORS] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 1, 6, 5, 3, 1 }; #if 0 #define CLR_BLACK 0 #define CLR_RED 1 *** nethack-3.3.1/sys/amiga/windefs.h Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/windefs.h Thu Mar 21 07:37:41 2002 *************** *** 5,11 **** #include #include #include ! #ifndef _DCC #include #endif #include --- 5,11 ---- #include #include #include ! #if !defined(_DCC) && !defined(__GNUC__) #include #endif #include *************** *** 18,23 **** --- 18,24 ---- #include #include #include + #include /* stddef.h is included in the precompiled version of hack.h . If we include * it here normally (through string.h) we'll get an "illegal typedef" later * on. This is the easiest way I can think of to fix it without messing *************** *** 78,83 **** --- 79,85 ---- #include #include #include + #include #endif /* kludge - see amirip for why */ *** nethack-3.3.1/sys/amiga/winext.h Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/winext.h Thu Mar 21 07:37:41 2002 *************** *** 128,136 **** --- 128,144 ---- extern struct Hook fillhook; extern struct TagItem wintags[]; #ifndef SHAREDLIB + #ifndef __GNUC__ void __asm LayerFillHook( register __a0 struct Hook *hk, register __a2 struct RastPort *rp, register __a1 struct FillParams *fp ); + #else + #ifdef __PPC__ + struct EmulLibEntry LayerFillHook; + #else + void LayerFillHook(void); + #endif + #endif #endif extern int mxsize, mysize; *** nethack-3.3.1/sys/amiga/winfuncs.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/winfuncs.c Thu Mar 21 07:37:41 2002 *************** *** 26,31 **** --- 26,33 ---- struct Rectangle amii_oldover; struct Rectangle amii_oldmsg; + extern struct TextFont *RogueFont; + int amii_msgAPen; int amii_msgBPen; int amii_statAPen; *************** *** 123,132 **** --- 125,136 ---- } # ifdef INTUI_NEW_LOOK + struct Hook SM_FilterHook; struct Hook fillhook; struct TagItem wintags[] = { { WA_BackFill, (ULONG)&fillhook }, + { WA_PubScreenName, (ULONG)"NetHack" }, { TAG_END, 0 }, }; # endif *************** *** 191,201 **** dismiss_nhwindow(win); type = cw->type; ! if( cw->resp ) free( cw->resp ); ! if( cw->canresp ) free( cw->canresp ); ! if( cw->morestr ) free( cw->morestr ); ! if( cw->hook ) free( cw->hook ); ! cw->hook = NULL; if( cw->data && ( cw->type == NHW_MESSAGE || cw->type == NHW_MENU || cw->type == NHW_TEXT ) ) --- 195,216 ---- dismiss_nhwindow(win); type = cw->type; ! if( cw->resp ) { ! free( cw->resp ); ! cw->resp = NULL; ! } ! if( cw->canresp ) { ! free( cw->canresp ); ! cw->canresp = NULL; ! } ! if( cw->morestr ) { ! free( cw->morestr ); ! cw->morestr = NULL; ! } ! if( cw->hook ) { ! free( cw->hook ); ! cw->hook = NULL; ! } if( cw->data && ( cw->type == NHW_MESSAGE || cw->type == NHW_MENU || cw->type == NHW_TEXT ) ) *************** *** 228,243 **** WORD offsety; }; void #ifndef _DCC __interrupt #endif ! __saveds __asm ! LayerFillHook( register __a0 struct Hook *hk, register __a2 struct RastPort *rp, register __a1 struct FillParams *fp ) { register long x, y, xmax, ymax; register int apen; struct RastPort rptmp; --- 243,274 ---- WORD offsety; }; + #ifdef __GNUC__ + #ifdef __PPC__ + void PPC_LayerFillHook(void); + struct EmulLibEntry LayerFillHook = {TRAP_LIB, 0, (void (*)(void)) PPC_LayerFillHook}; + void PPC_LayerFillHook(void) { + struct Hook *hk = (struct Hook*)REG_A0; + struct RastPort *rp = (struct RastPort *)REG_A2; + struct FillParams *fp = (struct FillParams*)REG_A1; + #else + void LayerFillHook(void) { + 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 ) { + #endif + register long x, y, xmax, ymax; register int apen; struct RastPort rptmp; *************** *** 320,326 **** if( HackPort == NULL ) { ! HackPort = CreatePort( NULL, 0 ); if( !HackPort ) panic( "no memory for msg port" ); } --- 351,357 ---- if( HackPort == NULL ) { ! HackPort = CreateMsgPort(); if( !HackPort ) panic( "no memory for msg port" ); } *************** *** 479,484 **** --- 510,516 ---- if( IntuitionBase->LibNode.lib_Version >= 37 ) { MsgPropScroll.Flags |= PROPNEWLOOK; + PropScroll.Flags |= PROPNEWLOOK; } #endif } *************** *** 547,553 **** --- 579,589 ---- 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 ) ); *************** *** 642,647 **** --- 678,686 ---- } } } + if ( type != NHW_MAP) { + SetFont(w->RPort, TextsFont); + } #ifdef HACKFONT else if( HackFont ) SetFont(w->RPort, HackFont); *************** *** 668,673 **** --- 707,713 ---- */ case NHW_MESSAGE: SetMenuStrip(w, MenuStrip); + MsgScroll.TopEdge = HackScreen->WBorTop + scrfontysize + 1; iflags.msg_history = wd->rows*10; if (iflags.msg_history < 40) iflags.msg_history = 40; *************** *** 695,700 **** --- 735,741 ---- * MENU or TEXT window. */ case NHW_MENU: + MenuScroll.TopEdge = HackScreen->WBorTop + scrfontysize + 1; wd->resp=(char*)alloc(256); wd->resp[0]=0; wd->rows = wd->maxrow = 0; *************** *** 708,713 **** --- 749,755 ---- * screen width. */ case NHW_TEXT: + MenuScroll.TopEdge = HackScreen->WBorTop + scrfontysize + 1; wd->rows = wd->maxrow = 0; wd->cols = wd->maxcol = amiIDisplay->cols; wd->data = NULL; *************** *** 742,748 **** SetMenuStrip(w, MenuStrip); if( WINVERS_AMIV ) { - extern struct TextFont *RogueFont; CO = (w->Width-w->BorderLeft-w->BorderRight)/mxsize; LI = (w->Height-w->BorderTop-w->BorderBottom)/mysize; amii_setclipped(); --- 784,789 ---- *************** *** 773,779 **** ConsoleIO.io_Data = (APTR) w; ConsoleIO.io_Length = sizeof( struct Window ); ! ConsoleIO.io_Message.mn_ReplyPort = CreatePort(NULL, 0L); if( OpenDevice("console.device", -1L, (struct IORequest *) &ConsoleIO, 0L) != 0) { --- 814,820 ---- ConsoleIO.io_Data = (APTR) w; ConsoleIO.io_Length = sizeof( struct Window ); ! ConsoleIO.io_Message.mn_ReplyPort = CreateMsgPort(); if( OpenDevice("console.device", -1L, (struct IORequest *) &ConsoleIO, 0L) != 0) { *************** *** 803,808 **** --- 844,891 ---- return( newid ); } + #ifdef __GNUC__ + #ifdef __PPC__ + int PPC_SM_Filter(void); + struct EmulLibEntry SM_Filter = {TRAP_LIB, 0, (int (*)(void)) PPC_SM_Filter}; + int PPC_SM_Filter(void) { + struct Hook *hk = (struct Hook*)REG_A0; + ULONG modeID = (ULONG)REG_A1; + struct ScreenModeRequester *smr = (struct ScreenModeRequester *)REG_A2; + #else + int SM_Filter(void) { + register struct Hook *hk asm("a0"); + register ULONG modeID asm("a1"); + register struct ScreenModeRequester *smr asm("a2"); + #endif + #else + int + #ifndef _DCC + __interrupt + #endif + __saveds __asm SM_Filter( + register __a0 struct Hook *hk, + register __a1 ULONG modeID, + register __a2 struct ScreenModeRequester *smr) + { + #endif + struct DimensionInfo dims; + struct DisplayInfo disp; + DisplayInfoHandle handle; + handle = FindDisplayInfo(modeID); + if (handle) { + GetDisplayInfoData(handle, (char *)&dims, sizeof(dims), DTAG_DIMS, modeID); + GetDisplayInfoData(handle, (char *)&disp, sizeof(disp), DTAG_DISP, modeID); + if (!disp.NotAvailable && + dims.MaxDepth <= 8 && + dims.StdOScan.MaxX >= WIDTH-1 && + dims.StdOScan.MaxY >= SCREENHEIGHT-1) { + return 1; + } + } + return 0; + } + /* Initialize the windowing environment */ void *************** *** 857,868 **** Abort(AG_OpenLib | AO_GraphicsLib); } ! if( WINVERS_AMIV && (LayersBase = (struct Library *) OpenLibrary("layers.library", amii_libvers )) == NULL) { Abort(AG_OpenLib | AO_LayersLib); } amiIDisplay=(struct amii_DisplayDesc *)alloc(sizeof(struct amii_DisplayDesc)); memset( amiIDisplay, 0, sizeof( struct amii_DisplayDesc ) ); --- 940,959 ---- Abort(AG_OpenLib | AO_GraphicsLib); } ! if( (LayersBase = (struct Library *) OpenLibrary("layers.library", amii_libvers )) == NULL) { Abort(AG_OpenLib | AO_LayersLib); } + if ((GadToolsBase = OpenLibrary("gadtools.library", amii_libvers)) == NULL) { + Abort(AG_OpenLib | AO_GadTools); + } + + if ((AslBase = OpenLibrary("asl.library", amii_libvers)) == NULL) { + Abort(AG_OpenLib); + } + amiIDisplay=(struct amii_DisplayDesc *)alloc(sizeof(struct amii_DisplayDesc)); memset( amiIDisplay, 0, sizeof( struct amii_DisplayDesc ) ); *************** *** 900,906 **** NewHackScreen.ViewModes |= LACE; bigscreen = 1; } ! else if( GfxBase->NormalDisplayRows >= 300 ) { bigscreen = 1; } --- 991,998 ---- NewHackScreen.ViewModes |= LACE; bigscreen = 1; } ! else if( GfxBase->NormalDisplayRows >= 300 || ! amiIDisplay->ypix >= 300 ) { bigscreen = 1; } *************** *** 981,986 **** --- 1073,1105 ---- } #endif + /* Adjust getlin window size to font */ + + if (TextsFont) { + extern SHORT BorderVectors1[]; + extern SHORT BorderVectors2[]; + extern struct Gadget Gadget2; + extern struct Gadget String; + extern struct NewWindow StrWindow; + BorderVectors1[2] += (TextsFont->tf_XSize-8)*6; /* strlen("Cancel") == 6 */ + BorderVectors1[4] += (TextsFont->tf_XSize-8)*6; + BorderVectors1[5] += TextsFont->tf_YSize-8; + BorderVectors1[7] += TextsFont->tf_YSize-8; + BorderVectors2[2] += (TextsFont->tf_XSize-8)*6; + BorderVectors2[4] += (TextsFont->tf_XSize-8)*6; + BorderVectors2[5] += TextsFont->tf_YSize-8; + BorderVectors2[7] += TextsFont->tf_YSize-8; + Gadget2.TopEdge += TextsFont->tf_YSize-8; + Gadget2.Width += (TextsFont->tf_XSize-8)*6; + Gadget2.Height += TextsFont->tf_YSize-8; + String.LeftEdge += (TextsFont->tf_XSize-8)*6; + String.TopEdge += TextsFont->tf_YSize-8; + String.Width += TextsFont->tf_XSize-8; + String.Height += TextsFont->tf_YSize-8; + StrWindow.Width += (TextsFont->tf_XSize-8)*7; + StrWindow.Height += (TextsFont->tf_YSize-8)*2; /* Titlebar + 1 row of gadgets */ + } + /* This is the size screen we want to open, within reason... */ NewHackScreen.Width = max( WIDTH, amiIDisplay->xpix ); *************** *** 1006,1011 **** --- 1125,1155 ---- NewHackScreen.Width = STDSCREENWIDTH; NewHackScreen.Height = STDSCREENHEIGHT; + #ifdef HACKFONT + if (TextsFont) { + NewHackScreen.Font = &TextsFont13; + } + #endif + + if ( amii_scrnmode == 0xffffffff ) { + struct ScreenModeRequester *SMR; + #ifdef __GNUC__ + SM_FilterHook.h_Entry = (void *)&SM_Filter; + #else + SM_FilterHook.h_Entry = (ULONG(*)())SM_Filter; + #endif + SM_FilterHook.h_Data = 0; + SM_FilterHook.h_SubEntry = 0; + SMR = AllocAslRequest(ASL_ScreenModeRequest,NULL); + if (AslRequestTags(SMR, + ASLSM_FilterFunc, (ULONG)&SM_FilterHook, + TAG_END)) + amii_scrnmode = SMR->sm_DisplayID; + else + amii_scrnmode = 0; + FreeAslRequest(SMR); + } + if( forcenobig == 0 ) { if( ( wbscr = LockPubScreen( "Workbench" ) ) != NULL || *************** *** 1043,1050 **** /* Use the display database to get the correct information */ if( disp.PropertyFlags & DIPF_IS_LACE ) NewHackScreen.ViewModes |= LACE; ! NewHackScreen.Height = dims.StdOScan.MaxY; ! NewHackScreen.Width = dims.StdOScan.MaxX; } NewHackScreen.TopEdge = 0; NewHackScreen.LeftEdge = 0; --- 1187,1194 ---- /* Use the display database to get the correct information */ if( disp.PropertyFlags & DIPF_IS_LACE ) NewHackScreen.ViewModes |= LACE; ! NewHackScreen.Height = dims.StdOScan.MaxY+1; ! NewHackScreen.Width = dims.StdOScan.MaxX+1; } NewHackScreen.TopEdge = 0; NewHackScreen.LeftEdge = 0; *************** *** 1078,1085 **** { if( disp.PropertyFlags & DIPF_IS_LACE ) NewHackScreen.ViewModes |= LACE; ! NewHackScreen.Height = dims.StdOScan.MaxY; ! NewHackScreen.Width = dims.StdOScan.MaxX; } break; --- 1222,1229 ---- { if( disp.PropertyFlags & DIPF_IS_LACE ) NewHackScreen.ViewModes |= LACE; ! NewHackScreen.Height = dims.StdOScan.MaxY+1; ! NewHackScreen.Width = dims.StdOScan.MaxX+1; } break; *************** *** 1798,1805 **** /* Draw in complement mode. The cursor body will be C_WHITE */ ! cw->curs_apen = C_RED; ! cw->curs_bpen = C_RED; SetAPen( rp, cw->curs_apen ); SetBPen( rp, cw->curs_bpen ); SetDrMd( rp, COMPLEMENT ); --- 1942,1949 ---- /* Draw in complement mode. The cursor body will be C_WHITE */ ! cw->curs_apen = 0xff; /* Last color/all planes, regardless of depth */ ! cw->curs_bpen = 0xff; SetAPen( rp, cw->curs_apen ); SetBPen( rp, cw->curs_bpen ); SetDrMd( rp, COMPLEMENT ); *************** *** 1899,1909 **** { struct amii_WinDesc *cw; uchar ch; ! register int offset; ! #ifdef TEXTCOLOR ! int color; ! #endif ! extern int zapcolors[]; /* In order for the overview window to work, we can not clip here */ if( !WINVERS_AMIV ) --- 2043,2051 ---- { struct amii_WinDesc *cw; uchar ch; ! int color, och; ! extern const int zapcolors[]; ! unsigned special; /* In order for the overview window to work, we can not clip here */ if( !WINVERS_AMIV ) *************** *** 1944,2013 **** } else /* AMII, or Rogue level in either version */ { ! #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 invis_color(n) color = NO_COLOR ! #define pet_color(n) color = iflags.use_color ? mons[n].mcolor : \ ! /* If no color, try to hilite pets; black */ \ ! /* should be HI */ \ ! ((iflags.hilite_pet) ? CLR_BLACK : 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 invis_color(n) ! #define pet_color(n) ! #define warn_color(n) ! #endif ! ! /* ! * Map the glyph back to a character. ! * ! * Warning: For speed, this makes an assumption on the order of ! * offsets. The order is set in display.h. ! */ ! if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ ! ch = warnsyms[offset]; ! warn_color(offset); ! } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ ! /* see swallow_to_glyph()in display.c */ ! ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; ! mon_color(offset >> 3); ! } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ ! ch = showsyms[S_vbeam + (offset & 0x3)]; ! zap_color((offset >> 2)); ! } else if( ( offset = (glyph - GLYPH_CMAP_OFF) ) >= 0 ) { /* cmap */ ! ch = showsyms[offset]; ! cmap_color(offset); ! } else if( ( offset = (glyph - GLYPH_OBJ_OFF) ) >= 0 ) { /* object */ ! ch = oc_syms[objects[offset].oc_class]; ! obj_color(offset); ! } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* a ridden monster */ ! ch = (uchar) monsyms[mons[offset].mlet]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ ! ch = oc_syms[objects[CORPSE].oc_class]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* a detected monster */ ! ch = (uchar) monsyms[mons[offset].mlet]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ ! ch = DEF_INVISIBLE; ! invis_color(offset); ! } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ ! ch = (uchar) monsyms[mons[offset].mlet]; ! pet_color(offset); ! } else /*if( glyph_is_monster(glyph) )*/ { /* a monster */ ! ch = (uchar) monsyms[mons[glyph].mlet]; ! mon_color(glyph); ! } /* XXX next if should be ifdef REINCARNATION */ if( WINVERS_AMIV ){ /* implies Rogue level here */ amii_curs(win,x,y); amiga_print_glyph(win,NO_COLOR,ch + 10000); --- 2086,2095 ---- } else /* AMII, or Rogue level in either version */ { ! /* map glyph to character and color */ ! mapglyph(glyph, &och, &color, &special, x, y); /* XXX next if should be ifdef REINCARNATION */ + ch = (uchar)och; if( WINVERS_AMIV ){ /* implies Rogue level here */ amii_curs(win,x,y); amiga_print_glyph(win,NO_COLOR,ch + 10000); *** nethack-3.3.1/sys/amiga/winmenu.c Thu Feb 14 07:59:32 2002 --- nethack-3.4.0/sys/amiga/winmenu.c Thu Mar 21 07:37:41 2002 *************** *** 392,398 **** } nw->Height = min( ysize, amiIDisplay->ypix - nw->TopEdge ); ! if( WINVERS_AMIV ) { /* Make sure we are using the correct hook structure */ nw->Extension = cw->wintags; --- 392,398 ---- } nw->Height = min( ysize, amiIDisplay->ypix - nw->TopEdge ); ! if( WINVERS_AMIV || WINVERS_AMII ) { /* Make sure we are using the correct hook structure */ nw->Extension = cw->wintags; *************** *** 661,667 **** if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { ! if (amip->canselect) { /* * Select those yet unselected * and apply count if necessary --- 661,667 ---- if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { ! if (amip->canselect && amip->selector) { /* * Select those yet unselected * and apply count if necessary *************** *** 692,698 **** if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { ! if (amip->canselect) { amip->selected = FALSE; amip->count = -1; amip->str[SOFF+2] = '-'; --- 692,698 ---- if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { ! if (amip->selected) { amip->selected = FALSE; amip->count = -1; amip->str[SOFF+2] = '-'; *************** *** 705,711 **** if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { ! if (amip->canselect) { amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; --- 705,711 ---- if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { ! if (amip->canselect && amip->selector) { amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; *************** *** 727,733 **** while (amip && i++ < topidx) amip = amip->next; for (i=0;i < wheight && amip; i++, amip=amip->next) { ! if (amip->canselect) { if (!amip->selected) { if (counting) { amip->count = count; --- 727,733 ---- while (amip && i++ < topidx) amip = amip->next; for (i=0;i < wheight && amip; i++, amip=amip->next) { ! if (amip->canselect && amip->selector) { if (!amip->selected) { if (counting) { amip->count = count; *************** *** 750,756 **** while (amip && i++ < topidx) amip = amip->next; for (i=0;i < wheight && amip; i++, amip=amip->next) { ! if (amip->canselect) { amip->selected = FALSE; amip->count = -1; amip->str[SOFF+2] = '-'; --- 750,756 ---- while (amip && i++ < topidx) amip = amip->next; for (i=0;i < wheight && amip; i++, amip=amip->next) { ! if (amip->selected) { amip->selected = FALSE; amip->count = -1; amip->str[SOFF+2] = '-'; *************** *** 765,771 **** while (amip && i++ < topidx) amip = amip->next; for (i=0;i < wheight && amip; i++, amip=amip->next) { ! if (amip->canselect) { amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; --- 765,771 ---- while (amip && i++ < topidx) amip = amip->next; for (i=0;i < wheight && amip; i++, amip=amip->next) { ! if (amip->canselect && amip->selector) { amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; *************** *** 787,793 **** if (!*buf || *buf == '\033') break; while (amip) { ! if (amip->canselect && amip->str && strstri(&amip->str[SOFF], buf)) { if (how == PICK_ONE) { amip->selected = TRUE; --- 787,793 ---- if (!*buf || *buf == '\033') break; while (amip) { ! if (amip->canselect && amip->selector && amip->str && strstri(&amip->str[SOFF], buf)) { if (how == PICK_ONE) { amip->selected = TRUE; *************** *** 1081,1090 **** amip->selected = 0; amip->count = -1; reset_counting = TRUE; ! if (amip->canselect) amip->str[SOFF+2] = '-'; } ! if (counting && amip->selected && amip->canselect) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; --- 1081,1090 ---- 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) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; *************** *** 1104,1117 **** amip->selected = 0; amip->count = -1; reset_counting = TRUE; ! if (amip->canselect) amip->str[SOFF+2] = '-'; } oidx = -1; } amip = find_menu_item( cw, aidx ); ! if( amip && amip->canselect && how != PICK_NONE ) { oidx = aidx; if( !DoubleClick( oldsecs, --- 1104,1117 ---- amip->selected = 0; amip->count = -1; reset_counting = TRUE; ! if (amip->canselect && amip->selector) amip->str[SOFF+2] = '-'; } oidx = -1; } amip = find_menu_item( cw, aidx ); ! if( amip && amip->canselect && amip->selector && how != PICK_NONE ) { oidx = aidx; if( !DoubleClick( oldsecs, *************** *** 1125,1131 **** } else { amip->count = -1; reset_counting = TRUE; ! if (amip->canselect) amip->str[SOFF+2] = '-'; } } --- 1125,1131 ---- } else { amip->count = -1; reset_counting = TRUE; ! if (amip->canselect && amip->selector) amip->str[SOFF+2] = '-'; } } *************** *** 1144,1149 **** --- 1144,1160 ---- DisplayBeep( NULL ); } break; + } + if (!counting && morc == '\33') { + amip = cw->menu.items; + while (amip) { + if (amip->canselect && amip->selector) { + amip->selected = FALSE; + amip->count = -1; + amip->str[SOFF+2] = '-'; + } + amip=amip->next; + } } if (reset_counting) { count = 0; *** nethack-3.3.1/sys/amiga/winreq.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/amiga/winreq.c Thu Mar 21 07:37:41 2002 *************** *** 115,132 **** ((struct PropInfo *)Col_GreenPen.SpecialInfo)->Flags |= PROPNEWLOOK; } #endif ! if( WINVERS_AMIV ) { #ifdef INTUI_NEW_LOOK Col_NewWindowStructure1.Extension = wintags; Col_NewWindowStructure1.Flags |= WFLG_NW_EXTENDED; fillhook.h_Entry = (ULONG(*)())LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; #endif } nw = OpenWindow( (void *)&Col_NewWindowStructure1 ); PrintIText( nw->RPort, &Col_IntuiTextList1, 0, 0 ); ClearCol( nw ); --- 115,143 ---- ((struct PropInfo *)Col_GreenPen.SpecialInfo)->Flags |= PROPNEWLOOK; } #endif ! if( WINVERS_AMIV || WINVERS_AMII ) { #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 } nw = OpenWindow( (void *)&Col_NewWindowStructure1 ); + + if( nw == NULL ) + { + DisplayBeep( NULL ); + return; + } + PrintIText( nw->RPort, &Col_IntuiTextList1, 0, 0 ); ClearCol( nw ); *************** *** 407,418 **** ((struct PropInfo *)ClipYCLIP.SpecialInfo)->Flags |= PROPNEWLOOK; } #endif ! if( WINVERS_AMIV ) { # ifdef INTUI_NEW_LOOK ClipNewWindowStructure1.Extension = wintags; ClipNewWindowStructure1.Flags |= WFLG_NW_EXTENDED; fillhook.h_Entry = (ULONG(*)())LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; # endif --- 418,433 ---- ((struct PropInfo *)ClipYCLIP.SpecialInfo)->Flags |= PROPNEWLOOK; } #endif ! if( WINVERS_AMIV || WINVERS_AMII ) { # 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 *************** *** 957,982 **** if( !once ) { ! if( bigscreen ) ! /* ! * Old method, on pal interlace overscan screen this window opens right on ! * top of possible description of scroll/potion effect, thus requiring the ! * user to move the window elsewhere. ! * New method places the query window on top of gamemap window ! * StrWindow.TopEdge = (HackScreen->Height/2) - (StrWindow.Height/2); ! */ ! StrWindow.TopEdge = amii_wins[WIN_MAP]->win->TopEdge; SetBorder( &String ); SetBorder( &Gadget2 ); once = 1; } ! if( WINVERS_AMIV ) { #ifdef INTUI_NEW_LOOK StrWindow.Extension = wintags; StrWindow.Flags |= WFLG_NW_EXTENDED; fillhook.h_Entry = (ULONG(*)())LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; #endif --- 972,1000 ---- if( !once ) { ! if( bigscreen ) { ! StrWindow.LeftEdge = (HackScreen->Width/2) - (StrWindow.Width/2); ! if (amii_wins[WIN_MAP]) { ! StrWindow.TopEdge = amii_wins[WIN_MAP]->win->TopEdge; ! } else { ! StrWindow.TopEdge = (HackScreen->Height/2) - (StrWindow.Height/2); ! } ! } SetBorder( &String ); SetBorder( &Gadget2 ); once = 1; } ! if( WINVERS_AMIV || WINVERS_AMII ) { #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 *** nethack-3.3.1/sys/amiga/winstr.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/amiga/winstr.c Thu Mar 21 07:37:41 2002 *************** *** 20,25 **** --- 20,26 ---- register struct amii_WinDesc *cw; char *ob; 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 ) *************** *** 213,223 **** --- 214,237 ---- case NHW_MAP: case NHW_BASE: + if (cw->type == NHW_BASE && wrapping) { + amii_curs(window, cw->curx+1, cw->cury); + TextSpaces(w->RPort, cw->cols); + if (cw->cury < cw->rows) { + amii_curs(window, cw->curx+1, cw->cury+1); + TextSpaces(w->RPort, cw->cols); + cw->cury--; + } + } amii_curs(window, cw->curx+1, cw->cury); Text(w->RPort,(char *)str,strlen((char *)str)); cw->curx = 0; /* CR-LF is automatic in these windows */ cw->cury++; + if (cw->type == NHW_BASE && cw->cury >= cw->rows) { + cw->cury = 0; + wrapping = 1; + } break; case NHW_MENU: *************** *** 237,244 **** for(i=0; icury; i++) tmp[i] = cw->data[i]; ! if( cw->data ) free( cw->data ); cw->data = tmp; --- 251,260 ---- for(i=0; icury; i++) tmp[i] = cw->data[i]; ! if( cw->data ) { free( cw->data ); + cw->data = NULL; + } cw->data = tmp; *************** *** 252,259 **** /* Shouldn't need to do this, but... */ ! if( cw->data && cw->data[cw->cury] ) free( cw->data[cw->cury] ); n0 = strlen(str)+1; cw->data[cw->cury] = (char*) alloc(n0+SOFF); --- 268,277 ---- /* Shouldn't need to do this, but... */ ! if( cw->data && cw->data[cw->cury] ) { free( cw->data[cw->cury] ); + cw->data[cw->cury] = NULL; + } n0 = strlen(str)+1; cw->data[cw->cury] = (char*) alloc(n0+SOFF); *** nethack-3.3.1/sys/amiga/xpm2iff.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/amiga/xpm2iff.c Thu Mar 21 07:37:41 2002 *************** *** 15,26 **** #include #include #include - #include - #include #ifndef _DCC ! # include ! # include ! # include #endif struct xpmscreen { --- 15,24 ---- #include #include #include #ifndef _DCC ! # include ! # include ! # include #endif struct xpmscreen { *************** *** 61,72 **** */ #define ID_PLNE MAKE_ID( 'P', 'L', 'N', 'E' ) /* The planes of the image */ - extern struct DOSBase *DOSBase; - #ifndef _DCC - extern - #endif - struct Library *IFFParseBase; - int nplanes; /* BMHD from IFF documentation */ --- 59,64 ---- *************** *** 117,123 **** int tiles=0; int index; ! #ifdef _DCC IFFParseBase = OpenLibrary( "iffparse.library", 0 ); if( !IFFParseBase ) { error( "unable to open iffparse.library" ); --- 109,115 ---- int tiles=0; int index; ! #if defined(_DCC) || defined (__GNUC__) IFFParseBase = OpenLibrary( "iffparse.library", 0 ); if( !IFFParseBase ) { error( "unable to open iffparse.library" ); *************** *** 242,248 **** Close( iff->iff_Stream ); FreeIFF( iff ); ! #ifdef _DCC CloseLibrary( IFFParseBase ); #endif exit( 0 ); --- 234,240 ---- Close( iff->iff_Stream ); FreeIFF( iff ); ! #if defined(_DCC) || defined (__GNUC__) CloseLibrary( IFFParseBase ); #endif exit( 0 ); *** nethack-3.3.1/sys/atari/Install.tos Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/atari/Install.tos Thu Mar 21 07:37:41 2002 *************** *** 1,7 **** ! Instructions for compiling and installing NetHack 3.3 on a TOS system ===================================================== ! (or, How to make ST NetHack 3.3) Last revision: 2 February 2000 1. Make sure all the NetHack files are in the appropriate directory structure. --- 1,7 ---- ! Instructions for compiling and installing NetHack 3.4 on a TOS system ===================================================== ! (or, How to make ST NetHack 3.4) Last revision: 2 February 2000 1. Make sure all the NetHack files are in the appropriate directory structure. *************** *** 115,121 **** ----- 1) Save files and bones files from previous versions will not work with ! NetHack 3.3. 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 --- 115,121 ---- ----- 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 *** nethack-3.3.1/sys/be/bemain.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/be/bemain.c Thu Mar 21 07:37:41 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)bemain.c 3.3 98/07/15 */ /* Copyright (c) Dean Luick, 1996. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)bemain.c 3.4 1998/07/15 */ /* Copyright (c) Dean Luick, 1996. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 212,217 **** --- 212,220 ---- if ((i = str2race(argv[0])) >= 0) flags.initrace = i; } + break; + case '@': + flags.randomall = 1; break; default: raw_printf("Unknown option: %s", *argv); *** nethack-3.3.1/sys/mac/Files.r Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/Files.r Thu Mar 21 07:37:41 2002 *************** *** 1,3 **** --- 1,19 ---- + #include + #include "date.h" + #include "patchlevel.h" + + 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" + }; + read 'File' (1000,"cmdhelp") ":dat:cmdhelp"; read 'File' (1001,"help") ":dat:help"; read 'File' (1002,"hh") ":dat:hh"; *************** *** 30,60 **** 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,"minetn-1.lev") ":lib:minetn-1.lev"; ! read 'File' (1033,"minetn-2.lev") ":lib:minetn-2.lev"; ! read 'File' (1034,"options") ":lib:options"; ! read 'File' (1035,"oracle.lev") ":lib:oracle.lev"; ! read 'File' (1036,"oracles") ":lib:oracles"; ! read 'File' (1037,"orcus.lev") ":lib:orcus.lev"; ! read 'File' (1038,"quest.dat") ":lib:quest.dat"; ! read 'File' (1039,"rumors") ":lib:rumors"; ! read 'File' (1040,"sanctum.lev") ":lib:sanctum.lev"; ! read 'File' (1041,"soko1-1.lev") ":lib:soko1-1.lev"; ! read 'File' (1042,"soko1-2.lev") ":lib:soko1-2.lev"; ! read 'File' (1043,"soko2-1.lev") ":lib:soko2-1.lev"; ! read 'File' (1044,"soko2-2.lev") ":lib:soko2-2.lev"; ! read 'File' (1045,"soko3-1.lev") ":lib:soko3-1.lev"; ! read 'File' (1046,"soko3-2.lev") ":lib:soko3-2.lev"; ! read 'File' (1047,"soko4-1.lev") ":lib:soko4-1.lev"; ! read 'File' (1048,"soko4-2.lev") ":lib:soko4-2.lev"; ! read 'File' (1049,"tower1.lev") ":lib:tower1.lev"; ! read 'File' (1050,"tower2.lev") ":lib:tower2.lev"; ! read 'File' (1051,"tower3.lev") ":lib:tower3.lev"; ! read 'File' (1052,"valley.lev") ":lib:valley.lev"; ! read 'File' (1053,"water.lev") ":lib:water.lev"; ! read 'File' (1054,"wizard1.lev") ":lib:wizard1.lev"; ! read 'File' (1055,"wizard2.lev") ":lib:wizard2.lev"; ! read 'File' (1056,"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"; --- 46,83 ---- 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' (1033,"minend-4.lev") ":lib:minend-4.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"; *** nethack-3.3.1/sys/mac/Install.mw Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/Install.mw Thu Mar 21 07:37:41 2002 *************** *** 1,4 **** ! Building a PPC NetHack 3.3 with the Metrowerks compilers You must be familiar with the Metrowerks compiler and know how to construct --- 1,4 ---- ! Building a PPC NetHack 3.4 with the Metrowerks compilers You must be familiar with the Metrowerks compiler and know how to construct *** nethack-3.3.1/sys/mac/macerrs.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macerrs.c Thu Mar 21 07:37:42 2002 *************** *** 2,8 **** /* Copyright (c) Michael Hamel, 1991 */ /* NetHack may be freely redistributed. See license for details. */ ! #ifdef applec /* This needs to be resident always */ #pragma segment Main #endif --- 2,9 ---- /* 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 *************** *** 12,17 **** --- 13,37 ---- #include #include + + 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 *************** *** 33,39 **** 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 --- 53,58 ---- *************** *** 111,123 **** showerror("of an internal error",line); } 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]); } - #if 0 /* Apparently unused */ void comment(char *s, long n) { Str255 paserr; --- 130,142 ---- showerror("of an internal error",line); } + 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; *************** *** 145,148 **** if (gTopactivity > 1) --gTopactivity; else error("activity stack underflow"); } ! #endif /* Apparently unused */ --- 164,168 ---- if (gTopactivity > 1) --gTopactivity; else error("activity stack underflow"); } ! ! #endif /* Obsolete */ *** nethack-3.3.1/sys/mac/macfile.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macfile.c Thu Mar 21 07:37:42 2002 *************** *** 66,72 **** OpenHandleFile (const unsigned char *name, long fileType) { int i; - OSErr err; Handle h; Str255 s; --- 66,71 ---- *************** *** 74,88 **** if (theHandleFiles[i].data == 0L) break; } ! if (i >= MAX_HF) { ! error("Ran out of HandleFiles"); return -1; - } h = GetNamedResource (fileType, name); ! err = ResError(); ! if (err == resNotFound) return -1; /* Don't complain, this might be normal */ ! if (!itworked(err)) return -1; theHandleFiles[i].data = h; theHandleFiles[i].size = GetHandleSize (h); --- 73,83 ---- 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); *************** *** 97,103 **** CloseHandleFile (int fd) { if (!IsHandleFile (fd)) { - error("CloseHandleFile: isn't a handle"); return -1; } fd -= FIRST_HF; --- 92,97 ---- *************** *** 218,224 **** C2P (name, s); if (flags & O_CREAT) { if (HCreate (theDirs.dataRefNum, theDirs.dataDirID, s , ! MAC_CREATOR, fileType) && (flags & O_EXCL)) { return -1; } --- 212,218 ---- C2P (name, s); if (flags & O_CREAT) { if (HCreate (theDirs.dataRefNum, theDirs.dataDirID, s , ! TEXT_CREATOR, fileType) && (flags & O_EXCL)) { return -1; } *************** *** 298,323 **** long amt = len; if (IsHandleFile (fd)) { - return ReadHandleFile (fd, ptr, amt); } else { - short err = FSRead (fd, &amt, ptr); - if (err == eofErr && len) { - - return amt; - } - if (itworked (err)) { - - return (amt); ! } else { ! ! return -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) --- 292,306 ---- 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) *************** *** 344,352 **** long amt = len; if (IsHandleFile (fd)) return -1; ! ! if (itworked(FSWrite (fd, &amt, ptr))) return(amt); ! else return(-1); } --- 327,336 ---- long amt = len; if (IsHandleFile (fd)) return -1; ! if (FSWrite(fd, &amt, ptr) == noErr) ! return (amt); ! else ! return (-1); } *************** *** 372,383 **** break; } ! if (itworked(SetFPos (fd, posMode, where)) && itworked(GetFPos (fd, &curPos))) ! return(curPos); ! ! return(-1); } /* ---------------------------------------------------------------------- */ boolean rsrc_dlb_init(void) { --- 356,368 ---- break; } ! if (SetFPos(fd, posMode, where) == noErr && GetFPos(fd, &curPos) == noErr) ! return (curPos); ! else ! return(-1); } + /* ---------------------------------------------------------------------- */ boolean rsrc_dlb_init(void) { *************** *** 388,394 **** } boolean rsrc_dlb_fopen(dlb *dp, const char *name, const char *mode) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(mode) #endif Str255 pname; --- 373,379 ---- } boolean rsrc_dlb_fopen(dlb *dp, const char *name, const char *mode) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(mode) #endif Str255 pname; *** nethack-3.3.1/sys/mac/MacHelp Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/MacHelp Thu Mar 21 07:37:42 2002 *************** *** 1,11 **** ! Macintosh-specific help file for NetHack 3.3 The following are options, features, or concerns specific to the ! Macintosh port of NetHack 3.3. Bug reports, suggestions, comments, and so on, should be addressed to: To: nethack-bugs@nethack.org ! Subject: Mac NetHack 3.3 or you can use our on-line bug reporting form at --- 1,11 ---- ! Macintosh-specific help file for NetHack 3.4 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.4 or you can use our on-line bug reporting form at *************** *** 17,26 **** === Configuration of a playground ! NetHack 3.3 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 --- 17,26 ---- === 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 *************** *** 50,55 **** --- 50,56 ---- 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 *************** *** 68,90 **** 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] - large_font - use 12 point font instead of 9 point font [FALSE] - popup_dialog - use real dialogs for question prompts [FALSE] page_wait - display --MORE-- after messages [TRUE] - use_stone:# - use a background pattern for the dungeon. - - large_font is currently a pre-game option and has no effect - after the Dungeon Map window is created. - use_stone is also a pre-game option. The number parameter - specifies which pattern to use. If the number is 0 or - greater than the number of available patterns, it has no - effect. - Default options may be set by editing the NetHack Defaults text file (using SimpleText or your favorite editor). The following notation is used: --- 69,81 ---- 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: *** nethack-3.3.1/sys/mac/macmain.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macmain.c Thu Mar 21 07:37:42 2002 *************** *** 12,38 **** #include #include #include - #ifdef MAC_MPW32 - #include - #include - #endif #include #include #include #include - #ifdef applec - #include - #endif #include #ifndef O_RDONLY #include #endif ! static void ! finder_file_request(void); - int NDECL(main); int main (void) --- 12,34 ---- #include #include #include #include #include #include #include #include #ifndef O_RDONLY #include #endif ! static void finder_file_request(void); ! int main(void); ! ! #if __SC__ || __MRC__ ! QDGlobals qd; ! #endif int main (void) *** nethack-3.3.1/sys/mac/macmenu.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macmenu.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)macmenu.c 3.3 99/11/24 */ /* Copyright (c) Macintosh NetHack Port Team, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)macmenu.c 3.4 1999/11/24 */ /* Copyright (c) Macintosh NetHack Port Team, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 288,298 **** /* Enable or disable the appropriate item */ ! GetDItem(wind, item, &type, &handle, &rect); if (enable) type &= ~itemDisable; else type |= itemDisable; HiliteControl((ControlHandle)handle, enable ? 0 : 255); ! SetDItem(wind, item, type, handle, &rect); return; } --- 288,298 ---- /* 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; } *************** *** 303,313 **** short type; Handle handle; Rect rect; ! static char *modechar = " XD"; /* Which item shall we redraw? */ ! GetDItem(wind, item, &type, &handle, &rect); switch (item) { case RSRC_ASK_DEFAULT: PenSize(3, 3); --- 303,313 ---- 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); *************** *** 451,456 **** --- 451,475 ---- *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')) || *************** *** 491,498 **** /* Initialize the name text item */ ask_restring(plname, str); if (plname[0]) { ! GetDItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); ! SetIText(handle, str); } #if 0 { --- 510,517 ---- /* 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 { *************** *** 515,522 **** } } if (pName [0]) { ! GetDItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); ! SetIText(handle, pName); if (pName [0] > 2 && pName [pName [0] - 1] == '-') { short role = (*pANR).anMenu[anRole]; char suffix = (char) pName[pName[0]], --- 534,541 ---- } } 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]], *************** *** 531,537 **** } } #endif ! SelIText(askdialog, RSRC_ASK_NAME, 0, 32767); /* Initialize the role popup menu */ if (!(askmenu[RSRC_ASK_ROLE] = NewMenu(RSRC_ASK_ROLE, "\p"))) --- 550,556 ---- } } #endif ! SelectDialogItemText(askdialog, RSRC_ASK_NAME, 0, 32767); /* Initialize the role popup menu */ if (!(askmenu[RSRC_ASK_ROLE] = NewMenu(RSRC_ASK_ROLE, "\p"))) *************** *** 601,608 **** /* Set the redraw procedures */ for (item = RSRC_ASK_DEFAULT; item <= RSRC_ASK_MODE; item++) { ! GetDItem(askdialog, item, &type, &handle, &rect); ! SetDItem(askdialog, item, type, (Handle)redraw, &rect); } /* Handle dialog events */ --- 620,627 ---- /* 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 */ *************** *** 627,633 **** if (!races[++j].noun) j = 0; } while (i != j); if (currrace != i) { ! GetDItem(askdialog, RSRC_ASK_RACE, &type, &handle, &rect); InvalRect(&rect); } --- 646,652 ---- if (!races[++j].noun) j = 0; } while (i != j); if (currrace != i) { ! GetDialogItem(askdialog, RSRC_ASK_RACE, &type, &handle, &rect); InvalRect(&rect); } *************** *** 647,653 **** if (++j >= ROLE_GENDERS) j = 0; } while (i != j); if (currgend != i) { ! GetDItem(askdialog, RSRC_ASK_GEND, &type, &handle, &rect); InvalRect(&rect); } --- 666,672 ---- if (++j >= ROLE_GENDERS) j = 0; } while (i != j); if (currgend != i) { ! GetDialogItem(askdialog, RSRC_ASK_GEND, &type, &handle, &rect); InvalRect(&rect); } *************** *** 667,673 **** if (++j >= ROLE_ALIGNS) j = 0; } while (i != j); if (curralign != i) { ! GetDItem(askdialog, RSRC_ASK_ALIGN, &type, &handle, &rect); InvalRect(&rect); } --- 686,692 ---- if (++j >= ROLE_ALIGNS) j = 0; } while (i != j); if (curralign != i) { ! GetDialogItem(askdialog, RSRC_ASK_ALIGN, &type, &handle, &rect); InvalRect(&rect); } *************** *** 675,681 **** for (i = 0; roles[i].name.m; i++) { ask_restring((currgend && roles[i].name.f) ? roles[i].name.f : roles[i].name.m, str); ! SetItem(askmenu[RSRC_ASK_ROLE], i+1, str); CheckItem(askmenu[RSRC_ASK_ROLE], i+1, currrole == i); } --- 694,700 ---- 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); CheckItem(askmenu[RSRC_ASK_ROLE], i+1, currrole == i); } *************** *** 699,705 **** case RSRC_ASK_ALIGN: case RSRC_ASK_GEND: case RSRC_ASK_MODE: ! GetDItem(askdialog, item, &type, &handle, &rect); pt = *(Point *)▭ LocalToGlobal(&pt); if (!!(i = PopUpMenuSelect(askmenu[item], pt.v, pt.h, --- 718,724 ---- 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, *************** *** 730,737 **** } while ((item != RSRC_ASK_PLAY) && (item != RSRC_ASK_QUIT)); /* Process the name */ ! GetDItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); ! GetIText(handle, str); if (str[0] > PL_NSIZ-1) str[0] = PL_NSIZ-1; BlockMove(&str[1], plname, str[0]); plname[str[0]] = '\0'; --- 749,756 ---- } 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'; *************** *** 1072,1078 **** if (theMenubar >= mbarRegular) { (void) doversion(); /* is this necessary? */ } else { ! unsigned char aboutStr[32] = "\pNetHack 3.3."; if (PATCHLEVEL > 10) { aboutStr[++aboutStr[0]] = '0'+PATCHLEVEL/10; --- 1091,1097 ---- 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; *************** *** 1132,1138 **** ParamText("\pReally Quit?", "\p", "\p", "\p"); itemHit = Alert(alrtMenu_NY, (ModalFilterUPP) 0L); ! ResetAlrtStage(); if (itemHit != bttnMenuAlertYes) { doQuit = 0; --- 1151,1157 ---- ParamText("\pReally Quit?", "\p", "\p", "\p"); itemHit = Alert(alrtMenu_NY, (ModalFilterUPP) 0L); ! ResetAlertStage(); if (itemHit != bttnMenuAlertYes) { doQuit = 0; *** nethack-3.3.1/sys/mac/macsnd.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macsnd.c Thu Mar 21 07:37:42 2002 *************** *** 55,63 **** /* * Set up the synth */ ! if (itworked (SndNewChannel (&theChannel, sampledSynth, initMono + ! initNoInterp, (void *) 0))) { ! char midi_note [] = {57, 59, 60, 62, 64, 65, 67}; short err; --- 55,62 ---- /* * 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; *************** *** 89,96 **** } SndDisposeChannel (theChannel, false); /* Sync wait for completion */ ReleaseResource (theSound); - - mustwork (err); } } --- 88,93 ---- *** nethack-3.3.1/sys/mac/mactopl.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/mactopl.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mactopl.c 3.1 91/07/23 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mactopl.c 3.1 91/07/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 59,70 **** * If resp is NULL, any single character is accepted and returned. */ { - #if ENABLE_MAC_POPUP - if (iflags.popup_dialog) - return popup_yn_function(query, resp, def); - else - #endif return topl_yn_function(query, resp, def); } ! /*topl.c*/ --- 59,65 ---- * If resp is NULL, any single character is accepted and returned. */ { return topl_yn_function(query, resp, def); } ! /* mactopl.c */ *** nethack-3.3.1/sys/mac/mactty.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/mactty.c Thu Mar 21 07:37:42 2002 *************** *** 1021,1027 **** */ short image_tty (EventRecord *theEvent, WindowPtr window) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(theEvent) #endif RECORD_EXISTS (record); --- 1021,1027 ---- */ short image_tty (EventRecord *theEvent, WindowPtr window) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(theEvent) #endif RECORD_EXISTS (record); *** nethack-3.3.1/sys/mac/macunix.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macunix.c Thu Mar 21 07:37:42 2002 *************** *** 6,27 **** #include "hack.h" - #ifndef __MWERKS__ - #include - #endif - - - #if 0 - int - uptodate(int fd) - #if defined(applec) || defined(__MWERKS__) - # pragma unused(fd) - #endif - return(1); - } - #endif - - void regularize(char *s) { --- 6,11 ---- *************** *** 33,44 **** } } - void getlock(void) { int fd; ! int pid = getpid(); /* Process Serial Number ? */ set_levelfile_name (lock, 0); --- 17,27 ---- } } void getlock(void) { int fd; ! int pid = getpid(); /* Process ID */ set_levelfile_name (lock, 0); *** nethack-3.3.1/sys/mac/macwin.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/macwin.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)macwin.c 3.3 96/01/15 */ /* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)macwin.c 3.4 1996/01/15 */ /* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,39 **** #include "mactty.h" #include "wintty.h" - #if defined(applec) - #include - #else #include - #endif #include #include #include #include NhWindow *theWindows = (NhWindow *) 0; - #ifndef USESROUTINEDESCRIPTORS /* not using universal headers */ - /* Cast everything in terms of the new Low Memory function calls. */ - # if defined(applec) - # define LMGetCurStackBase() (*(long *) CurStackBase) - # define LMGetDefltStack() (*(long *) DefltStack) - # elif defined(THINK_C) - # define LMGetCurStackBase() CurStackBase - # define LMGetDefltStack() (*(long *) DefltStack) - # elif defined(__MWERKS__) - # else - # error /* need to define LM functions for this compiler */ - # endif - #endif /* !USEROUTINEDESCRIPTORS (universal headers) */ - /* Borrowed from the Mac tty port */ extern WindowPtr _mt_window; --- 8,22 ---- #include "mactty.h" #include "wintty.h" #include #include #include #include #include + #include NhWindow *theWindows = (NhWindow *) 0; /* Borrowed from the Mac tty port */ extern WindowPtr _mt_window; *************** *** 217,223 **** static pascal OSErr AppleEventHandler (const AppleEvent* inAppleEvent, AppleEvent* outAEReply, long inRefCon) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(outAEReply,inRefCon) #endif Size actualSize; --- 200,206 ---- static pascal OSErr AppleEventHandler (const AppleEvent* inAppleEvent, AppleEvent* outAEReply, long inRefCon) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(outAEReply,inRefCon) #endif Size actualSize; *************** *** 355,367 **** /* set up base fonts for all window types */ GetFNum ("\pHackFont", &i); if (i == 0) ! i = monaco; win_fonts [NHW_BASE] = win_fonts [NHW_MAP] = win_fonts [NHW_STATUS] = i; GetFNum ("\pPSHackFont", &i); if (i == 0) ! i = geneva; win_fonts [NHW_MESSAGE] = i; ! win_fonts [NHW_TEXT] = geneva; macFlags.hasAE = 0; if(!Gestalt(gestaltAppleEventsAttr, &l) && (l & (1L << gestaltAppleEventsPresent))){ --- 338,350 ---- /* 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))){ *************** *** 643,651 **** if (kind == NHW_MESSAGE) { aWin->font_number = win_fonts [NHW_MESSAGE]; ! aWin->font_size = iflags.large_font ? 12 : 9; if (!top_line) { const Rect out_of_scr = {10000, 10000, 10100, 10100}; TextFace(bold); top_line = TENew(&out_of_scr, &out_of_scr); TEActivate(top_line); --- 626,637 ---- 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); *************** *** 653,659 **** } } else { aWin->font_number = win_fonts [NHW_TEXT]; ! aWin->font_size = 9; } TextFont (aWin->font_number); --- 639,645 ---- } } else { aWin->font_number = win_fonts [NHW_TEXT]; ! aWin->font_size = iflags.wc_fontsiz_text ? iflags.wc_fontsiz_text : 9; } TextFont (aWin->font_number); *************** *** 685,691 **** InitMenuRes (); theWindows = (NhWindow *) NewPtrClear (NUM_MACWINDOWS * sizeof (NhWindow)); ! mustwork(MemError()); DimMenuBar (); --- 671,678 ---- InitMenuRes (); theWindows = (NhWindow *) NewPtrClear (NUM_MACWINDOWS * sizeof (NhWindow)); ! if (MemError()) ! error("mac_init_nhwindows: Couldn't allocate memory for windows."); DimMenuBar (); *************** *** 808,814 **** void enter_topl_mode(char *query) { if (in_topl_mode()) ! Debugger(); putstr(WIN_MESSAGE, ATR_BOLD, query); --- 795,801 ---- void enter_topl_mode(char *query) { if (in_topl_mode()) ! return; putstr(WIN_MESSAGE, ATR_BOLD, query); *************** *** 832,838 **** NhWindow *aWin = theWindows + WIN_MESSAGE; if (!in_topl_mode()) ! Debugger(); /* remove unprintables from the answer */ for (ap = *(*top_line)->hText + topl_query_len, bp = answer; ans_len > 0; ans_len--, ap++) { --- 819,829 ---- 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++) { *************** *** 1147,1153 **** if (iflags.window_inited) { if (flags.tombstone && killer) { /* Prepare for the coming of the tombstone window. */ ! win_fonts [NHW_TEXT] = monaco; } return; } --- 1138,1144 ---- if (iflags.window_inited) { if (flags.tombstone && killer) { /* Prepare for the coming of the tombstone window. */ ! win_fonts [NHW_TEXT] = kFontIDMonaco; } return; } *************** *** 1160,1166 **** if ((!((WindowPeek) theWindow)->visible || (kind != NHW_MENU && kind != NHW_TEXT))) { DisposeWindow (theWindow); if (aWin->windowText) { ! DisposHandle (aWin->windowText); } aWin->its_window = (WindowPtr) 0; aWin->windowText = (Handle) 0; --- 1151,1157 ---- if ((!((WindowPeek) theWindow)->visible || (kind != NHW_MENU && kind != NHW_TEXT))) { DisposeWindow (theWindow); if (aWin->windowText) { ! DisposeHandle (aWin->windowText); } aWin->its_window = (WindowPtr) 0; aWin->windowText = (Handle) 0; *************** *** 1176,1182 **** void trans_num_keys(EventRecord *theEvent) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(theEvent) #endif /* KMH -- Removed this translation. --- 1167,1173 ---- void trans_num_keys(EventRecord *theEvent) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(theEvent) #endif /* KMH -- Removed this translation. *************** *** 1208,1214 **** */ static void GeneralKey (EventRecord *theEvent, WindowPtr theWindow) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(theWindow) #endif #if 0 --- 1199,1205 ---- */ static void GeneralKey (EventRecord *theEvent, WindowPtr theWindow) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(theWindow) #endif #if 0 *************** *** 1477,1483 **** where.v = where.v / nhw->row_height; clicked_mod = (theEvent->modifiers & shiftKey) ? CLICK_2 : CLICK_1; ! if (strchr(topl_resp, click_to_cmd(where.h, where.v, clicked_mod))) nhbell(); else { if (cursor_locked) --- 1468,1474 ---- where.v = where.v / nhw->row_height; clicked_mod = (theEvent->modifiers & shiftKey) ? CLICK_2 : CLICK_1; ! if (strchr(topl_resp, *click_to_cmd(where.h, where.v, clicked_mod))) nhbell(); else { if (cursor_locked) *************** *** 1595,1602 **** static short macDoNull (EventRecord *theEvent, WindowPtr theWindow) { - if (!theEvent || !theWindow) - Debugger (); return 0; } --- 1586,1591 ---- *************** *** 1626,1634 **** NhWindow *aWin = GetNhWin (theWindow); int l; ! if (!theEvent) { ! Debugger (); ! } GetClip(org_clip); --- 1615,1622 ---- NhWindow *aWin = GetNhWin (theWindow); int l; ! if (!theEvent) ! return 0; GetClip(org_clip); *************** *** 1666,1672 **** name = tmp; break; } ! TextFont(geneva); TextSize(9); GetFontInfo(&font); MoveTo ((frame.left + frame.right - StringWidth(name)) / 2, --- 1654,1660 ---- name = tmp; break; } ! TextFont(kFontIDGeneva); TextSize(9); GetFontInfo(&font); MoveTo ((frame.left + frame.right - StringWidth(name)) / 2, *************** *** 1770,1778 **** RgnHandle h; Boolean vis; ! if (!theEvent) { ! Debugger (); ! } r2.left = r2.right - SBARWIDTH; r2.right += 1; --- 1758,1765 ---- RgnHandle h; Boolean vis; ! if (!theEvent) ! return 0; r2.left = r2.right - SBARWIDTH; r2.right += 1; *************** *** 1829,1835 **** GlobalToLocal (&where); dir_bas = iflags.num_pad ? (char *) ndir : (char *) sdir; ! dir = strchr (dir_bas, click_to_cmd (where.h / nhw->char_width + 1 , where.v / nhw->row_height, CLICK_1)); } ch = GetCursor (dir ? dir - dir_bas + 513 : 512); --- 1816,1822 ---- GlobalToLocal (&where); dir_bas = iflags.num_pad ? (char *) ndir : (char *) sdir; ! dir = strchr (dir_bas, *click_to_cmd (where.h / nhw->char_width + 1 , where.v / nhw->row_height, CLICK_1)); } ch = GetCursor (dir ? dir - dir_bas + 513 : 512); *************** *** 1849,1855 **** static void GeneralCursor (EventRecord *theEvent, WindowPtr theWindow, RgnHandle mouseRgn) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(theWindow) #endif Rect r = {-1, -1, 2, 2}; --- 1836,1842 ---- static void GeneralCursor (EventRecord *theEvent, WindowPtr theWindow, RgnHandle mouseRgn) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(theWindow) #endif Rect r = {-1, -1, 2, 2}; *************** *** 2132,2138 **** #ifdef CLIPPING static void mac_cliparound (int x, int y) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(x,y) #endif /* TODO */ --- 2119,2125 ---- #ifdef CLIPPING static void mac_cliparound (int x, int y) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(x,y) #endif /* TODO */ *************** *** 2294,2300 **** 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(applec) || defined(__MWERKS__) # pragma unused(glyph) #endif NhWindow *aWin = &theWindows [win]; --- 2281,2287 ---- 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]; *************** *** 2478,2484 **** static void mac_suspend_nhwindows (const char *foo) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(foo) #endif /* Can't really do that :-) */ --- 2465,2471 ---- static void mac_suspend_nhwindows (const char *foo) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(foo) #endif /* Can't really do that :-) */ *************** *** 2504,2509 **** --- 2491,2500 ---- /* Interface definition, for windows.c */ struct window_procs mac_procs = { "mac", + WC_COLOR | WC_HILITE_PET | + WC_LARGE_FONT | /* obsolete */ + 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, mac_init_nhwindows, mac_unimplemented, /* see macmenu.c:mac_askname() for player selection */ mac_askname, *************** *** 2554,2559 **** --- 2545,2551 ---- 0, // mac_start_screen, 0, // mac_end_screen, genl_outrip, + genl_preference_update, }; /*macwin.c*/ *** nethack-3.3.1/sys/mac/mgetline.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/mgetline.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)getline.c 3.1 90/22/02 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)getline.c 3.1 90/22/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 8,13 **** --- 8,15 ---- #include "macpopup.h" #include "func_tab.h" + extern int NDECL(extcmd_via_menu); /* cmd.c */ + typedef Boolean FDECL ((* key_func), (unsigned char)); int *************** *** 48,60 **** */ void mac_getlin(const char *query, char *bufp) { ! ! #if ENABLE_MAC_POPUP ! if (iflags.popup_dialog) ! popup_getlin (query, bufp); ! else ! #endif ! topl_getlin (query, bufp, false); } --- 50,56 ---- */ void mac_getlin(const char *query, char *bufp) { ! topl_getlin (query, bufp, false); } *************** *** 67,72 **** --- 63,69 ---- 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; *** nethack-3.3.1/sys/mac/mmodal.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/mmodal.c Thu Mar 21 07:37:42 2002 *************** *** 3,13 **** /* NetHack may be freely redistributed. See license for details. */ #include - #if ENABLE_MAC_POPUP - #include "hack.h" - #include "mactty.h" - #endif #include "macpopup.h" /* Flash a dialog button when its accelerator key is pressed */ void --- 3,10 ---- /* NetHack may be freely redistributed. See license for details. */ #include #include "macpopup.h" + #include /* Flash a dialog button when its accelerator key is pressed */ void *************** *** 18,24 **** unsigned long ticks; /* Apple recommends 8 ticks */ ! GetDItem(wind, item, &type, &handle, &rect); HiliteControl((ControlHandle)handle, kControlButtonPart); Delay(8, &ticks); HiliteControl((ControlHandle)handle, 0); --- 15,21 ---- unsigned long ticks; /* Apple recommends 8 ticks */ ! GetDialogItem(wind, item, &type, &handle, &rect); HiliteControl((ControlHandle)handle, kControlButtonPart); Delay(8, &ticks); HiliteControl((ControlHandle)handle, 0); *************** *** 26,662 **** } - #if ENABLE_MAC_POPUP - static void mv_handle_click (EventRecord *theEvent); - - #define MAX_MV_DIALOGS 20 - static int old_dialog_count = 0; - static struct { - short id; - Boolean init_visible; - DialogPtr dialog; - } old_dialog[MAX_MV_DIALOGS]; - - - static short frame_corner; - static pascal void FrameItem(DialogPtr dlog, short item); - static UserItemUPP FrameItemUPP = NULL; - - static pascal void - FrameItem (DialogPtr dlog, short item) { - short k; - Handle h; - Rect r; - - GetDItem (dlog, item, &k, &h, &r); - PenSize (3, 3); - FrameRoundRect (&r, frame_corner, frame_corner); - PenNormal (); - } - - - static void - SetFrameItem (DialogPtr dlog, short frame, short item) { - Rect r, r2; - short kind; - Handle h; - - if (!FrameItemUPP) /* initialize handler routine */ - FrameItemUPP = NewUserItemProc(FrameItem); - - GetDItem (dlog, item, &kind, &h, &r); - InsetRect (&r, -4, -4); - r2 = r; - GetDItem (dlog, frame, &kind, &h, &r); - SetDItem (dlog, frame, kind, (Handle) FrameItemUPP, &r2); - frame_corner = 16; - } - - - /* Instead of calling GetNewDialog everytime, just call - SelectWindow/ShowWindow for the old dialog to remember its location. - */ - /* - * Unfortunately, this does not work, as it doesn't handle old text - * in edit text boxes, and not ParamText parameters either. - * - */ - static DialogPtr - mv_get_new_dialog(short dialogID) { - DialogPtr dialog; - int d_idx = old_dialog_count; - Rect oldRect; - Boolean hadOld = 0; - - old_dialog[0].id = dialogID; - while (old_dialog[d_idx].id != dialogID) - --d_idx; - - /* - * This routine modified so that the old dialog is - * disposed, and the new one read in after we remember - * the old dialog's position. - * - * This takes care of strange default strings and ParamTexts - * - */ - - if (d_idx) { - dialog = old_dialog [d_idx] . dialog; - oldRect = dialog->portBits . bounds; - DisposeDialog (dialog); - old_dialog [d_idx] . dialog = (DialogPtr) 0; - hadOld = 1; - - } else { - d_idx = ++ old_dialog_count; - } - - dialog = GetNewDialog(dialogID, nil, (WindowPtr)-1); - if (dialog) { - if (hadOld) { - MoveWindow (dialog, - oldRect . left, - oldRect . top, FALSE); - } - old_dialog[d_idx].id = dialogID; - old_dialog[d_idx].init_visible - = ((WindowPeek)dialog)->visible; - old_dialog[d_idx].dialog = dialog; - } - return dialog; - } - - /* Instead of actually closing the dialog, just hide it so its location - is remembered. */ - static void mv_close_dialog(DialogPtr dialog) { - HideWindow(dialog); - } - - /* This routine is stolen/borrowed from HandleClick (macwin.c). See the - comments in mv_modal_dialog for more information. */ - static void - mv_handle_click (EventRecord *theEvent) { - int code; - WindowPtr theWindow; - Rect r = (*GetGrayRgn ())->rgnBBox; - - InsetRect (&r, 4, 4); - InitCursor (); - - code = FindWindow (theEvent->where, &theWindow); - - switch (code) { - case inContent : - if (theWindow != FrontWindow ()) { - nhbell (); - } - break; - case inDrag : - SetCursor(&qd.arrow); - DragWindow (theWindow, theEvent->where, &r); - SaveWindowPos (theWindow); - break; - default : - HandleEvent (theEvent); - } - } - - static void - mv_modal_dialog(ModalFilterProcPtr filterProc, short *itemHit) { - GrafPtr org_port; - GetPort(&org_port); - - for (;;) { - DialogPtr dialog = FrontWindow(); - EventRecord evt; - - WaitNextEvent(everyEvent, &evt, GetCaretTime(), (RgnHandle) nil); - - if (evt.what == keyDown) - if (evt.modifiers &cmdKey) { - if ((evt.message & charCodeMask) == '.') { - /* 0x351b is the key code and character code of the esc key. */ - evt.message = 0x351b; - evt.modifiers &= ~cmdKey; - } - } else - trans_num_keys(&evt); - - if (filterProc) { - if ((*filterProc)(dialog, &evt, itemHit)) - break; - } else if (evt.what == keyDown) { - char ch = evt.message & charCodeMask; - if (ch == CHAR_CR || ch == CHAR_ENTER) { - *itemHit = ok; - FlashButton(dialog, ok); - break; - } - } - - if (IsDialogEvent(&evt)) { - DialogPtr dont_care; - if (DialogSelect(&evt, &dont_care, itemHit)) - break; - - /* The following part is problemmatic: (1) Calling HandleEvent - here may cause some re-entrance problem (seems ok, but I am - not sure). (2) It is ugly to treat mouseDown events as a - special case. If we can just say "else HandleEvent(&evt);" - here it will be better. */ - } else if (evt.what == mouseDown) - mv_handle_click(&evt); - else - HandleEvent(&evt); - - SetPort(org_port); - } - } - - /********************************************************************************* - * mactopl routines using dialogs - *********************************************************************************/ - - #define YN_DLOG 133 - #define YNQ_DLOG 134 - #define YNAQ_DLOG 135 - #define YNNAQ_DLOG 136 - - static int yn_user_item [] = {5, 6, 7, 8}; - static short gEnterItem, gEscItem; - static const char *gRespStr = (const char *)0; - static char gDef = 0; - static short dlogID; - - - static void - SetEnterItem (DialogPtr dp, const short newEnterItem) { - short kind; - Handle item; - Rect r, r2; - - if (gEnterItem != newEnterItem) { - GetDItem (dp, gEnterItem, &kind, &item, &r2); - InsetRect (&r2, - 4, - 4); - EraseRect (&r2); - InvalRect (&r2); - - gEnterItem = newEnterItem; - - GetDItem (dp, newEnterItem, &kind, &item, &r2); - frame_corner = kind == ctrlItem + btnCtrl ? 16 : 0; - InsetRect (&r2, - 4, - 4); - InvalRect (&r2); - r = r2; - GetDItem (dp, yn_user_item [dlogID - YN_DLOG], &kind, &item, &r2); - SetDItem (dp, yn_user_item [dlogID - YN_DLOG], kind, item, &r); - } - } - - - static void - do_tabbing (DialogPtr dp) { - SetEnterItem(dp, gEnterItem == 1 ? strlen(gRespStr) : gEnterItem - 1); - } - - - static void - set_yn_number(DialogPtr dp) { - if (gRespStr && gRespStr[gEnterItem-1] == '#') { - short k; - Handle h; - Rect r; - Str255 s; - GetDItem(dp, gEnterItem, &k, &h, &r); - GetIText(h, s); - if (s[0]) - StringToNum(s, &yn_number); - } - } - - - static pascal Boolean - YNAQFilter (DialogPtr dp, EventRecord *ev, short *itemHit) { - unsigned char code; - char ch; - char *re = (char *) gRespStr; - - if (ev->what != keyDown) { - - return 0; - } - code = (ev->message & 0xff00) >> 8; - ch = ev->message & 0xff; - - switch (code) { - case 0x24 : - case 0x4c : - set_yn_number (dp); - *itemHit = gEnterItem; - FlashButton (dp, *itemHit); - return 1; - case 0x35 : - case 0x47 : - *itemHit = gEscItem; - FlashButton (dp, *itemHit); - return 1; - case 0x30 : - do_tabbing (dp); - return 0; - } - switch (ch) { - case '\r' : - case '\n' : - case ' ' : - case 3 : - set_yn_number (dp); - *itemHit = gEnterItem; - FlashButton (dp, *itemHit); - return 1; - - case 9 : - do_tabbing (dp); - return 0; - - case 27 : - *itemHit = gEscItem; - FlashButton (dp, *itemHit); - return 1; - - case CHAR_BS : - case 28 : case 29 : case 30 : case 31 : /* the four arrow keys */ - case '0' : case '1' : case '2' : case '3' : case '4' : - case '5' : case '6' : case '7' : case '8' : case '9' : { - char *loc = strchr (gRespStr, '#'); - if (loc) { - SetEnterItem(dp, loc - gRespStr + 1); - return 0; /* Dialog Manager will then put this key into the text field. */ - } - } - } - - while (*re) { - if (*re == ch) { - *itemHit = (re - gRespStr) + 1; - FlashButton (dp, *itemHit); - return 1; - } - re ++; - } - - nhbell (); - ev->what = nullEvent; - return 0; - } - - - static char - do_question_dialog (char *query, int dlog, int defbut, char *resp) { - Str255 p; - DialogPtr dp; - short item; - - char c = queued_resp ((char *) resp); - if (c) - return c; - - dlogID = dlog; - C2P (query, p); - ParamText ((char *)p, (uchar *) 0, (uchar *) 0, (uchar *) 0); - dp = mv_get_new_dialog (dlog); - if (! dp) { - return 0; - } - SetPort (dp); - ShowWindow (dp); - - gEscItem = strlen (resp); - gEnterItem = defbut; - gRespStr = resp; - - SetFrameItem (dp, yn_user_item [dlogID - YN_DLOG], gEnterItem); - - InitCursor (); - mv_modal_dialog (YNAQFilter, &item); - mv_close_dialog (dp); - return resp [item - 1]; - } - - - static pascal Boolean - OneCharDLOGFilter (DialogPtr dp, EventRecord *ev, short *item) { - char ch; - short k; - Handle h; - Rect r; - unsigned char com [2]; - - if (ev->what != keyDown) { - return 0; - } - ch = ev->message & 0xff; - - com [0] = 1; - com [1] = ch; - - if (ch == 27) { - GetDItem (dp, 4, &k, &h, &r); - SetIText (h, com); - *item = 2; - FlashButton (dp, 2); - return 1; - } - if (! gRespStr || strchr (gRespStr, ch)) { - GetDItem (dp, 4, &k, &h, &r); - SetIText (h, com); - *item = 1; - FlashButton (dp, 1); - return 1; - } - if (ch == 10 || ch == 13 || ch == 3 || ch == 32) { - com [1] = gDef; - GetDItem (dp, 4, &k, &h, &r); - SetIText (h, com); - *item = 1; - FlashButton (dp, 1); - return 1; - } - if (ch > 32 && ch < 127) { - GetDItem (dp, 4, &k, &h, &r); - SetIText (h, com); - *item = 1; - FlashButton (dp, 1); - return 1; - } - nhbell (); - ev->what = nullEvent; - return 1; - } - - - static char - generic_yn_function (query, resp, def) - const char *query, *resp; - char def; - { - DialogPtr dp; - short k, item; - Handle h; - Rect r; - unsigned char com [32] = {1, 27}; // margin for getitext - Str255 pQuery; - - char c = queued_resp ((char *) resp); - if (c) - return c; - - dp = mv_get_new_dialog (137); - if (! dp) { - return 0; - } - SetPort (dp); - ShowWindow (dp); - InitCursor (); - SetFrameItem (dp, 6, 1); - if (def) { - com [1] = def; - } - strcpy ((char *) &pQuery[1], query); - if (resp && *resp) { - strcat ((char *) &pQuery[1], " ("); - strcat ((char *) &pQuery[1], resp); - strcat ((char *) &pQuery[1], ")"); - } - pQuery[0] = strlen (&pQuery[1]); - ParamText ((char *) pQuery, (uchar *) 0, (uchar *) 0, (uchar *) 0); - GetDItem (dp, 4, &k, &h, &r); - SetIText (h, com); - SelIText (dp, 4, 0, 0x7fff); - InitCursor (); - SetFrameItem (dp, 6, 1); - gRespStr = resp; - gDef = def; - do { - mv_modal_dialog (OneCharDLOGFilter, &item); - - } while (item != 1 && item != 2); - GetIText (h, com); - - mv_close_dialog (dp); - if (item == 2 || ! com [0]) { - return 27; // escape - } - return com [1]; - } - - - static char - ynaq_dialog (query, resp, def) - const char *query, *resp; - char def; - { - int dia = 0; - - if (resp) { - if (! strcmp (resp, ynchars)) { - dia = YN_DLOG; - } - if (! strcmp (resp, ynqchars)) { - dia = YNQ_DLOG; - } - if (! strcmp (resp, ynaqchars)) { - dia = YNAQ_DLOG; - } - if (! strcmp (resp, ynNaqchars)) { - dia = YNNAQ_DLOG; - } - } - if (! dia) { - return generic_yn_function (query, resp, def); - } - - return do_question_dialog ((char *) query, dia , - (strchr (resp, def) - resp) + 1, (char *) resp); - } - - - char - popup_yn_function(const char *query, const char *resp, char def) { - char ch; - - if (ch = ynaq_dialog (query, resp, def)) - return ch; - - return topl_yn_function(query, resp, def); - } - - - /********************************************************************************* - * mgetline routines using dialogs - *********************************************************************************/ - - static pascal Boolean - getlinFilter (DialogPtr dp, EventRecord *ev, short *itemHit) { - if (ev->what == keyDown) { - int key = ev->message & keyCodeMask, - ch = ev->message & charCodeMask; - - if (ch == 0x1b || key == 0x3500 || key == 0x4700) { - *itemHit = 2; - FlashButton(dp, 2); - return true; - } else if (ch == CHAR_CR || ch == CHAR_ENTER) { - *itemHit = 1; - FlashButton(dp, 1); - return true; - } - } - return false; - } - - - - static Boolean - ExtendedCommandDialogFilter (DialogPtr dp, EventRecord *ev, short *item) { - int ix; - Handle h; - Rect r; - short k; - Str255 s; - unsigned char com [2]; - - if (ev->what != keyDown) { - return 0; - } - com [0] = 1; - com [1] = ev->message & 0xff; - - if (com [1] == 10 || com [1] == 13 || com [1] == 32 || - com [1] == 3) { // various "OK" - *item = 1; - FlashButton (dp, 1); - return 1; - } - if (com [1] == 27 || (ev->message & 0xff00 == 0x3500)) { // escape - *item = 2; - FlashButton (dp, 2); - return 1; - } - for (ix = 3; ix; ix ++) { - h = (Handle) 0; - k = 0; - GetDItem (dp, ix, &k, &h, &r); - if (! k || ! h) { - return 0; - } - if (k == 6) { // Radio Button Item - GetCTitle ((ControlHandle) h, s); - s [0] = 1; - if (! IUEqualString (com, s)) { - *item = ix; - return 1; - } - } - } - /*NOTREACHED*/ - return 0; - } - - - void - popup_getlin (const char *query, char *bufp) { - ControlHandle ctrl; - DialogPtr promptDialog; - short itemHit, type; - Rect box; - Str255 pasStr; - - if (get_line_from_key_queue (bufp)) - return; - - /* - ** Make a copy of the prompt string and convert the copy to a Pascal string. - */ - - C2P(query, pasStr); - - /* - ** Set the query line as parameter text. - */ - - ParamText(pasStr, "\p", "\p", "\p"); - - promptDialog = mv_get_new_dialog(130); - ShowWindow(promptDialog); - - InitCursor (); - SetFrameItem (promptDialog, 6, 1); - do { - mv_modal_dialog(&getlinFilter, &itemHit); - } while ((itemHit != 1) && (itemHit != 2)); - - if (itemHit != 2) { - /* - ** Get the text from the text edit item. - */ - - GetDItem(promptDialog, 4, &type, (Handle *) &ctrl, &box); - GetIText((Handle) ctrl, pasStr); - - /* - ** Convert it to a 'C' string and copy it into the return value. - */ - - P2C (pasStr, bufp); - } else { - /* - ** Return a null-terminated string consisting of a single . - */ - - bufp[0] = '\033'; - bufp[1] = '\0'; - } - - mv_close_dialog(promptDialog); - } - - #endif /* ENABLE_MAC_POPUP */ --- 23,25 ---- *** nethack-3.3.1/sys/mac/mrecover.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/mrecover.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mrecover.c 3.3 96/07/24 */ /* Copyright (c) David Hairston, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mrecover.c 3.4 1996/07/24 */ /* Copyright (c) David Hairston, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/mac/mttymain.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/mttymain.c Thu Mar 21 07:37:42 2002 *************** *** 225,241 **** } } ! mustwork (create_tty (&_mt_window, WIN_BASE_KIND + NHW_MAP, _mt_in_color)); ((WindowPeek) _mt_window)->windowKind = (WIN_BASE_KIND + NHW_MAP); SelectWindow (_mt_window); SetPort (_mt_window); SetOrigin (-1, -1); ! font_size = (iflags.large_font && !small_screen) ? 12 : 9; ! mustwork (init_tty_number (_mt_window, win_fonts [NHW_MAP], font_size, CO, LI)); ! ! mustwork (get_tty_metrics (_mt_window, &num_cols, &num_rows, &win_width , ! &win_height, &font_num, &font_size, &char_width, &row_height)); SizeWindow (_mt_window, win_width + 2, win_height + 2, 1); if (RetrievePosition (kMapWindow, &vert, &hor)) { --- 225,245 ---- } } ! if (create_tty (&_mt_window, WIN_BASE_KIND + NHW_MAP, _mt_in_color) != noErr) ! error("_mt_init_stuff: Couldn't create tty."); ((WindowPeek) _mt_window)->windowKind = (WIN_BASE_KIND + NHW_MAP); SelectWindow (_mt_window); SetPort (_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)) { *************** *** 245,261 **** ShowWindow (_mt_window); /* Start in raw, always flushing mode */ ! mustwork (get_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, &flag)); flag |= TA_ALWAYS_REFRESH | TA_WRAP_AROUND; ! mustwork (set_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, flag)); ! mustwork (get_tty_attrib (_mt_window, TTY_ATTRIB_CURSOR, &flag)); flag |= (TA_BLINKING_CURSOR | TA_NL_ADD_CR); ! mustwork (set_tty_attrib (_mt_window, TTY_ATTRIB_CURSOR, flag)); ! mustwork (set_tty_attrib (_mt_window, TTY_ATTRIB_FOREGROUND, _mt_colors [NO_COLOR] [0])); ! mustwork (set_tty_attrib (_mt_window, TTY_ATTRIB_BACKGROUND, _mt_colors [NO_COLOR] [1])); ! clear_tty (_mt_window);// InitMenuRes (); } --- 249,265 ---- 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 (); } *************** *** 293,299 **** int has_color (int color) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(color) #endif Rect r; --- 297,303 ---- int has_color (int color) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(color) #endif Rect r; *************** *** 361,367 **** void term_end_attr (int attr) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused (attr) #endif _mt_set_colors (_mt_attrs [0]); --- 365,371 ---- void term_end_attr (int attr) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused (attr) #endif _mt_set_colors (_mt_attrs [0]); *************** *** 481,495 **** void ! setftty (void) { ! long flag; ! mustwork (get_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, &flag)); ! /* Buffered output in the game */ flag &= ~ TA_ALWAYS_REFRESH; flag |= TA_INHIBIT_VERT_SCROLL; /* don't scroll */ ! mustwork (set_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, flag)); ! iflags.cbreak = 1; } --- 485,499 ---- 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; } *************** *** 508,523 **** void ! settty (const char *str) { ! long flag; update_tty (_mt_window); ! mustwork (get_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, &flag)); ! /* Buffered output in the game, raw in "raw" mode */ flag &= ~ TA_INHIBIT_VERT_SCROLL; /* scroll */ flag |= TA_ALWAYS_REFRESH; ! mustwork (set_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, flag)); tty_raw_print ("\n"); if (str) { --- 512,528 ---- 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) { *************** *** 528,534 **** void tty_number_pad (int arg) { ! #if defined(applec) || defined(__MWERKS__) # pragma unused(arg) #endif } --- 533,539 ---- void tty_number_pad (int arg) { ! #if defined(__SC__) || defined(__MRC__) # pragma unused(arg) #endif } *** nethack-3.3.1/sys/mac/News Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/News Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! Welcome to NetHack 3.3 for the Macintosh This game is brought to you by Dean Luick, Kevin Hugo, and Mark Modrall. --- 1,6 ---- ! Welcome to NetHack 3.4 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. *** nethack-3.3.1/sys/mac/NHDeflts Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/NHDeflts Thu Mar 21 07:37:42 2002 *************** *** 1,23 **** ! # SCCS Id: @(#)NetHack Defaults 3.3 99/11/20 ! # Copyright (c) 1999 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. ! # Comment lines begin with a `#' character. ### Display ### # Uncomment for the traditional single-window tty interface #OPTIONS=win:tty ! # Font size and style (use HackFont or NewHackFont) ! OPTIONS=!large,fontmap:NewHackFont ! # Color and background ! OPTIONS=color,background:white,use_stone:1 ! # Obsolete way to obtain reverse video; use background:black instead ! #OPTIONS=palette:000/c22/2c2/ca0/22c/a2a/2aa/ccc/999/f00/0f0/dd0/00f/d0d/0dd/fff/999/444/622/62c/-222 # Enable sound and beeps OPTIONS=sound,!silent --- 1,35 ---- ! # SCCS Id: @(#)NetHack Defaults 3.4 2002/03/15 ! # 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 *************** *** 30,62 **** # Save game state periodically in case of crashes (recommended) OPTIONS=checkpoint # Show tombstone and top scores at death OPTIONS=tombstone,scores:10t/3a/o ### User input and feedback ### # Choose between menus or text prompts # (traditional, combination, partial, or full) OPTIONS=menustyle:full ! # Display a little more information with some commands ! OPTIONS=verbose # Pause for --more-- and make it boldface OPTIONS=page_wait,standout # Allow spacebar as rest command #OPTIONS=rest_on_space - # Enable the number pad keys - OPTIONS=number_pad - # Display experience, score, and time on status line OPTIONS=showexp,showscore,time ! # Use popup windows for yes/no questions ! # This is likely to go away in future releases ! #OPTIONS=popup_dialog ### Character ### --- 42,89 ---- # 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 ### *************** *** 76,93 **** ### Inventory ### # Disable autopickup (toggle it with the `@' command) ! #OPTIONS=!autopickup # Don't use fixed inventory letters OPTIONS=!fixinv,perm_invent,sortpack ### 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 # End-of-file --- 103,161 ---- ### 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 *** nethack-3.3.1/sys/mac/NHrsrc.hqx Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/NHrsrc.hqx Thu Mar 21 07:37:42 2002 *************** *** 1,1017 **** (This file must be converted with BinHex 4.0) ! :$%jPG%KKBfXZFR0bB`"58e*$8P0&4!#3#0IqDb)!N!3"!*!$cV`!!-fm!!!*3J# ! 3"!d!%!!Y!$#J!J#S!*!&&J!i!#F!iBJB8h4[$%jPG%KKBfXZFR0bBfTcEA0bBf9 ! ZG(-VBe"-Fh"`Ef-!!&*68N058d9%!3!!8`%3!*!5XdZMjJ#3"Q-E!!$)!6!!!3# ! 3#!Zj!*!%&3#3"HB"A!!"!*!)#lJ!N!39!&!!EJ$k!EJ!!3#3#!I8!*!%&3"3!'i ! !qJ'i!!%!N!J(d`#3""8!8!"Z!2S"Z!!"!*!)"p)!N!39!&!!EJ$k!EJ!N!-F!3J ! !#!&+!2!!N!S(6@9cFf&RC6J+!*!$(!%Z!!3"8J(+!*!+"P0dBA4eFfXi#J#3!aB ! !I!$D!2J"LJ#3"!%!N!C01!S!N!-D!,i!"J&3!6)!N!3"!*!&"%PZCQmJ1!S!N!- ! L!#J!+!#-!+)!N!3"!*!&$8jeE'`J9fPZC'ph)#%i#J#3!c`16R9YBQ9b)'pQ)'Y ! PHA023dj8"5U3"8a69%-(5f9jBfpNC8K#@93%3fKKFN0)39)&+T!&6&0843#3!b! ! !+!!S!8S"lJ#3#JY%G@jRC@pZ)%eKF$J+!*!$)!!S!#J!V!(-!*!%!3#3"3Y%D@& ! REQpcG'PMFcJ+!*!$&J!"%deKBb"1CA4)B@0V)%KPE($*,cm!N!1!!*!,$rm!N!6 ! r!2%"m!#3!r[`$a!I!*!$$lm2!3(`!*!$qrm3%2!!!2!2[rram!!2$rrlm!m!!!m ! 3%2qr!*!$$`%"m2[`!*!$m"$`$lm!N!-2!3m!qr!!N!2rm!!2[`#3"r[`!*!'$lm ! !N!Ir!*!$J!$rN!6`!*!$m!#3!rm!N!2`!*!$r2!!!2!!N!2rr`!!m!#3"!m!!2! ! 2m!!!$`!!m2rr!!!2!!$`rrm2r`m!!2!2m!!!$`!!m!#3"!m!!2!2m!!!$`!!m2! ! 2$r!2!!$`m!m!!!m!!2!2m!!!$`!!m!#3"!m!!2q3"J#3"%!!!!(!-L!j%"d)$`J ! Rk&q3!%2!3Z!LF"%i$K`!$J!(!!-!!!(!-q!jm"hi$rJRq(q3!(r!IZ!qF"mi$K` ! !$J!(!!-!N!0!2q!J-#!S)$`J"#B%,`3[G#B%)!3Q"#PN+33Q"#!%2r`ri$r`2rJ ! rr$rm2r`rr$rm2r`rr$rm2r`rr$rm2r`rr!!!!3#3"Jq!!!!`B!!3)"!!("!)!!i ! 3#!!2%!3!"j!!"!!$m!3!!H!%!!$`"!!`qq3!6ciB!%!H!!"!$`!!3!q!!%!6`!" ! !%H!!)"$`!#!3H!!3#$`!$"JH!!2J$`#3!`H!!!!$`!!!!H!!N!2`!*!$H!#3!c` ! !N!-H!*!$$J#3!`3!N!82J!!!2q!!%$r`!"`Iq!!1(rJ!$arm!!HIr!!$rr`!!Ir ! m!!$rr!!`rr`!IriB!(rq!!"rr`!!Irq!!(rc`!"rmH!!2r$`!$r`H!!Iq$`!$rJ ! H!!2J$`#3!`H!!!!$`!!!!H!!N!2`!*!$H!#3!c`!N!-H!*!$$J#3!`3!!!%!$rr ! m!!J!"J!)$J8!#C%%J!R)K%!)k%3J#(K(m!Nr3"!+r)!3#Ki!%!SA!"!*%i!3#)R ! !%!K`i"!)!(!3#!!i%!J!'"!)B!!3#*!!!"!*D!!3#@Rq%!L3!!!3#'!!%!J!!"! ! )B!!3#*!!!"!*#!!3#3QrN!!)N!!!%!KJ!"!)!!!3$rrrm!rrr!!2rri!$rrr!!r ! rri!2rrr!$rrri!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!rrrr!2rrr`!!!#!*!Arrr`!*!-ra!3(r!!N!F2!*!$m3'3!`m ! !N!F2r`!!$a#3"2!!N!Ilm!!2!C!%m!#3"rZr!!m3N!3I!*!($l[`$`'3"!m!N!M ! l[rm3N!3I!*!)$l[a!C!%$`#3#IZr%*!%(`#3"[m!!2qlmIrrm3m!N!82%2rr%2Z ! rm!!2m!#3"3m"N!32Zr!!N!J2%*!&qlm!N!J2!C!&rl[`!*!($a#3""m!qlm!N!F ! 2!C!%$`!2Zr!!N!I`%*!$(`!!qlm!N!Ia!C!$$`!!$l[`!*!'$a#3"2!!!2Zr!*! ! (r`%"$r!!!!qlm!#3"rrrm!#3"2Zr!*!1$l[`!*!1qlm!N!i2Zr!!N!ll[`#3$Jq ! lm!#3$[Zr!*!1$l[`!*!1qr!!N!i2!*!$!J#3!rq3#3#3"r!!N!F2m!#3"[!!N!2 ! rm!!!$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`!*!($`#3"2!!m!m!N!F2!*!%m!m2m2!!N!B2!*!%m!m2m2! ! 2rj!$m!!2!*!%m!$`$`#3"`m!N!6`!!r`!*!($`#3"2!!N!S2!*!%m!!2m!#3"`m ! !N!6`!2!2!*!($`#3"2!2!!$`!*!'$`#3"2!2!!$`$r$rN!2`$`#3"2!!m!m!N!F ! 2!*!%m!!2m!#3"`m!N!6`!*!+$`#3"2q3$!#3"3`!@J"Z!1i"NJ#"4%3!N!0-!!) ! !N!9i!-B!LJ%3"!*25`#3"3S!4J"c!4#)(%0[G@aN)'j[G#"H-L"LC@0KGA0P)&i ! `,L!JAM%!N!8+!"3!+J!dS!)!N!3"!!rrr!!)!!B!#!i&!!Q4")!*b)4!#1K%)!K ! i4r!*2d!3#[b!%!SH!"!+&`!3#41!%!L*`"!)F1!3#!"`%!J!1"!)!"J3#C6'8!T ! 9+9!+95P3#P8T8!T9+9!*P-C3#!!!%!TP-C!!#T9+8!U95P!+P8T3#T9+8!TP-C! ! !#!!!%!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!#3!d!ri#! ! `)#JJ2#!%*+3UT#UN*+3J"#NN+U3UT#NN)!3rr$rJ2r!rq$rm2r`rr$rm2r`rr$r ! m2r`rr$rm2r`rr$rm!!!#!*!$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!32!*!%m!!2r`! ! !qr!!N!-2!*!%m!#3"3qr!*!$$`#3"2!!N!Elm!!!$`#3"2!!N!B2m!!!$`#3"2! ! 2m!m2!2m!$r!2$`#3"2$`$j!%!2$`$j!$!*!%m2!2N!3!m2!2N!-!N!6`m!q3"!$ ! `m!q3!`#3"2$`$j!%!2$`$j!$!*!%m!r`$`m!r`!2m!m2!*!%m!#3#Jm!N!6`m!r ! `$`m!r`!2m!m!N!6`N!-2N!3!m2!2$`#3"2#3!`q3"!$`m!m2!*!%m*!$$j!%!2$ ! `$`m!N!6`N!-2N!3!m2!2$`#3"2$`$r!2$`$r!!r`$`#3"2!!N!S2!*!%rj!-!*! ! &)J!"!*!&8!&%!'3"IJ3#6dX!N!8'!$J!4J&mL!*H-!#3!aJ!@J"H!1J"T`!&!*! ! *JJ!"F!S!N!-B!%)!A!$$!GF!"3#3#BF!!(!+!*!$'!"#!&`!``(A!!8!N!Q'!!" ! `#J#3!aJ!3J"F!--"e`!&!*!*K3!!F!S!N!05!!3!N!9M!5d!G`&R"!0CCA-!N!C ! M!1F!G`%K"!*1E`#3"3X!6!"8!@D)!Pi`!*!&$!!8!#`!0+!#!!%!N!9G!5J!I3& ! )J!#3"'3!"3#3"@-",3"h!@F%!ePPF`#3"Q-!j`"h!5%%!Nj[!*!&B`#K!(F!f`3 ! %8A9TG!#3"3X!6!"8!@D)!Pi`!*!&$!!8!#`!0+!#!!%!N!9G!5J!I3&)J!#3"(B ! !"J#3"@-",3"h!@F%!ePPF`#3"Q-!j`"h!5%%!Nj[!*!&B`#K!(F!f`3$3@aX!*! ! 'B`"E!(F!P33%8A9TG!#3"3X!6!"8!@D)!Pi`!*!&$!!8!#`!0+!#!!%!N!9I!5N ! !I`&*J!#3""J!3J"F!--"e`!&!*!*L!!!F!S!N!1%!!F!N!9M!5d!G`&R"!0CCA- ! !N!CM!1F!G`%K"!*1E`#3"@-!S3"h!0Z3!!#3"Q-!@`"h!*8%!d&XE(3!N!9M!"8 ! !G`"2"!44G@Pd!*!&#`"-!&3"CSJ#AM!!N!8-!"3!,!!dS!)!!3#3"9i"+!"q!8L ! !!*!%BJ!&!*!&DJ$j!(i"-`3#6dX!N!9U!+8!IJ$I"!C$B@jMC@`!N!8+!&8!1J% ! lL!*H-!#3"83!9`"8!6B3!*!'#J!F!#S!2+!#!!%!N!9N!23!K!%8J!#3""J![!# ! D!4X"F`!&!*!*L3!!D!S!N!0X!!8!N!9#!%d!9J#("!*25`#3"8)!#`"@!%8%"N0 ! KEQ0PE!#3"3F!0!!h!05)!Pi`!*!&4!#B!&3!c"!*4@4TG#"8CAKd!*!'#!!+!#J ! !+U!#!!%!N!8p!%N!A3"TJ!#3")!!rj!%m!#3!r!!N!2r!*!$m!#3!rc`!!$`!*! ! $rrm!!2!!N!32!!$`$`$`m!m!!2#3"3m!!2#3"3m!!2!2!2$`$`!!m!#3"!m!!2$ ! `$`$`$`!!m*!&$`!!m*!&$`!!m2!2!2!2!!$`!*!%$`!!rj!'!*!$#BL3!!#3"2i ! !"J!!rrF!"J!,!lX!#3!#!*!$2`#3-pJ!N!B833#3"5P!!!!`!!!D!!!#'%!&DeL ! *3!IJ183JJ%!%PF"`(!(#&!!9!"3JMm$rm!(i!*!$Fi!J!*!&)!!!$Q!"!"!!N#p ! `!&#)!KJ%!3+!SJ!%!JL!!!"J!%%L%f`!!!)SJ!!"q)P!"D!T4##!3!593&!8!8) ! 8!"8!&##2`2r`$3J!N!-N3&!#mm!!"#!$!!Q3!!E91Ha-)!!&bj`[Zqj`!!jc[1p ! rlSm-B4Llc[1r'-BaraS#"!!3'#%``!#3!`)!N!5TV[N8S53+8+eFli(U844&1L# ! 8I%*%*D,X3!**)!9V@)P!"D!T4##!3!593&!8!8)8!"8!&##2`2r`%`!q!$CdA%! ! &r#!5'L!%J!NJp0r@XT+T!!BmBQK!-BJJNBaM'-)4LJbK[-BaM%NBa9%0$3%%!"! ! J)""!!*!$!J#3"+V4q!!!'!#3!b-B!S!!N!0'*)+L3!!!-c)!!US!!!(iL8!&S#P ! %))"!"*9!8"3"3K3!&3!8))r!rr!M!")!#DaL)$hm2j%U*!bi18#9K9,8)A%!#QK ! #VhJaM9p"l'-)`K#+$5&DaM'-#4M%N45)!(qFph2p-ReRHICraM@-IUJ38jlh[Fj ! cNQ-B1SjcSaM',ZILjmk0Uc*!!99J"@YBq8(p[qPm))"!"29rhrIrIjAi&IJ9q)r ! !rrGP"mMmL+rLlF[m)(c))(0m+IkAMlP))Dr2LUL0)-41L)!LVrd)qp2k$L%Cap( ! cL4M%LL5)!)aM'+4M0'ZBaMQ#4M9843339'-BaM'-8Rrr9p'-BaM'0B%m50'1CZb ! 2rKPTN!!"ripq-E'2arq3"*Fc$$--)(i(rbIq*rq3!rLP!S88L+aM'X[m2j%S2iK ! m3!k3!)89Y5%K!"-T!r$%NAKI424M#-)4LSdK'-B4L%NBe)4%5!#-B4qNBcaV'-B ! `FNBe*%LS%(IM'-BIrp*M'(k4M'-BaM5(j%M4M')"#!3KmNeV@2P,rEhi2%!#3!6 ! eprphrhq"q8(p&IK2rr`)S`+*&)KdBah6r#!5'#"`Id!1N!!!9V)5!3!5+L)Sa*% ! )))#%BaM#%BU-S4M'%Ba*&@e%K%J!R'%B*'-bDaM'-!T09943U"%N*cR1%)35BaK ! 5NBaR1-BeL5j*dCaMraJ%3(*)!IL*5L@P!!"!!N!%P"3"9!&!!#&!*43J6rrm#+- ! #Na5)*&838r`rJ!JNJ$L!!*!!J$T0$!!3BFrF*cL1G3!%G(c[IJk2G(mBZJk,L1* ! '*2iir'qHpk2M-@XAHI$aY)U,rUJ1)pV@YHpldQ-IhZjcQYHjc[%N4XjXBJ$J!(" ! TP@YBL8SPT3!!3!*!"*38!93"3!!K3#88)%rrr!GY!VlR5(1fi$hm)(rj)!!!J!$ ! `!"!!N!-3)!#3"3%!N!`"!*!')!#3"8!J!!"!)!#3"%"`!R!!N!1!!*!*J!3!"N! ! !N!N"q)P+*D8!!%!#3!58&!&8!8!!)8!P&#"2rr`!)!!!"!#3"#(ri!!*)!#3#L! ! !N!B#!*!B!i$!!!"!)!#3!`1!!!3!N!-"!*!*"`#3!`'!!*!)"@YBL8SRj`!!3!* ! !"*3F!G`"`!!K3#88)%rrr!#3"!3!N!4!!*!$#-!!N%S"!!3!#3!1!"-!'!!D!"d ! !)!!P!#S!,!!a!$)!0J!l!$d!3J"(!%`!83"@!&X!B!"P!'B!D!"V!(!!F`"i!(d ! !JJ#(!)`!N3#@!*X!S!#P!+J!V3#b!,F![!$"!-B!b`$3!08!fJ$I!13!k3$Z!2- ! !q!$p!2m"!`%&!3J"$J%3!48"'J%I!53"+3%Y!6)"0`%i!6X"3!&#!8F"6!&4!9B ! "@`&J!@8"D3&Z!A-"H!&p!B)"K`'+!BX"MJ'6!C-"Q!'G!D)"T`'X!E%"YJ'l!F! ! "a3(+!Fd"d!(5!GF"h!(K!HB"k`(`!I8"qJ(r!J3##3)1!K-#'!)G!L)#*`)X!M% ! #-`)i!Md#3J*(!NX#6`*8!PN#AJ*N!QS#D`*`!R8#HJ*r!S3#K3+*!Sd#NJ+A!TX ! #S!+M!UJ#V3+b!VB#ZJ+p!X-#b3,-!Y)#f!,E!Ym#i`,R!Zd#m`,h![d$N!-*!`m ! $&3-E!am$)J-P!bN$,`-e!cN$2!0#!dJ$5`01!e3$@J0I!f8$DJ0[!h8$HJ1!!i8 ! $LJ12!j3$Q31I!k8$U`1a!lB$Z31m!lm$``2)!md$d32@!pF$h!2J!q3$j`2Y!!B ! !"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B!"J!'!!B ! !"J!'!!B!"J!'!!B!"T!$!JB""J!'!!B!"J!'!JB""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!'!3B ! !"J!'!!B!"J!'!3B!"J!'!JB!"J!'!3B!"J!'!!B!"J!'!!B!"J%'!!B!"J!'!!B ! !"J!'!JB#"J%'!!B!N!-'!!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-'!!B!"J!'!!B!"J-'!!B!"J!'!!B!"J!'!JB!"J!'!!B!"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!'!!B ! !"J%'!3B$"J!'!!B!"J%'!!B#"J!'!!B!"J%'!!Err`!!#pk3!!#3"2m!"`!!rrd ! !"`!2"18!$!!$!*!$3J#32$J!N!`'J!#3"9@V9L*3!IJ183J3!J!)LR!(!(!"`38 ! !!+3!#JJ3rJ2rq!#3$5!!N%!&4%!!N!3+8!!!$!!!#`#3!b#!!!!"rL*3!@J+83J ! 3!J!)LP!&!&!"338!!+3!#JJ3rJ2rq!#3#32!!!!J!!!+B!!!%!!-!*!FF(!!N"! ! F!*!%"J#3"%5!!*!)%!#3"L#!!&@V9L*3!@J+83J3!J!)LP!&!&!"338!!+3!#JJ ! 3rJ2rq!#3"6J!'!$d)!!!)!!!$C!!!08j,&)J!!,PcKI0pcJ!!F!lc[Iqk2$'%BZ ! mlc[aM'-Ib")!J3!%"JK-!*!*+QZ!)J#*!3#!Tc[JH`##)!k)$4m35)6B[F3!)SS ! !!!(q)P!"D!T4#"!#!!L+8!8!8!&""3!!T!!+#"$q!rri$[Jq!!!4cL!"r#!!)#! ! $!$NJIGr@XP+S!!-H-633'-3))L"'-B`K'+$+'iaM'-54M'-3b"8!33!%#!K--!# ! 3")!!N!-UY&4&+%N#P%YBaJ#NP%848BJ3U*!!N3PSaL3!**)!9DY@)P!"D!T4#"! ! #!!L+8!8!8!&""3!!T!!+#"$q!rri%8JL!"Z5-5!&r#!%6#!%J#P24095dQ&a!!8 ! 8)93J'-33%#p'-B`K#+$5&FaM'-#4M'-3a"L!!3!%#!J%%!#3")!!N!-U"%!!!!B ! !N!-)aJ#J!*!$%BN4q*!!!!!-aL!!##!!!!(q)P!"D!T4#"!#!!L+8!8!8!&""3! ! !T!!+#"$q!rrlF8!3!#3k-4!&r$mLNL3%J#Rr4)8ae#&a!!8d*THm*dDRb&$(d)` ! K#+$L%DaM'-#4M&844"!!(qFph2p-RhRHICh4M@-IUJ3Ljlh[FjcNQ-B1SjcSaM' ! ,N!")ZI1MDXBN!"C+@P@V9Mj3IfrkA`J3!J!)qPrprprrIq8rJ+Ii#Rm3rJ2rr** ! (b2a%4M&i(I`J)9)J5cJJ$d52Q)JKVm!*9%(iBNM'`!5@rM#2[6qJ`K'FI4miNBa ! )SN)3!#-BaLNBc4V'-BjLNBe9%8N%)aM'-BaM&*M(eIaM'-BaMARr%M4MQEh%rqQ ! DT3!"rq2IM'aMmIq3"B['-'$'$"!I`(rm4rq)rj!%r**#K54%4r'1kr`rqM!rX(` ! J$d5&&93K)3q*P)%3BNLm*mL@aM#-)4LJiK'-B4L%NBa84%)3!#-B4qNBcKV'-Ba ! FNBe*%LS%)rM'-BIrp*rq&k4M'-BaM4")%M4M')!)J%%V3Y@V9Mj5rfpq$a!!)J! ! )qRlrqprrIq!rP!Ip#Rm)rrrm!h&#L54%4M'0Dr`J*"%J5(iJ$d3!&E+K!3!4&3% ! 3BNL%%"!AaM#-)4LSdK'-B4L%NBeL5%%3!#-B4JNBc4V'-B`#NBe*&#S%)`M'-B3 ! K"*M'&+4M'-BaM4**%M4M'2r`J%*r3S!"rL*5L@P!!"!!)J!)LJ+!#P!"3!!%&!" ! &#JJ)rrrm!"&#N54%4LU1kr`r)2%NX(fJ$d5!9V%5!""4&K%8BNL+L##3!%BaM#% ! BU-S4M'%Ba*&@iNK"%!!R'-BT'-bDaM'-)T0994JU"'FCcR1-B45BaK@NBaR1-Be ! 55j*dCaL!%3!%#U99UeBL8SPT3!!3!#)!#)S#J!T3!8!!""3!43S)#2rrr!!43U- ! Na$SUL#[m)!F3`!!iB!"%J$T1NJ!3B1IZ%ja(-S!!MdI1pq$SpdIaLk$SZ)iNBNr ! !N!"r'qFpb2M-@XAHI"aY)U,rUJ1DjV@YFjlNQ-IZZjcQYHjc[%N4XjXBJ!i!$`T ! D!!(q)P+*D8!!%!!L!!L+!S!+8!&!!!38!%8+#!Mrrr`!&N+qad)4fh!Grq$i%!# ! 3!b!!I3!3!!`!%#!!N!D!!*!-3!#3"A$`!*!&%!J!!"!)!*!%%"`"!*!%)!#3#5! ! "!!%3!*!*9DY@)P+*D8!!%!!L!!L+!S!+8!&!!!38!%8+#!Mrrr`!%!!!"!!3!!! ! 4q!!!%!#3#b!!N!B"!*!0)!#3#`%3#!!!%!J!N!-"%!!"!*!%)!#3#5!!!!(J!*! ! +!IiL8SPT3!!3!#)!#)S#J!T3!8!!""3!43S)#2rrr!#3"!3!1!!!%!#3!a!!N#h ! J-!#3#1!!!J#3"%!!N!J"`!#3$9@V9L*5LIR!!"!!)J!)LJ1!$R!"`!!%&!"&#JJ ! )rrrm!*!0%!#35`%!"!!*!!i!%`!C!"S!(3!J!#8!+J!X!$%!-J!h!$`!2J"$!%J ! !63"5!&F!A!"K!'B!C`"T!'d!FJ"f!(X!J3#'!)X!N!!!P3#D!*m!T!#T!+`!X3# ! f!,X!`!$&!-S!c`$8!0N!hJ$M!1J!l3$b!2F!r!'3!`3"#3%-!4%"'!%D!4m"*!% ! T!5i"-`%h!6`"33&#!88"5J&-!9%"9J&E!@!"C3&U!@m"F`&i!Ad"JJ'(!B`"N3' ! 8!C8"Q!'G!Cd"SJ'R!D`"X3'f!EX"`!(&!FS"c`(8!GF"fJ(F!H%"jJ(V!I!"p3( ! k!Im#"!)*!Ji#%`)B!Kd#)J)R!L`#-3)f!MX#23*#!NF#6!*4!PB#@`*J!Q8#DJ* ! `!RB#G`*m!S%#L!+2!TB#P`+E!Tm#T!+T!Ud#XJ+e!VS#[`,%!XJ#c!,3!YF#hJ, ! L!ZN#m!,d![N#rJ13!`S$%3-@!ad$*!-V!c)$130!!d8$5300!e)$@30J!f3$D!0 ! [!hB$HJ0q!i8$L`13!!19!jS$R`1P!kS$X31f!lX$`!2&!mS$c`29!pX$i!2P!qJ ! $k`2[!r-$q!2p"!%%"J3("!`%%!38""J%'!3I!!F!"`!(!!F!"`!(!!F!"`!(!!F ! !"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!!F!"`!(!`F ! #"`%(!3F""`!(!`F#"`)(!3F""`)(!3F$"`%(!3F#"`%(!3F""`%(!3F""`%(!3F ! $"`)(!3F""`)(!3F!"`%(!3F""`%(!3F""`%(!3F#"`%(!3F""`%(!3F""`%(!3F ! ""`%(!3F""`%(!3F""`%(!3F#"`%(!JF""`!(!`F""`%(!3F""`%(!JF""`%(!`F ! ""`%(!JF""`%(!3F""`%(!3F""`%(!3F""`%(!3F""`%(!JF$"`)(!3F!!!%(!3F ! ""`%(!3F""`%(!3F""`%(!3F#"`)(!JF""`%(!3F""`%(!3F""`%(!3F""`%(!3F ! ""`%(!3F""`%(!3F""`-(!3F""`%(!3F""`%(!3F""`%(!3F""`-(!3F""`!(!!F ! !"`-(!!F!"`!(!!F!"`!(!JF!"`!(!!F!"`!(!`F!"`!(!`F!"`!(!`F#"`)(!JF ! !"`!(!JF!"`!(!!F!"`!(!!F#"`-(!`F#"`!(!!F!"`-(!!F!"`!(!`F!"`%(!3F ! ""`%(!3F""`%(!!F""`%(!3F""`%(!3F""`%(!3F""`)(!JF$"`!(!3F""`%(!3F ! $"`%(!!F!"`%(!!%!"rrr!*!$3J$`!*F!N#m"!!%!#3!!5iN!$!!!5i`!N!-@!!T ! CH9YVA(9@D&G[@'a6BP4U9@j5,!#3!aB!#PPC@dYF99C)9fpB6&0#9%T96P)X!*! ! $3Q!!!*J!N#m"!!%!#3!!1!N!$!!!1!`!!!M#N!!!N!6[!!S!!2rf!!S!$!0R!!S ! !!J#3!c3!N$%$J%d!N"dIJF!!N!C`(!F!F!#31P4!PP+!!!'!!*!5!U!!N!3@J8! ! !N!5!!&!8"3"3!*!*"4!!`-!!!)!!N"F"aJ#3$J1!!i!!!!N)&N#4!C!!8N3&*%" ! -!$J!!H(J!*!*&S&1!*!$$3!!8"3&!&!!!99!!!!22!$IZIdP*3!!ZAI&mhh1!!' ! 1%mlRqk--BJjGjhRIM'$'2d+!JJ"!`K-B!*!$"!#3!`90)4hjG DB%+TQfN+TT ! #UI*$4!pb%KH,3$jfS!#)-rq@q9%!!+!*!!"AP!8!8!!#PN!L3"r$q09@58B5%!& ! (L)d%"M%%%P%5-C4%B`bM(Q-BaL5-B-BM)d"#!%%#!3J!N!-%!*!$"9BK)aQ-3!# ! 3#e,N3G@0c-VF"&#)"#48L5Pfcf#!0!!4")"FpJ@"f!!#USK3$jr$#)r58))IN!! ! "43N9k!SaUqKQUM#-4#-0)UeM'-B%M&8T45)!'jRERlF[EQjlIc'$'I9!FU%9M&h ! GhGQCQrEQCQDCQ8e81r@0,3US2P#DT%,mP)P'l'#q5+!6Z)60`rcr#f!!N!1+-&r ! $#)8jZ9)5I2*&%k3I#Fm3"+UVd)pdr`iL6@2SqF5+P4#*%J!'CQ8Q8dbCQCb&+P5 ! T+#"bSG@-CT!&C9+CN!9"6NIeYFd+L!MmU"q"*+4*GUrJb9NrS89*IAm0`pb3!!! ! !2`B`rm-)J"4Q)K83!N8JIKL5)3[T+[i`M%4MM5)-i`M3*)U++*%5!"jLI5C6M*Q ! CQ'8U9%P&32rK%iaQN!0Mrre5QC!&!93llidXb!!qN!$+T%,mT)N@U"&2DL+K19) ! &!Geq92rm!!#+-(r$#!"8TP)3%!4&4%8BNL)%%#G'-C4%BibL$1-+bL5*#N54#J! ! QCQ%Q8dbCQCJ9*#LTK8#-Ba1-CT!%)L&5QC!&!15&aBS5%!!4%)J%*#5P+4DS#NK ! +BN&#+38!93"8J!!!#&)[Rm-)J$NCL5!"$$RlK1F4c+!"%%I1jm1MG(i-A3G&a(% ! +4*m+2aqCf4j6,*PZH1,N+4Ie3)aGmA1GhGhCfCe5PQCQGhF!6d3&XH(J!!%IFVr ! r*e[T&VJE2V'J332NK`"9!&2J!*!$)HLI`rJ!%!!!`!%!N!FJ!!i!N!N"!*!&!BB ! !N!3%!J!!#"!!N!-"!i!!#!#3"3J!N!Si!*!+"!!!(i!!N!3"!*!%9`"`!*!&)"r ! q!*!'!J#3"d!!N"FB$!!!#"!!N!-'!*!$%!#3"4!!N"8%!*!)!J#3"(!!N!B"`!# ! 35!%!"!!*!!i!&J!G!"i!)3!N!#N!,J!`!$3!03!j!$i!3!"&!%S!6`"8!&N!AJ" ! M!'J!D3"V!'i!F`"f!(S!J3#'!)X!N!!!P3#C!*d!SJ#R!+J!V3#b!,B![3$#!-F ! !c!$4!0B!f`$J!18!kJ$a!2B!q`$r!C!$"3%(!3S"%!%5!4B"'J%H!5)"*J%U!5i ! "-J%d!6F"1`%p!83"5!&-!9!"9!&B!9`"A`&M!@J"E`&d!AJ"I!&r!B!"J`')!BJ ! "M3'5!CF"Q`'J!D8"UJ'Z!E)"YJ'k!Ei"`J('!FS"cJ(5!GB"f!(D!Gd"i!(N!HJ ! "l!(`!I3"q!(m!J!#"!))!JX#$`)8!KN#(J)M!LJ#,3)e!Md#43*(!NS#6`*A!Pi ! #B`*S!Q`#F!*e!RS#IJ+$!SN#MJ+4!T8#QJ+K!UJ#VJ+b!V-#Y`+q!X%#aJ,,!Y% ! #e3,C!Ym#j3,T!Zm#p3,m!`!$"J-+!`i$%!-5!aF$(J-M!bX$+`-V!bX$+`-V!bX ! $+`-V!bX$+`-V!bX$+`-V!bX$+`-V!bX$+`-V!c%$0`-q!*!-rj!'"JErN!B!!2q ! 3(!!(rj!'!`-"!`%&!3F!"J!*!!J"!`!%!!3""`!'!33!"3%$!3B!"J%'!!B!"J! ! '!!B!"J!'!!B!"J)%!33""3!'!38""J!)!3F!"J!'!!B!"3!&!!B!"J%$!!B!"J! ! &!!J!"J!'!!B!"J!'!!B!"J!'!!B!#!!'!!B!"3%%!3B""!!%!!B!!`!&!!8!"3! ! &!!8!"!!&!!8!!`!%!!8!!`!)!!8!"3!&!!8!"3!&!!3!"3!'!!J!"J!'!!8!"!! ! #!!3!"J#3!`B""`!'!!8!"J!'!!B!"3!&!!8!"3!&!!8!"3!&!!8!"3!&!!-!!`! ! %!!3!"3!&!!8!"3!&!!8!"3!&!!8!"3!%!!8!"J!'!!B!"J!'!!B!#3!*!!N""!! ! %!!B!#3!(!3S!"J!&!!8!"J!'!!8!"J!(!`J#"3%&!!8!#!%*!!B""J%$!!8!#!% ! &!!B""`!)!!J"#!!'!!F$"`!'!!N!#!!&!!F""`)(!33""!!'!!J!"J!*rj!S!!B ! !"J!(!*!%#bD3!!#3"1m!$`!!rr3!$`!2"*N!$!!$!!%!2J#31h!"-J#3"!B!N"B ! "9!#3"4q!i!#3#Ji!1!#3#`8!N$SSL!*-NN!!!!N!N"d@J+!!N!F1I1!+!#J!N!M ! `!!!&!!3!!$!!!!3!N"d($!#3%3F!!)J!N!-%)3$C!)JJ'3D*"!0%JJ%!N!X"9!# ! 3"4EmS!#3"!`!!!T%S!S!+!!!#8U!!!-"qm!!"G&1IQ&*)!!%a1r"IRI[2!!!m!# ! 2R[2rHKJ``Ji[I2I2IiB-"M(p"3"!J!)$""--!*!%!J#3"!UC%(([i[3S%T9Q!34 ! 5TYX3LP@)45Z`$(J$cJ!!G&S!IRS!!"%!crq@a+H!!!5!#)!!#PbJ#J!S!!!56)! ! %4J(m,r!&er@5N8M!!!NY%)0!J$$#!!%*i)KKLK#''$&$(M$$$$#)KJ`'-3b'J## ! !!J3%!33!N!3#!*!%#UB3)KKM$#!!N!d"54+%"9%H(LEJ!+#&9!!+!#44&[5S3!# ! 3!a%!)!T3S!S!+!!!%T8!3!`"r#J3"B+8P+#(mJ!+&K%&33"3`J34#K&)B)B3JKJ ! b3Ud`````#)B-49%8K!!1mjlZIEF@c@GjphG'-4M(kS!S8JK6$#jcR1FjcR1P+cR ! 1Fk-Ba8Z3!)(T85%K*8!!S)`!K*p%%K%@P,!Zik5!%3!J#P#RqJ!SlJ#3!a#NArA ! m+"!&MmaS3)6#!")8%`Ppm%p$5!J8k8qJKK##'$4#66$$$$!)K4**5K4%!"'-Ba5 ! 18bFcQ-BiLNBa'-3UJ#K5#&---BaM'-BaM'8XaM'-BaM&09"lq9*Fc+4!%5#99)K ! %4(%4GTH`-44%J#1b8!T3T"Z!la%!N!-"&(rpr#J3"B8'%+#&,jm5&##4!`L3!-) ! 6j#8U+'#(hTri1%)-X2d2c`L&%UL+*%3!$i`M&)a64L-BaM##4LUP4&*!4)S25`` ! [Hplh`M'-C5M'-BaM'-3&1)Ij89,3J!(jr+3$m$p%N!#44TB`,a6)r#&-8*[6[hM ! rJa%!N!0q$(rjr#J3"B!&,45%!J!L&%"K!`L3!,iJ!N8U+'#'%)BB0%)-X-%0!)L ! %SUP%4#3!%B`Mp)a6KL-BaM"b48UL4)U!4)S)5``aM'-B`rrrj5M'-BaM'-3&%)I ! e80c3J!!L)-98L%4&%4&fPqK4p9#'33#*+0)*5m([(rrJ!!)-3rRm+"!&J!96#)3 ! #!#)8J(q$#4##%!4%prKJKK#'($*#$($"$)#)K+%44%3N!"'-)`5-8dBM'-B`#N9 ! %488+J2rq#%F--BaM'-)3K#8SaM'-BaM%"4"lmp$5c)!!3L#%!)5%44)4&T3)83C ! 4K8%bLNrcq8Tr+4!!N!-4&%BIr#J3"3!9Na4)!!""*3L"3`N3K![S!J3BBBS3KK` ! a3Ja``5a3L)4"%L5%&!!4M'-8M&-Q)aM'-)T-K%M'#S#$"KK($$'-BaM'-BaP+-B ! aM'Fjc!94"H&4)5%!!I`KK93!"%8N84DF"*%88B#"638J!!&+!#N4!*!%T%J"r#J ! 3"B!1M1*)!#$!arF"22%218333F3IR[2`HK[3rJ`[323[#(K"%L6m&(q2mjlNI&- ! @)aGjm('dK%LrkS#$"Hr#mmplh[HjcR1P+,R1FjV@Y!1qK!&f(Ki!!)3qH!2rj(V ! 2d4D!$-lVMS#"!Ib3!!!"5J!SlJ#3"%2!!I`[m!8!"!!!-!!J!*!)3!#3$JJ!N!B ! '$!#3"3J#!*!$3#!!N!3%"`#3!d!!N!B3!*!+!3"i!*!)!93!!%!!!"D!!*!&!3# ! 3"!&+!#J!N!C!!!IJ!!8!N!C!!*!)J!#3()J#!*!$3#!!N!4%!*!%)!#3"L!!N"Q ! !!!!@J!#3"3%!N!3"bJ!S!*!&"%!!N!3&!*!XF!`!N!Ni!*!%3!#3(!&8!*!&(i! ! !N!8#!*!&$J!i!*!&!i!!N!3&!*"&!3!%!!X!%!!A!"m!)!!M!#B!,!!a!$-!1!! ! j!$i!4!"'!%`!8J"C!&m!C3"V!(%!G`"i!(S!IJ#$!)F!M3#9!*`!SJ#S!+i!X`# ! i!,i!a!$&!-X!d3$@!0d!i`$T!1m!p3$l!C!$#!%1!48"(J%M!5J",3%[!63"0J% ! j!8%"3`&)!8d"8J&A!9`"B!&P!@S"E!&[!A3"GJ&r!B3"L3'1!C-"Q!'G!D%"TJ' ! V!E3"Z3'q!F-"aJ((!FS"d!(3!GF"hJ(N!HN"l`(e!IX#!!)&!JS#$`)8!KN#(J) ! M!LJ#,3)b!M3#0J)j!M`#33*'!NX#8!*9!PS#A`*N!QN#EJ*a!R8#HJ+!!SB#M!+ ! 5!TN#S3+T!V)#Y!+h!Vd#a`,2!YB#f`,I!Z-#k!,[![3#qJ-"!`B$#3-1!a-$'`- ! N!bX$-!-a!cB$2J0"!dF$6J08!eN$AJ0P!f`$F30i!hm$L!1-!j-$Q!1G!jm$S31 ! Q!kd$XJ1r!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`1r!lm$[`2 ! &!mX$e3!!rrm!N!MrN!B)#2q3"J!!rj!N"!3"!`%&!3N""`%*!!N"!`%&!38"#!% ! (!33""`%$!3F"#!-)!3J"#!%)!3J"#!%)!3J"#!%$!33""J%(!3B"#!%+!3N"#!% ! )!3J""`%(!3J"#!)&!!F"#!%(!3N"#!%)!3J"#!%)!3J!#!%)!3N"#`%(!3F""`% ! %!3F""!%%!!J""!%(!3F""`%(!3F""J%(!3F""3%'!3F""3%,!3F""`%(!3F""J% ! (!3B""`%(!3X""`%(!3F""3%$!38"#!!!!3N"#3%)!3F"#!%)!3J""`%(!3F""`% ! (!3F""`%(!3F""`%(!J8""3%&!38""`%(!3F""`%(!3F""`%(!3F""`%&!3B""`% ! )!3J"#!%)!3N"#J%+!3X""!%&!3J"$!!)!!X""`%'!3B""`%*!3F"#!%*!JS""3! ! '!!B"#J%,!!F"#!)%!3F"#J%&!3J"#3%)!3J##J!)!3N##3%)!``"#`%'!3N""`% ! (!33""!%(!3N"#!%2rj!S!JN##3!+YYX!N!0%!*!*#!!-!(S!33"k!!`!#!#3%`J ! !$!"q!(m!IJ!-!!J!N!X(!!N!N!0%!*!5!F!"3!&!"h!#)!&!!)!!N")"`!(!!F! ! (m!2J!F!!J!!*!!J!N!0%!*!+%!!`!&i!JJ"H!$!!%!#3%a!!-!"q!2i!IJ!`!"! ! !N!S)!!B!N!0%!*!9%!!T!"F!#3!*!"m!N"83!$N!(`!2!!m!(`!,!!X!N!0%!*! ! 8#!#8!1J!N!!!N!!!q!#3&3J!R!$i!2!!m!$i!!!,!!3!N!0%q!#3!!#3!!$S!*3 ! !#!#3&IJ!m!$`!2J!R!!)!*!@"!!%!*!$4!#3"!r`#"!)%!J3#"!)%!J3#"!)%!J ! 3$r!!N!J2m"ri'*!5(rJ2m!#3"3F!"`#3!d3"!!+!"%!1i!+!!S!$J!#3%J%!!i! ! (`!rJ!i!$J!1!!*!6"J!(!*!$4!!I!!N!#3!A!#N!%!#3&4m!$`!2!"m!13!3!*! ! 9"!!,!*!$)!!`!"!"3J(Y!!3!N!J,4(9ZCf9[EL"0BA!S#J#3!cBeU90dD@0SG'P ! ZCb"0BA4SC@eKG'PcBfJJ3f9ZG(*eE5`J3@ecG'9bC'&Y,#!a16Jed$%jN!-!N!1 ! !!2q3"2!!N!2`!*!$r`#3!r!!N!2mm!!!m!#3!rrr!!$`!*!%$`!!m!#3"!m!!2! ! !rrm!$`!!m!m"!I!2!!$`m"r`(`m!!2$am3q3!`!!m*!$(am2!!$`m3rrm!m!!2! ! 2%*!$$`!!m!$rrr!2!!$`!*!%$`!!rj!'!*!%J!$rN!6`!*!$m!#3!rm!N!2`!*! ! $r2!!!2!!N!2rr`!!m!#3"!m!!2!!rrm!$`!!m!m3%2!2!!$`mI%2N!-!!2#3!am ! I$`!!m2%"!3m2!!$`$a!3m!m!!2!2$r(`$`!!m!m3%2!2!!$`!2rr!!m!!2!!N!3 ! 2!!$rN!B!N!4!2q!J-#!S)$`J"#!%)m3N*#Q8+P3U9#RN*!3Mj#!%2r`ri$r`2rJ ! rr$rm2r`rr$rm2r`rr$rm2r`rr$rm2r`rr!#3!d!ri#!`)#JJ2#!%)m3N*#T8+P3 ! SN*D3N*#2%)!3rr$rJ2r!rq$rm2r`rr$rm2r`rr$rm2r`rr$rm2r`rr$rm!!! ! "!!rrr!!)!!B!#!i&!!Q4")!*b)4!#1K%)!Ki4r!*2d!3#[b!%!SH!"!+&`!3#41 ! !%!L*`"!)F1!3#!"`%!J!1"!)!"J3#!!!%!J!!"!)!!!3#!2!%!J%)"!)#C!!%!J ! +8"!)#P!3#!RJ%!J%!"!)!q!3#!!!%!J!!"!)!!!3$rrrm!rrr!!2rri!$rrr!!r ! rri!2rrr!$rrri!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!rrrr!2rrr`!!!"!!rrr!!)!!B!#!i&!!Q4")!*b)4!#1K%)!K ! i4r!*2d!3#[b!%!SH!"!+&`!3#41!%!L*`"!)F1!3#!"`%!J!1"!)!"J3#)I#%!P ! B04!*B!d3#LaSN!!+dTD3!!P5P4!)6'33#5!*%!V3&T!!#KI3N!!*+#N3#8JP%!M ! (aK!)!!!3$rrrm!rrr!!2rri!$rrr!!rrri!2rrr!$rrri!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!rrrr!2rrr`!!!#!*! ! $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!32!*!%m!!2r`!!qr!!N!-2!*!%m!#3"3qr!*! ! $$`#3"2!!N!Elm!!!$`#3"2!!N!B2m!!!$`#3"2!!N!S2!*!%m!#3#Jm!N!6`!*! ! +$`#3"2!!N!6rr`#3"!m!N!6`!*!$$`%"m!#3!`m!N!6`!*!$m"r`(`#3!`m!N!6 ! `!*!$mI%2$`#3!`m!N!6`!*!$m2!I(`#3!`m!N!6`!*!$m3rrm!#3!`m!N!6`!*! ! $$a#3!`#3!`m!N!6`!*!%rrr`!*!$$`#3"2!!N!S2!*!%m!#3#Jm!N!6`!*!+$`# ! 3"2q3$!#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(`q ! r!*!&$`#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!$`!!rrr`! ! !m!!2!*!%m!mI$r!3%2m2(`!2!*!%m!m2m3'3"2m2!!m!N!6`m"$`ra!Im2!3m!m ! !N!6`mIm2c2(mc`ram!m!N!6`$`mIc2$mcam2!!m!N!6`!!m"r`%2m3m!!!m!N!6 ! `$`$`%*!%m!m!$`#3"2$ar`m"N!-2$r(`$`#3"2$`%"mIrrmI%"$`$`#3"2!2!I$ ! a!3(`m3m!$`#3"2!2(`$`%"$`$am!$`#3"2!!r`!2rrm!$r!!$`#3"2!!N!S2!*! ! %rj!-!*!&"d&38%`!N!B(8&*&4J!"!*!%"d4"9%%!!J#3"!G639C&!!-!N!3(3Np ! 143!%!*!%2'jS-c%!N!-"4P*&4J!%!*!$J!!"!)%!!J##!!-!J`!%!)4*3diM!!3 ! !!!2S!!%$k3!#!qS!!`2V!!3$l!#3!`i!2J"1!,S"XK1*!!3`#J#3!i8!J3#3#2r ! rr8m%4QPXC3T5C@4bBAFJ6@&`!&)4!!a3FQ9fD@peFb"0FfF!8"%!#P*PF'pcDA4 ! TEfi!6J!!!5d!N!3(8Q9RG@aKFJ!Eb!!04@jdCA)J4AK`E'pbC3!!@!!",3#3"!4 ! 6BACP!&06!!%Y!*!%"&&eDA3!89%!N!9)!))!N!MrN!2l"%9NDA3%9@jNE`"D!!! ! ",3#3"!0$GA3!@!!!"%0[F(N!3`!!"9"KFh4P!&B!!!9$E'9KFJ#3#+`!J`#3#2r ! rrIm$5f*N$%0[ER4bEf`J5f9jF`!Eb3!,8(9ZBh4eBA4TEfi!'mS!#%*bB@0VCA4 ! c!"[,!!9K)#dJE3!Ec!!&EL!Y)(S!'md!"8%J,5"0!"[1!!91)#dJ@J!Ec`!&-#! ! Y)$N!'p!!!5d!N!3)+'9cBf&`C5N!N!3(+(0`B@0P+3#3"!JSC'9XCA4P+3#3"!J ! SFQ9dGA*Z+3#3#(-!K!#3#2q3!pX%5'9XF!G2F(4TEfjc!!"2!!%Y!*!%"%KPE(! ! !!$m!$%4PFf0bD@*P)%YPH3!!*J!",3#3"!G@CA*cD@pZ!!"f!!G)DA0dEh*j!!" ! @!""@CA*cD@pZ)%CPBA4eFQ9c!!!M!*!&+J#!!*!)rj!$q`%8$N&LEh9d)%jPG%K ! KBf[*!*!%!5d!N!M'!)8!N!Mrrrh["%PZCQm05@jfC@jdEh*j)%&XE!!!D3!35@j ! fC@jdEh*j)&0PE'9MG!!!53!'3@4UGA0d!!!M!!%Y!*!%#8a[EfXJ4'phEJ!!1J! ! -4'9cBh*TBQ8J6fjP!!!l!!e%CA0MFQPLC5"0B@jj!!![!!e%CA0MFQPLC5"8FQ& ! `!!"H!!%Y!*!%$%0KE'`J6@pZFh4PFJ!!3`!,6Q&YC5"2BQTPBh3!!#-!#d4TFf0 ! [GQ9bD@9c!!"F!*!&Z3#)!*!)rrrlh`90B@GTB`P%FQp`)%PdC@d!!'3!#d4bEh! ! J8f9XC@0d!!"%!!C3D@0VGA!!!#`!$94[CfGXC5"`D@0VGA!!!%!!!5d!N!3$4@& ! d!!"P!!45C@&N!!"b!!94G@&QCJ!!F3!$4'P`!!!M!!%Y!*!%#daTFh3J8h"PE'a ! c!!!V!!T$BA0d)&0`C@aX!!"D!!0DBA!!!(S!"NPZGQpVC3!!)`!$8R9L!!!M!*! ! &Y`#*!*!)rrql[`4#DA4c"P0PBA*MD!!!F`!+3fa[Ff8J4'p[FJ!!B`!*6h"PEL" ! %Efpb!!"[!!9"F("XH3!!B3!%5fPMD`"%%3!",3#3"!C9ER4bBA!!!#-!"8C[FQ0 ! P!!!M!!4-Efpd!!!M!!%Y!*!%"d9ZCh*KGQ8!!%8!!d4TF!!!)`!$8fPd!!!M!!% ! Y!!!M!JK$E'PYF#"9F!!!2!!+3faTE@)J4'phEJ!!2J#3"BX!bJ#3#2q3"!Y`G@j ! MG(9KG'P[EJ)J,J#3"!)J,!#3"!)J1`#3"!)J1J#3"!)J)3#3"!)J2`#3"!)J+`# ! 3"!)J,3#3"!)J23#3"!)J)`#3"!)J*!#3"!)J3!#3"!)J*J#3"!)J+J#3"!)JIJ# ! 3"!)JA`#3#(J!b`#3#2q3"!KLFQ&MDf9dF`&E!*!%!9d!N!3"+!#3"!%T!*!%!AX ! !N!3"I3#3"!%m!*!%!6i!N!3"AJ#3"!&J!*!%!5F!N!3")J#3"!&F!*!%!5m!N!3 ! "I!#3"!%P!*!)B`$-!*!)rj!%"@%J,5"Y!@%!N!3"BJ#3"!&M!*!%!@3!N!3"C3# ! 3"!&Q!*!%!@F!N!3"D!#3"!&T!*!%!@S!N!3"D`#3"!&X!*!%!@d!N!KM!-d!N!M ! rN!3&EL!Y)(S"EJ#3"!&[!*!%!A!!N!3"F3#3"!&b!*!%!A-!N!3"G!#3"!&e!*! ! %!AB!N!3"G`#3"!&i!*!%!AN!N!3"HJ#3#'-!cJ#3#2q3"!9")#dJ63&"!*!%!8) ! !N!3"3`#3"!&%!*!%!88!N!3"4J#3"!&(!*!%!8J!N!3"53#3"!&+!*!%!8X!N!3 ! "6!#3"!&0!*!)B`$2!*!)rj!%"8iJ,5"D!8i!N!3"6`#3"!&3!*!%!9%!N!3"8J# ! 3"!&6!*!%!93!N!3"93#3"!&@!*!%!9F!N!3"@!#3"!&C!*!%!9S!N!KU!-N!N!M ! rrrhr$'0[ER4bEf`JDf9jF`&L!$%!!!&U!$)!!!&Z!$-!!!&S!$3!!!&X!$B!!!& ! j!$F!!!&V!$J!!!&e!$N!!!%Y!*!%!@3!4!!!!A!!8!!!!A)!8J!!!A3!9!#3"P% ! !d!#3#2q3"!8`)#dJ13%`!*!%!6%!N!3"-J#3"!%c!*!%!63!N!3"03#3"!%f!*! ! %!6F!N!3"1!#3"!%j!*!)N3$)!*!)rj!%"RGTHQ&bC!T"G(4bD@*eG'9c!!"i!!e ! %CA4PBh3J9@jcC@9Z!!"P!!P'E'p[FL"0BA!!!'B!%%GPEQ9bBA4P)%e[ER0dCA) ! !!'F!#%PNC@jdD@Cj!!"T!!P-Ef0KG'P[ER-!!'m!$NaPGQ9X)&4PE'9`Eh*d!!" ! f!!4ADA0S!!"h!*!&A`$4!*!)rj!%"f0eFR*PER3'9f9KF'pZ!!!T!!9"FQe[FJ! ! !@`!&8QPZCh-!!$d!"N&YG@aPG!!!)J!&9'p[E(-!!#J!"%G[E'3!!#3!"P0`C@a ! XF`!!+`#3"5`!J!!+!)!!N!1"!*!$JJ#3!i-!N!1%!*!$K3#3!iB!N!1(!*!$L!# ! 3!iN!N!8X!-J!#J$)!*!$b3#3!mS!N!2,!*!$c!#3!md!N!21!*!$c`#3!p!!N!2 ! 4!*!&N!!!$4'P-M!a)%0[ER4bEf`J5f9jFa#P-M!b)&"eEQ0dG@&dD@pZ$D8b-$- ! J3R*KBfYPG(-+T6)`0#"K)#dJE3UP-M!e)'iJ,5"k#U8b-$BJ35!Y)%d+T6)`0b" ! 1)#dJ@JUP-M!i)$!J,5!j!U8Y#"ZPCA0MBA"P"b#PFh"KBf8)#+9NC@aPG'8)$D9 ! bCA4eFQi!N!0P!!d(!U9MG'`YBJF+T@0dE#eU"`kPBh4X,@i(#+9MG'`YD!F-T@0 ! dE#eX"aQPBh4X,AN(#k9MG'`YD`F9T@0dE#ee!U8Y"`5PBh4X,@3(%+9MG'`YF!F ! 5T@0dE#eb"a5PBh4X,A3!N!-L!"!",J%X!6X"1J%K!6m"+`%Y!6d")`%N!8!"*J% ! U!Ai"A`#3!b)!%!&E!9d"+!%T!AX"I3%m!6i"AJ&J!5F")J&F!5m"I!%P!*!$(!! ! 0!@%"BJ&M!@3"C3&Q!@F"D!&T!@S"D`&X!@d!N!-F!!d"EJ&[!A!"F3&b!A-"G!& ! e!AB"G`&i!AN"HJ#3!a`!$3&"!8)"3`&%!88"4J&(!8J"53&+!8X"6!&0!*!$(!! ! 0!8i"6`&3!9%"8J&6!93"93&@!9F"@!&C!9S!N!-@!!S"-!%a!6)"-`%d!68"0J% ! h!6J"13#3!d)!#!FBT@0dE#ei"`@PBh4X,@8("U9MG'`YCJF(T@0dE#eR"`QPBh4 ! X,@N($k9MG'`YE`F@T@0dE#ef"aHPBh4X,AF!N!-3!!F"+3&E!6d")J%S!53"+`# ! 3!dX,-A0d)'ePER8J584%9e*%#L-JEfBJ68919A023dj8"5U3"8a69%-'8Q9c)%P ! %4&G54!K5CA0PFRCPC%CA8N3&+T!&6&0843#3!aX!#!&2!U8Y!6m"*J+P,3&f!9B ! ))hCPFR0TEfi!N!-Q!!`"D3&*"b0KC'TeFh3#T5d"1J%l!5m"AJ+P,3&$"50ZB@e ! P!9`!N!-d!!)!N!9R!33!H`&8"!*25`#3"3X!83"B!@#)"&i`AM%!N!8+!"J!+J! ! iS!)!!3#3!d3!!`#3"9d"$J"a!8S%!Nj[!*!&A3"G!(%!Q33$@@9c!*!'#J"2!&! ! "8iJ#AM!!N!8+!"B!+J!fS!)!N!81!%3!4!#b!G8!J%4%-!S!N!-1!%S!DJ$6!GF ! 6L!!%-!S!N!0!!"!"F`&M!@m"B3F%T@0dE#eN!U8Y"b0eER4bBA!')fC[FQ0P"50 ! XEfpd!U8Y!88%)f4TF!3MFfPd!U8Y!6`"2J#3!a366Q9d5'&MDb"3FQ9QCA*PEQ0 ! PF`#3!bX$-)!!N!-&-bic,M!H-bic,M!JU6%j1$8Y-6Q3!b"0,L"6G'9`D'9ZFfp ! Z!*!$+`-`J!#3!`8c,M-Z-"j6G'PMD(4TEQFJ6@&dD'9YBA4TFf0S)%0PER4bG@d ! !N!06!!m",J+P,3J8T5"MG'`YG!8MDR9YF!JME@pZFh4PFJ8MGfP`C3+P,3&K!A! ! ("+9MG'`YC!8MBfKKG!BMEfCQCA)&)h"bBAN&)h*TC'8&)h4eFQi!N!1F!)F!N!M ! rN!0l!d&MG!4AB@Pd!!!Z!!%Y!*!%#&4PE'9`Eh*d!&34!!4+G@e`!!!M!!G0Efj ! cG'9b!!!M!!4ADA"P!!!M!!%Y!*!%"8&`F'aj!!"K!!03BAN!!(!!"%YTBfX!4"% ! !"%0SBA3!!#-!"8pQCQ9b!!!M!!43FQ&j!!!M!!45D@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#L0dGfp ! hC@&`Efi#T5d"9`&8!8%#T5d"8!&5!*!$m3#'!*!)rrphq`9&FA9TF!G$GA*bC@j ! d!"[4!!%Y!*!%$>C@aN)&GPBA"[EJ!!G`!24AKMD'&ZCf8J9f9KF'pZ!!"i!!e ! 6C@aPBh3J8A9TGQ9b!!"4!!Y'DA*P)&&eDACPFJ!!CJ!&9'KbEhF!!(3!"8&`F'a ! j!!"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"!C3GA3 ! J6fi!!&!!"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)%0SBA*KBh4PFMB`#J#3!e3!N#! ! J!!"!!*!Srj!'!*!%!5i!%!#3"5J"%J!m!@)%"&"XBAN!N!91!4)!BJ&L"!44G@P ! d!*!&*!%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&MC6TP!*!&H!!8!)J!5)J(4f9ZC'9 ! b1J#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# ! 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#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!0 ! 1!*!%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!()b1 ! d3c-b*'amb0aP9EZlE'9EY&Dc-L46-c)K)c)5)lY8+l4$-M-b*FCXZd-L)K&,4%Z ! dYV-c-eXc-L)MZj!$3V3VY$13"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"$3 ! LY%-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-M5e9EZl4ADc)LN!-4%e-l-b-b)M)b)T!$)$C9@lZlXcZe@lZ ! lY,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!&1maE3c9VZlY9DlZ3!l4$1f@l4,Z3"$0V4$)L)L-L)XaV4$- ! cbe9QCEZ3!d4%-c9EXc-d4$13!eZlN!1e9V9F@l-c-b*P9P@lN!0%3d-c0VY$-j! ! &0'Xc-l0&E-c'3c-c)L+m9PZlZl4$0$-c0VY%-j!&ZlXb-cAF@lY%3c-b)L%X99Y ! %4%-cN!3fY$13"#)NY$1c)heEZl4%3b-L)c*'9E3cN!3b)c1fXc13"#)VXc06@0@ ! l4*!$-L)L098d@l-b)T!%)c+l3c13!c)L+d-bE0GEZlY%-c-L)VZlXeZc)T!'-VX ! d4$-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-cYEYQ4$)L-N)VaV-K%83L)c-b0%4%3c)dY$-L@d53!c5 ! l9V)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*%X ! c-L-c)T!$06-M-j!$)L)b)L)c-b-c3b*#1c13!c)N5d-cN!-LN!-Q3b-cN!-LN!8 ! M-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)eZd3 ! cN!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!Jl@d-cN!-L-L+3!b-lY$-c)L)MDc)cY@Xb)T!'+eZ ! l@c0$3c-LN!-c-N1d-c1c)L+mZl9EY$)L)M)LN!-VZl3c0#-c3c0%-b)N-N4$-c5 ! l3dI'@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+dYEZ ! lY9Zl4,9EY%Y$)L-c-b)L)cXb)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"6Zl3d-d9$)LN!FK+c)LN!-M)L%4YM-LN!3K)NZl3dZ ! l3c)LN!-M)L)5)4-b%4)L)b)K%FXLN!84)N5lY,Zc-b)K%M)LN!853b%4)M)L)5Y ! c)T!(-d3lZlXc)L)!N!F1!!$ZN!B!!Gf3"J!#c*!'!!1lN!B!"+U3"J!&L*!'!!C ! hN!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!ri2 ! P%))"!"*AKm(Jq)8!"8!&##2`2r`!IJ#3!acJ#!#3"5!!!!jJ!!!3!*!&J!#3"`i ! !N"!J!*!3!i!#K%!3`#!)&!83!#!34!!!!`!##4#EB!!!%83!&!r%5J#ZqU83JJ% ! !%P@pIlqSK3!&3!8))r!rr!0#!*!$#4!8!,R!!!3J!`!*N!!!e6RX6#!!!6PcKIG ! pcJ!"a(HGlrh4iB`M&hRHGq-BaMr3d"!J!)$"#BB!N!33!*!$"8ehb+8*)&+&DZG ! m$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'*)aL ! U)C!!D!JJ!)%"!))!N!33!*!$"9D2`!!!`!!!!4M!&!#3!`)a*"85!!!"QC!!!"9 ! 3!"32a%S!VYDP%))"!"*9hAHeU)8!"8!&##2`2r`)`!5!!QXBL!p(rj%U*!bi18# ! 4K9,8)A%!!Nd)9Hm'-D[S2iaK'%)43D3V@-BaJ5-BNL+)3!2mjlZIkC2V1mqcrM' ! XBr9!JTch[HjcR*-B`G4cR4M'-AFr&cjdE9Q5!!UV!#YDamS2hHpPm))"!"2@lZY ! lhq9q"Ai&IL2`2rhC3I)r)L[iZh,(i(c))(0m+Ik9MlP))Dr2`P84T"L*d4!%9Iq ! K(hTr3F3M12SqF5-BN85)3!4M'-8M'D0FaM(-%M'USLNJJU-BaM'-BT2rqVk-BaM ! '-D`*iND-FcGNIr$,6*32r([aVYDr(rq3!rjGhAHeU"q"rmRrLIq3!riT3+&&)LX ! BaV,(rj%S2iKm3!k9K4@e)5%!"'8JIKL5,`[SPBaK'%)a8D3M'-)a#5-DN!#)K%! ! %B`Mp)aRM@-BaJj)aU5*&3)1r'-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%Pb6ScM(rM!)J159!r%5P'ZeU!"!!N!%PAGGl@S!!K ! 3#88)%rrr!LM!T-8L#49%&-IrJ!JNJ$L!!*'!1Nd-!"!S1IZ%ja(1S!#+Mjh[`G( ! ZMq-A3G&a(%M%Rm,(ihch[4mCLeLlciH0T&4Ip8"a(YDeVh[HNaMqph1FeVh1GiN ! L0R0M%!F!!i0-UeV%5P(Glf!"!!N!%PEZkh[B!!K3#88)%rrr!GY!VlR5(1fi$dI ! JIrNJ!!#!!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`$B30 ! R!f`$F30h!h`$JJ1(!i`$N31@!jX$S31Q!kX$X31f!lN$[!1r!m-$b!20!p%$eJ2 ! A!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!$`6d!!`!!`#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&+[V ! rVr@)+!!&)!"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!!`!Mm!!!%!!!"XJ!!!p8j,&)J!!"1A1&mhh1!!"a(HGl ! rh4iB`M&hRHGq-BaMq)#3!!3)!#!`3Q!!N!J"8e`"%!4)#!3&1Gm$f!34!(4!D2L ! #4#E&lL!"&&!"8"rL*3"A[A8SK!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&0leVhAU)+!!&)!"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&-G3 ! KF3!!Nd*THm*dDRb&@2S4K#%8(%)eM'-B%M'+SLK!J!$r1HlRqQ6lc[2XlSaV'2e ! 3)4FplhZFjb6'-(8FjdBaM&b#4FqG'eBa)!#b8Y+UY@2P"qYDkbq%#!%!"(dh[@[ ! GH[mTr!8r`&2iKr!Irq552NIL)M',`1Mm"#T%#@F%!HL!!iqBL#'[`!%94"q'*)a ! X!%PIaK(hTr3B3M12SqF5-BN85##!!4M'-8M'D0BaM(-8M'USLNJK'-BaM'-BT-B ! qVq-BaM'-DmriND-FcHiRrdc9+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'Y ! Br!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&'*)LSJJMSaM'%)a8C3M'-)aL5+Ya*#"#!!6M'-8M'C0BaM'% ! 8QUUS`9!M1-jcR'-)T-B`V5-BcR'-DT*FNk-ia!#)!#"9+UUeBL8SkeVV!!J!%3! ! %46HpDpekJ!!JS!)S8%"(rrrJ!)S9'5BKd94"@2`!iKJ!"``!#)!$J$T1NJ!3&!j ! qi6R%FbJ!#+Mjh[`G(ZMq-A3G&a(%M%Ri#)2ihcRZ4mCLeLlci10T&4Ip8"cA0De ! VR2FNaMpeh1FeVh1GiNL0R0M%!(!!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!IiL8 ! Srrrq!!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`2 ! 8!pN$hJ2M!qJ$k`2Z!r)$pJ2l"!!%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'4N ! 5#J3%"`N("C!'"!8%N!J&"*!H3!`@3!`B($3N&"`8("a%A&K3B&"L3"4Q3""J ! 8%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&"`D ! 3"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!$"35 ! 3!`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!$"*!("`53!`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!&"*!$"353"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*#3H ! 3#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,#3H3"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,"3X5%`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,"`5 ! 3"J8&"*!$"38%#3H3!`@3"`53"!8*"`F&"`B*"j!("C!%"*!$"`F&"33&"3F("JN ! ("`8&"!3("C!$"*!$"38%#`H3!`@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"!H ! 3!`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"J5 ! 3!`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%"!H3!`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"!5 ! 3"!@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%&"3H ! 3"`N(N!-&N!3""!3&"353"`8%!J%%"`8#!C!$"!3&"33%"3%&#K%&N!`#"C!$"j! ! $"!F*"j!%"C!%"!#3"aN!!2q3"*QC!!(rN!4QCJ!#rj!%-c-!!rrrc-bCQ3!%rrr ! -c'CQ!!Arrmc--c-!"[rrQCPQCJ!(rrqCQ6-c!!MrrfD3"!!*rrpQCM-c!!V-c*Q ! C-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!8 ! B)L)!N!8C%4%!N!B)[J!"!*!$(!#3!di!N!6rr`#3%)!J!*!&3!"!!*!*5!#3!dJ ! !N!8%!!%!"!#3"JK1!*!%E-CXc-c'Gfc-c'c'TRT'c-E-aQE-c+CR%A4(DQc-E-a ! QUNGQChHU4Xc'c-c'aUE-N!2'E-c-5RUUGUCk4QCXE(DNCXCN&X4-c*!$aNChT-E ! 'c-aXE-4QGk&(4NC-afTXT+TRDNT-a(E-N!4UV'DQc-CXc-aQaRTkGNCfGdCQc'G ! QCdG+UNG'aXc'aQI-ChCQc*!%C+Ch4NCf&QCdCXaUc%DQ4'4'4QGXc-aQI'aRc'a ! QCRTRC(4RDKCfUQ4QCmaQ4+HU&NCR4(CQc+GQaRE'c'TdCU5K4dGRCdGQG'TfE-c ! 'UNTf5RC'5QE'GkGXCmE-CU6-HRTf4(S@G%HQ4kCQc-aXC"URCRCk3@c'HQc-CXb ! 3"'G'4RB@C%CQC'Td4-b3"'HUCRGQGQChaQCQC'a%CRDNCfS@Gk4N4NCf4XCXc*! ! %TR4'GNGXCmaXCfc'CQE+CdGRCdGhGRGfC'6-aXb3!m6'ThCk4UahChc*aRafaN& ! kG(SATf4R4fD3"-b3"-I-akGfGfGhc%GNCkCmCXCfTNCNC'GKC'CUC-b3"XCmGj! ! $CQCR6%V+4'I'4NGfCkCfS@GUGT!$E-b3"'c'I+CQGk4dG%4d5RCQDXCfCQChGRC ! dGQHNCQc-N!4Xc(c"GhDQ4RB@C'4'GdTfCQI+TRbKCd4kaQE-E-b3!dE"c'E'CRG ! U&RHNC%CRTdaR5Q4fGQG%CQC%E-E-CXc'CRc'N!2%GfGR4hGfGQ4NI'bKa%HKCaC ! %C'c-c-E-I-CXaXaXChGdHKHRC'GNC(E'E-a(B@C%CXGhc-c'GhE(Cmb3"AGf4Q4 ! NChThCf4fGQV-ChT'4'aNE-c%GhCfE-I-c-E-a'CRTRDRC'5NE%G-b'CQGhGRHQV ! 'c-CRN!0%E-E-N!0XaQChGK5NUNG(CfG#I(V'4R4mE-CXI'Gda%V-I-b3!f6(CRC ! dTkDUGN4k&R4'&TGXGm&Uc-E(FDaQUXb3"FI(4'Tm3@4f4RB@C%CU"T4QDNHXE-a ! Q5Nc+'XD3!mb3!fCXaXI%DQDNTRHNC'GX&mUKG(E'E%akUQ'NE-b3"@ahCdV%Cfa ! hCQCdE'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(4NGR4h4RCQCXI'G"CdI-c'E'E-a-b3!fE-N!6(4RC%aRD ! QT(GhTQE(DQ&"c'b3!mc-aXc-E-CQE-c-E'I-ChGU`AHRGQ4fTU4'4%5Qc-E-CXC ! XE-aXE'4'c-c'C%SDG(&fGNC+5UU3!k&+4d&XCXE-CXE-N!4UTmaXE'5N%8Tk38T ! +UU4"SDT+GfCNTQc-CQE-E-aXCU'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%U ! U5USAE-c'aQE-N!1@E'I-c'aXaXE"URE(E'G+UNTU5NUUUNI-CXCQaXaQE&PQGma ! QCQGQCmG"GQCRT+5USD&+S8UUa'c-c(aXE-c-aaT+DUCQI(GQE('XE-ad4(&"4%T ! %T%4NaXc'aQCXN!3CN4UQ4mE-aXCN4QbNG%TdE-E(5NUK5@aQaQaQCXc-aKT8NCS ! DE(aXN!9mBDT'aXaK4*!%GQCNE'D3!fc-SA%4N!-Fc*!$aXCXCXCfV-E'bNT+DQT ! XE-aXN!6-CUT"4"%4('CXE'D3!fGUa%V+CQUUT+T'Gmc'N!6-CQ`4&"4%%4GQCmI ! +bNUUCRUQc-c%UNC+4(4Qc'CRCfE-aNT+4+UK&dGQN!0N&(TfBD(-E'aUT''THRa ! QE'GXafc'&+CU%4&"5RCfG(T%F8TaS4UU&QURDNUKTQaQafCXc'`D4Q3D4+4hGXa ! RCkC(G%SD&"5R5RT"3DUNTQb3"-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&"UUS ! DUUG+CN4(4(5N58CkI'aXTa&"S@&kHNSDS8UKT*!$C'UN5RCa5RCRTkC+GNGQ4XC ! m`DT"4+5N4%TdT%T+DUTmCU'3!a%4aQ4QaQI'Gfamc-c'TQGUHT!$UNUUT+HUSDc ! %UN4d5NV-SDUKV'D3"-c-C%4U4NUUUNUU&-E(ah4mc+GXbUUUaUSD3@E'UXamc'a ! +5Q4KG%T+UNT(E'c(C+c'N!5T%@GUT%CQCQQQCQCf38&%4NDUTU&"GXc'aQ3@c'c ! 'CN5U%CURDUC'Ci&XC%U3!d5NTUDU'U&%GfE(a+E-aQC+DK3@4QS@E-aX4'aQT%T ! RTNTh4mC"3Ac(E-aXUXc-bRTd4%UNG-6'CN&Qc'HUUNT'5N4fc-DNTXE-E-bUV-c ! -CQa+3Dc-5XaXa+4QDUU3!dCK5Rc-CK%AaXCQCUSAaQCXaQT%4Xc'aXb3"'UUDN& ! kHUTmE-bR4XaXc'GfCQc-N!4Qc-c'c*!&aNTkGRGUG"E-CNCXN!0QUUT"GXE'c-b ! RE-aXI-c-CXc'F84aGd5UNfaQ4Qc'DT!$GQT%c*!&CXE+aXCQCXaQG'4fI-4Q4'5 ! UI-4Q5UUU3A&a4QE'c!#3"``!!*Q3"J!"CT!'!!*QCM-cCQB!!c-cCT!%!!3c-fC ! Q-c-!"613"'CQ!!BcN!B!"`!!998!N!-)UT!'!!PhN!B!#P@3"J!,4*!'!!`LN!B ! !!"%@!!%!N!-F!*!$6J#3"2rr!*!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#3B ! 5"`-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)(%JF5!J-'%3)4"K)5%`F5!`B'#"-0#4)+%a%'!`B(!`) ! 4%3)3%a)6#JB5!`F'"`B5"JJ5"`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'"JF ! 5&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#"JJ6%`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)'"a3 ! 6"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-(#3F ! 5"`)5!`F'"`)3!a)$"`B#%JJ6"`)$!`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("JF5!`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!`%$"JF5%`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("JB5N!-$"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"`F ! 5"`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%JJ ! 5!T!$%3)$!`B#%3+3!a3*%`F3%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"`F ! 6"a)(!`)#"JJ5%JF'%J)'%`B5&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(%JF5!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%`F ! 6#"%#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$3S ! 6&"%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!`F ! 5!`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&!S6%a)6"a)4!`B("a-6"`)("a)+%a)(%4%'"K!3%4) ! 5#"-6#K%(#3F)%J)'!JB+&!d0#3B'"`F4#3F6%JF6%`F$!J)$!`B'"`N(%K%$!K! ! #!`B(%JF5!K)("`)#!`#3"aF!!2rrc*!%!!(-N!B!!Xb3"*QC!!2-c*Q3"!!%c-b ! CQ@CQ!!@CQFc-QCN!"TQ3"J!(QC!%CQB!#*QCCT!%!!PQN!B!#QD3"$-c!!YQCM1 ! 3"!!--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%-c3 ! d-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$13"8%$!c13"%0%-d4$384"-c0$0$3c4%3$0%3cN!3 ! d4%-`4$"%-c0%-d4%-$4%4$4"-a0%4$3cN!0%-c!c-a3c3c-a-d4$3d3c"$-c&%3 ! dN!-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*!%3d3d0%4"4%-c-d4%3838&%0%N!0$4$3c-d53""&%4%0 ! %4%-c%84$-c"%3d4%&%3d-d363c4%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$3d34-c3d-d3d3a384*!$0$4%-a4"-`"%4%0%-d4$3d3 ! d%83c4%0%36-c4%0%0%-d4%3c&%0!-%3d-d-c0%-d4"4%3`-c0%36-d&%0%4%0%4 ! $4$4$0$!c4$0$3`-$4$4%&"3cN!0%4$-d4%0%4$4$&%53!c3c!d53!c-d3d%d!d- ! c-$-c0"3c3c4$0%4%0%4%3d3c4%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%%63d3cN!-`-d-c&%&$0$4$0%4%3c0$-j!$3c-c4%38%63 ! d4$-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"&"363c0%4$3d%d4%-c-d53!c-c4%0%3d0%4%0"4*!$383 ! 83c0%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`3 ! c0$4%-c4$0%3d0!4$3d4%&$3c4%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$3 ! c4$3d-$0$-c0$4%3d4!0%3c3d-%3c4%-c4!-c-c53!c-dN!-$0$-d4*!$3d!c3c3 ! d3c3d4%&%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-d3d3dN!0$0"-d0%0%3d53"!4$4$4%N!0$4$-d-d4$-85 ! 3!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$3c36-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%"!-d3d4$"%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!!61 ! 3"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!3J!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!!iL3"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&@F ! Q*b4#*Q8QBKChGfB5*N8L%KBLCb)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%5F ! K%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-(C5GbBA*K)9BQ%d&h)5&eC"%5)d)4%KCK*LBA)93"9 ! 6GQ*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)QB5GRGK4 ! K%RCh)K*K%8%LGbFL*R*RFKFL)5BL*Q*LF4%84RBR%5Ca4hFK&a&PCb*QCRF5FQC ! KF@B@GLFQ)QF@34-@BL%9)A&"&hCLB4%KFR)8*f89CL)L3NF4GfCQB484%4)Q*Q9 ! K*%%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%53MGh%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)QBLF4G ! b)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%@35*L*K&LFLFL%5%R)L*"*A*bGR&&-@&d4LFLG"BKB ! K%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&@G ! h)4*5)4F44"GKCPFL*f&hFQB4&R&Q%LBK*hF5GLBK&b&R)LB5*534FACKF@GfFK) ! LF9BN)4%QBKBL&h*fCK8LBRFKCK)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%M4 ! LF5Gd3R9N*h)QN!4KB5%5*hCf)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*#CdF535)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!84F ! 4)8)Q%5CbCR)Q)4G&4bGK%LBL3R)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#85FRGf%@*RChBN%8)ACf*b*KCbBL*aC%GbGLB4)83 ! d%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"hCQCLF ! LC6)R)44"%6*b%N%hB@Ga!K3K%9%A&(BQCR*L"N)P84)N&KB4&%3N45FL-8CQCL9 ! ")5*P%@%LCK)R45%8&#C8%KGQGK8434*"*')4BKCQ%NBL3A&8)LCQ&dF53Q*@3K- ! bGK*4GK9(-4BAB5GfCT!$*QCLC%*K*QCA%L4(*QC%)R)@F63b*LBa%4)@B5CQCe% ! QBQBK)K&RBP*L*KGb)K-P"aF4*4)5*b&%GQD3!f)KB4)QGf*b%5*LF5&K*RCR3"% ! Q%90P38GRBN*QCP*Q&fBL4LGa)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!*!%#439&!Q3"43-#438%38&%4%&N!36&Im1r`lr$JN&%C! ! '"4)*$!i,$!@3!a)'%`N8#a85"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`i9%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!$"JN ! 6%`8&%K3*N!F9&Im,#43*%385"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%a3 ! 9#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&"K35%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#Im ! 9%`B&"4%3%"%&"3S&%C!%"C!$%JN8r`i0%4!4"386$!i8%aAr#38'"3B5%JN*%3B ! 9&!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($!i9%`B&"4)'#3`&"`N5"K)&N!-5"JN8%J85#384""% ! 8$"33%4%5&2m9"C!&%K-8&3m9$[m*"385N!88$[m1&4)&"3B5#Im*"C!$%K-,#38 ! %"`N8"C!%%a)4%3B,$4)4"3B0r``8"C!%%JN8&C!$$!N4"C!%%T!%&2q3!a8&%38 ! 5$434"C!%"JN9!33-#4%&N!35#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$[m9r``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%JQ ! 3!`lrN!--#4'3"!@3!`N8"`85#3`-"4%4"385N!-6%JN*&2m9%3-4""'3!`86&C! ! $%K36%"%&N!85"3B8#439$[rr%a!$""'3"!8*&485#48-#4'3!`8&%T!$%a)6#48 ! -#4!4%384%38&%K39&43+%!34"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*&!8 ! 4%38ǩ%`8$"3S5%4%&"4)5%a-*#Im1&4'3"`8&%K6r$K8*%"%&N!B5%`N4%38 ! 6&3X8%J@3!`B8&!N5#489%J-%"4)*%J8&%T!$%`N*&3i-&!-4N!B&"4)9&4-'#3N ! 4%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$"8 ! 8&Im9#C!%%C!&"385#3i5"4)5%a8)"38'%JN6%38*ra)3%3@3"a)5#"6r&433%!- ! 3N!-4"38*&"81rrm9#3J(#3N4N!8&%K3*"C!$%K)*&4)&"4-*"JN9ra3#%"%&N!- ! 5"C!%%K)*&480%K%3N!84"38*&Iq3!``8#3N6#434N!-&"K3*"C!%%K)*ra85#43 ! 5%`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&!N4"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!3 ! 6#4!$%4%&N!B5%JB*$43&N!35%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$!i9&3i*%K)6#4%4"C!$%T!$"JN8&3N5&384"384"38 ! 5"K)6%JN9$")4N!3&%J85"a6rr`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-*#43 ! 9$!N%%C!&"4)*&Im*"4)*&3lrra33%3@3""+3!a-*$[m1&48&N!B5"K)5#3N9$K8 ! 1rj!$&!@3!a)*&"31"4'3!`34"4)+ra8&"4)*$"89$"83%3@3"4)5%`Rr$K3)#43 ! &N!85%JF)#439$K8-$J`*"384"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*$"3 ! 4"!8&%JN1$!N6#`N4N!-&"4)5%a-8$K85%K-*&!85%K-5%`Q3!a89$K89%K'3"!8 ! 5N!-6#489&!B&"JN9&4)4%38&%K3-&")'&2m5%3@3!a)5%`N8&3N5N!-6#486%K1 ! 3!a)'"4)8&!i&N!-4"C!$"K)5%`N*"4%&%T!$"JN8$K)&"3Ir$385%JN9ra)4"38 ! 5%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#"89"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)*&"3 ! 3%4%&"4)5%a-'"4!4"4%&N!-5N!-6%`RrN!35"C!$%K6r%K!4"4)*&"84N!-&N!3 ! 5#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"384"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#`N5!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,$J8 ! 4"38'#3lr$!84"C!$%K)*&"6r&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#!N ! 8&4+3!a13!`Q3!a38%C!%"385#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!`8 ! 4"3B6#439&384%"%4"4)*r``9&4)&"4)5%`N8&4)&%K-*N!B9"4%4"JN8$!i9#43 ! 3%"%4"4%4%K)3!`-4N!-&%`N9$JN4%4!4%385#3`9N!-'"385%K-*#485"4)6#C! ! &&"35%3B*#439&385"K3&N!34"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!4 ! QCJ!%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!mkm!!$0[!!!#8)$@EbN'i`!N!-F"ii ! !'&G*6N3!"`$+9%e36!!"!5T1G@e`!!%"3N&-8P3!!`&D4%P86!!+!BT69&)M!"% ! #$QPMFc3!"!,QD@0c)`!%!b**3diM!!3$AQPME$3!"!1D4%a24`!'!pC'6dj8!!8 ! %+NC26N3!!J4b3e958`!)"*CZD$-a!!!&!NC548B!"!813Nj%6!!!"8T048j9!"- ! &9Ne195-!!3C'GQ9bF`!""Pj69&)J!!!'GQ4MG')!"JD#D@0dBJ!!"YCKBh4L!!- ! 'iR"`BA3!"`F5!)!!,3#3!hJ!N!@"!*!,JJ!)!*!$)!#3"B-!$`#3!pi!N!@%!"F ! !N!0!!*!&K3!F!*!$@J#3"BB!)3!!!3)!N!@(!+S!!$dD!*!&J!!b!*!$RJ#3"B% ! "-3!!83`!N!@!!$F!!#BS!*!&J3""!!!Q3J#3"B(rrb!!#1!!N!@!rrm!!&)N!*! ! %%iJ"@3!!8MB!N!36L3&P!!"&M`#3"B(rrb!!#2!!N!@!rrm!!!b-!*!&J[rr!!! ! 1rJ#3"BMrr`!!$RB!N!@&rrm!!!dL!*!&K[rr!!!0H!#3"BIrr`!!$H!!N!@*rrm ! !!!q!!*!%%iMrr`!!8D3!N!36LIrr!!"4h!#3""G`rrm!!&BJ!*!&J!#F)!!"*J# ! 3"B-!a3!!6Xm!N!@%!-N!!&&E!*!&K3$1!!"4HJ#3"BB"43!!9#X!N!@(!0-!!&- ! #!*!&L!$A!!"6q3#3"BN!h3!!8NJ!N!A*!1)!!%pM!*!&bJ$[!!"2c!#3"FX!q`! ! !6r)!N!A-!33!!&!B!*!&c3%+!!"31!#3"Fi"%!!!8&J!N!A2!4B!!&"i!*!&d!% ! F!!"3Q!#3"FJ")J!!8,)!N!A4!5N!!&$i!*!%!qMrr`!!!8!!N!3$kIrr!!!"a!# ! 3"!2Urrm!!!r`!*!%!q[rrb!!2AJ!N!3$l2rr)!!pr!#3"!2Srrm!!!*)!*!%!qR ! rr`!!!S`!N!3$k[rr!!!+4!#3"!2VrrmJ!$k!!*!%!qcrrb!!2X3!N!3$k2rr!!! ! #d!#3"!2Trrm!!!28!*!%!qVrr`!!#8!!N!3$krrr)!!r#!#3"!2XrrmJ!%!-!*! ! %!qMrr`!!"0J!N!3$kIrr!!!'h!#3"!2Urrm!!!U)!*!%!q[rrb!!34!!N!3$l2r ! r)!"$&!#3"BJ!53!!$PS!N!@(!&B!!!c1!*!&KJ"5!!!-kJ#3"B8!6`!!$3B!N!@ ! *!&X!!!pN!*!&JJ"T!!!-XJ#3""G`!8X!!&@D!*!%5iRrrb!!%(3$@E[%5icrr`! ! !'J!$@E[!6!N!K#!!*U)$@EZm6!`!N5!!,fJ$@EZi6)Rrrb!!BR)$@EZd6)crr`! ! !Dri$@EZ`!*F!F!3!*H)$@EZX!*J!H33!*P`$@EZS!*N"U!3!BL`$@EZN!J$rrb! ! !2%)!N!3#!rrr)!!mLJ#3"!)%rrmJ!$c5!*!%!JArrb!!1T)!N!3#"rrr)!!kfJ# ! 3"!)"rrmJ!$XL!*!%!JErrb!!1fS!N!3##2rr)!!lXJ#3"!)#rrmJ!$[k!*!'rrm ! J!$dq!*!&J2rr)!"&'!#3"B(rrb!!45-!N!@#rrmJ!%8Z!*!&Jrrr)!"&13#3"B6 ! rrb!!483!N!@!rrmJ!%92!*!&JIrr!!"&S30CZS`!J[rr!!"'+J0CZT!!!)2rr`! ! !4RB$@EU8!)6rr`!!4bB$@EUB!)$rr`!!4jd$@EUF!)Arr`!!4mX$@EUJ!)Err`! ! !9(%$@EUN!)Irr`!!8eN$@EUS!)Mrr`!!5*8$@EUX!)Rrr`!!59)$@EU`!-Vrr`! ! !5Jd$@EUd!-[rr`!!5T`$@EUi!-crr`!!5aJ$@EUm!-hrr`!!5hm$@EV!!-lrr`! ! !5qB$@EV%!-rrr`!!6%d$@EV)!-Rrr`!!6,3$@EV-!0$rr`!!65)$@EV3!-Mrr`! ! !6AF$@EV8!0(rr`!!6J`$@EVB!)!!Y43!6Qm$@EX)!)%![43!6Tm$@EYN!!(rrb! ! !8U3!N!8#rrmJ!&,6!*!&J!%f!!"5M!#3""G`!9-!!&9Q!*!&JJ'"!!"AZJ#3"BN ! "L!!!9qi!N!@)!CB!!&JL!*!&K`'F!!"B9J#3"BB"S3!!@)S!N!@&!D8!!&Lq!*! ! %&h$rr`!!9FJ!N!36L!&Y!!"A8J#3""1*!AN!!&H'!*!&J2rr!!"BmJ#3"B(rr`! ! !@5B!N!@!rrm!!&PD!*!&J[rr!!"hrJ#3"B(rr`!!L5J!N!@$rrm!!*(U!*!&K2r ! r!!#M"!#3"BArr`!!Uii!N!@'rrm!!,33!*!&Krrr!!#mUJ#3"!G0CA0cB@GP"P0 ! dBA4eF`G%G@jRC@pZ"%ePER8%9'9iG!Y%D@&REQpcG'PMF`4198a-"%jeEA!*9@j ! cD'PQG'9N"e0SD@CdC@3&H@j1BA%#H@i$H@ja"(PZBA%08feKE'`J4f9dE'PZC3C ! 3FQpYF(3)5'&MDdC[ER3+8&0)B@0V4QpZG!a38dKKBfY'Efjd)$N+8&0)B@0V4Qp ! ZG!e0DA0M,L"6G(*TEQGc#P48@5"AD@jNEhF(E@9ZG@*KFJGcG@*YC@je!dYLC!4 ! )C@a`"%PZCQm$3@0d"8eKCfPM"%*TG(--BfpZG(*[E#"VCAPc#h"eEQ0dG@&dD@p ! Z#'*bB@0VCA4c"@%J,5"Y"@iJ,5"k"8%J,5"0"8iJ,5"D"6!J,5!j"RGTHQ&bC!G ! MGA*bC@jd"%e195-18(*PCL"'D@aP)%jKE@8&4A&eDA!(BA0VEQ&YC396G'&bG!Y ! "BQpeG#pPFR*[FJG$EfjQDA*Y#d&LEh9d,f9bFQpb"d0[EQCTFQd'8(*[EA"d$90 ! YB@aX)%GPG'aTEQ8&H@j1BA%%H@jKF30jER%#H@i,6Q9h5'&MDdC[ER3-r!: --- 1,991 ---- (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)`: *** nethack-3.3.1/sys/mac/README Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/mac/README Thu Mar 21 07:37:42 2002 *************** *** 1,3 **** --- 1,14 ---- + 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 *** nethack-3.3.1/sys/msdos/Install.dos Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/Install.dos Thu Mar 21 07:37:42 2002 *************** *** 1,15 **** ! SCCS Id: @(#)Install.dos 3.3 2000/08/02 Copyright (c) NetHack PC Development Team 1990-2000. NetHack may be freely redistributed. See license for details. ============================================================== Instructions for compiling and installing ! NetHack 3.3 on a DOS system ====================================================== ! (or, How to make PC NetHack 3.3) Last revision: August 2, 2000 ! Credit for a runnable full PC NetHack 3.3 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 --- 1,15 ---- ! SCCS Id: @(#)Install.dos 3.4 2000/08/02 Copyright (c) NetHack PC Development Team 1990-2000. NetHack may be freely redistributed. See license for details. ============================================================== Instructions for compiling and installing ! NetHack 3.4 on a DOS system ====================================================== ! (or, How to make PC NetHack 3.4) Last revision: August 2, 2000 ! Credit for a runnable full PC NetHack 3.4 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 *** nethack-3.3.1/sys/msdos/Makefile.BC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/Makefile.BC Thu Mar 21 07:37:42 2002 *************** *** 1,9 **** ! # SCCS Id: @(#)Makefile.BC 3.3 1999/11/06 ! # Copyright (c) Yitzhak Sapir, 1999. # NetHack may be freely distributed. See license for details. # ! # PC NetHack 3.3 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. --- 1,9 ---- ! # SCCS Id: @(#)Makefile.BC 3.4 2002/03/17 ! # Copyright (c) Yitzhak Sapir, 1999-2002. # NetHack may be freely distributed. See license for details. # ! # PC NetHack 3.4 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. *************** *** 23,29 **** # GAME = NetHack ! GAMEDIR = c:\games\nethack # # --- 23,29 ---- # GAME = NetHack ! GAMEDIR = ..\binary # # *************** *** 764,770 **** # OBJ01 = $(O)alloc.o $(RANDOM) $(O)decl.o $(O)objects.o \ ! $(O)muse.o $(O)display.o $(O)vision.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 \ --- 764,770 ---- # 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 \ *************** *** 1823,1828 **** --- 1823,1829 ---- $(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) $(EMIN_H) $(EPRI_H) $(O)mklev.o: $(PCHO) $(SRC)\mklev.c $(HACK_H) $(O)mkmap.o: $(PCHO) $(SRC)\mkmap.c $(HACK_H) $(SP_LEV_H) *** nethack-3.3.1/sys/msdos/Makefile.GCC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/Makefile.GCC Thu Mar 21 07:37:42 2002 *************** *** 1,9 **** ! # SCCS Id: @(#)Makefile.GCC 3.3 1999/11/06 ! # Copyright (c) NetHack PC Development Team 1996. ! # PC NetHack 3.3 Makefile for djgpp V2 # # Gnu gcc compiler for msdos (djgpp) ! # Requires Gnu Make utility (V3.73 or greater) supplied with djgpp V2 # # For questions or comments: devteam@nethack.org # --- 1,9 ---- ! # SCCS Id: @(#)Makefile.GCC 3.4 2002/03/17 ! # Copyright (c) NetHack PC Development Team 1996-2002. ! # PC NetHack 3.4 Makefile for djgpp V2 # # Gnu gcc compiler for msdos (djgpp) ! # Requires Gnu Make utility (V3.79 or greater) supplied with djgpp # # For questions or comments: devteam@nethack.org # *************** *** 23,29 **** GAME = nethack # The GNU Make has a problem if you include a drive spec below (unfortunately). ! GAMEDIR = \games\nethackd # # Directories, gcc likes unix style directory specs --- 23,29 ---- GAME = nethack # The GNU Make has a problem if you include a drive spec below (unfortunately). ! GAMEDIR =..\binary # # Directories, gcc likes unix style directory specs *************** *** 225,231 **** 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 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 --- 225,231 ---- 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 *************** *** 1069,1074 **** --- 1069,1075 ---- mail.o: $(HACK_H) $(INCL)\mail.h makemon.o: $(HACK_H) $(EPRI_H) $(EMIN_H) $(INCL)\edog.h mcastu.o: $(HACK_H) + mapglyph.o: $(HACK_H) mhitm.o: $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h mhitu.o: $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h minion.o: $(HACK_H) $(EMIN_H) $(EPRI_H) *** nethack-3.3.1/sys/msdos/Makefile.MSC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/Makefile.MSC Thu Mar 21 07:37:42 2002 *************** *** 1,6 **** ! # SCCS Id: @(#)Makefile.MSC 3.3 2000/08/02 ! # Copyright (c) NetHack PC Development Team 1997, 2000. ! # PC NetHack 3.3 Makefile for MSC # # For questions or comments: nethack-bugs@nethack.org # --- 1,6 ---- ! # SCCS Id: @(#)Makefile.MSC 3.4 2002/03/17 ! # Copyright (c) NetHack PC Development Team 1997 - 2002. ! # PC NetHack 3.4 Makefile for MSC # # For questions or comments: nethack-bugs@nethack.org # *************** *** 17,23 **** # NOTE: Make sure GAMEDIR exists before make is started. GAME = nethack ! GAMEDIR = \games\nethack # # Directories --- 17,23 ---- # NOTE: Make sure GAMEDIR exists before make is started. GAME = nethack ! GAMEDIR =..\binary # # Directories *************** *** 64,70 **** # # 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.3.1 #NEWALT=/DNEW_ALT ############################################################################# --- 64,70 ---- # # 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.0 #NEWALT=/DNEW_ALT ############################################################################# *************** *** 205,211 **** 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 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 --- 205,211 ---- 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 *************** *** 471,477 **** $(GAMEFILE) : $(LNKOPT) $(ALLOBJ) @echo Linking.... ! $(LINK) $(LFLAGS) /SE:1000 /DYNAMIC:2120 /NOE /ST:6000 @<<$(GAME).lnk $(ALLOBJ:^ =+^ ) $(GAMEFILE) --- 471,477 ---- $(GAMEFILE) : $(LNKOPT) $(ALLOBJ) @echo Linking.... ! $(LINK) $(LFLAGS) /SE:1000 /DYNAMIC:2135 /NOE /ST:6000 @<<$(GAME).lnk $(ALLOBJ:^ =+^ ) $(GAMEFILE) *************** *** 1035,1040 **** --- 1035,1041 ---- mail.o: mail.c $(HACK_H) $(INCL)\mail.h makemon.o: makemon.c $(HACK_H) $(INCL)\epri.h $(INCL)\emin.h \ $(INCL)\edog.h + mapglyph.o: mapglyph.c $(HACK_H) mcastu.o: mcastu.c $(HACK_H) mhitm.o: mhitm.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h mhitu.o: mhitu.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h *** nethack-3.3.1/sys/msdos/Makefile.SC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/Makefile.SC Thu Mar 21 07:37:42 2002 *************** *** 1,10 **** ! # SCCS Id : @(#)Makefile.SC 3.3 96/10/14 # Copyright (c) NetHack Development Team 1996. # # Symantec C compiler V7.2 # Written for Symantec SMAKE utility # ! # NOTE: This Makefile has not been tested for NetHack 3.3.0 # # For questions or comments : nethack-bugs@linc.cis.upenn.edu # --- 1,10 ---- ! # SCCS Id : @(#)Makefile.SC 3.4 1996/10/14 # Copyright (c) NetHack Development Team 1996. # # Symantec C compiler V7.2 # Written for Symantec SMAKE utility # ! # NOTE: This Makefile has not been tested for NetHack 3.4.0 # # For questions or comments : nethack-bugs@linc.cis.upenn.edu # *** nethack-3.3.1/sys/msdos/msdos.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/msdos.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)msdos.c 3.3 2000/07/30 */ /* Copyright (c) NetHack PC Development Team 1990, 1991, 1992, 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)msdos.c 3.4 2000/07/30 */ /* Copyright (c) NetHack PC Development Team 1990, 1991, 1992, 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 43,49 **** */ #define READCHAR 0x00 /* Read Character from Keyboard */ #define GETKEYFLAGS 0x02 /* Get Keyboard Flags */ ! /*#define KEY_DEBUG /* print values of unexpected key codes - devel*/ void FDECL(get_cursor,(int *, int *)); --- 43,49 ---- */ #define READCHAR 0x00 /* Read Character from Keyboard */ #define GETKEYFLAGS 0x02 /* Get Keyboard Flags */ ! /*#define KEY_DEBUG */ /* print values of unexpected key codes - devel*/ void FDECL(get_cursor,(int *, int *)); *************** *** 53,59 **** --- 53,61 ---- static char NDECL(DOSgetch); static char NDECL(BIOSgetch); + #ifndef __GO32__ static char * NDECL(getdta); + #endif static unsigned int FDECL(dos_ioctl, (int,int,unsigned)); #ifdef USE_TILES extern boolean FDECL(pckeys,(unsigned char, unsigned char)); /* pckeys.c */ *** nethack-3.3.1/sys/msdos/msdoshlp.txt Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/msdoshlp.txt Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! MSDOS specific help file for NetHack 3.3.0 (Last Revision: December 4, 1999) Copyright (c) NetHack PC Development Team 1993-1999. --- 1,4 ---- ! MSDOS specific help file for NetHack 3.4.0 (Last Revision: December 4, 1999) Copyright (c) NetHack PC Development Team 1993-1999. *** nethack-3.3.1/sys/msdos/NHAccess.nh Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/NHAccess.nh Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! # SCSS Id: @(#)NHAccess.nh 3.3 1999/11/28 # Copyright (c) NetHack PC Development Team 1993, 1996, 1999 # NetHack may be freely redistributed. See license for details. # --- 1,4 ---- ! # SCSS Id: @(#)NHAccess.nh 3.4 1999/11/28 # Copyright (c) NetHack PC Development Team 1993, 1996, 1999 # NetHack may be freely redistributed. See license for details. # *** nethack-3.3.1/sys/msdos/ovlinit.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/ovlinit.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)ovlinit.c 3.3 94/03/20 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)ovlinit.c 3.4 1994/03/20 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/msdos/pckeys.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/pckeys.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pckeys.c 3.3 96/05/11 */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pckeys.c 3.4 1996/05/11 */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/msdos/pctiles.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/pctiles.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pctiles.c 3.3 95/07/31 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)pctiles.c 3.4 1995/07/31 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *************** *** 90,96 **** char *tilefilename; boolean filestyle; { - FILE *x; #ifdef TILES_IN_RAM int k; #endif --- 90,95 ---- *** nethack-3.3.1/sys/msdos/pctiles.h Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/pctiles.h Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pctiles.h 3.3 94/04/04 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)pctiles.h 3.4 1994/04/04 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *** nethack-3.3.1/sys/msdos/pcvideo.h Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/pcvideo.h Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pcvideo.h 3.3 94/06/07 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)pcvideo.h 3.4 1994/06/07 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *************** *** 269,275 **** E void FDECL(vga_WriteStr, (char *, int, int, 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)); E void FDECL(vga_userpan, (BOOLEAN_P)); E void FDECL(vga_overview, (BOOLEAN_P)); E void FDECL(vga_traditional, (BOOLEAN_P)); --- 269,275 ---- E void FDECL(vga_WriteStr, (char *, int, int, 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)); *** nethack-3.3.1/sys/msdos/portio.h Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/portio.h Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)portio.h 3.3 95/08/05 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)portio.h 3.4 1995/08/05 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *** nethack-3.3.1/sys/msdos/schema1.BC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/schema1.BC Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)schema1.BC 3.3 99/10/28 */ /* Copyright (c) Yitzhak Sapir, 1999 */ /* */ /* NetHack Overlay Schema */ --- 1,4 ---- ! /* SCCS Id: @(#)schema1.BC 3.4 1999/10/28 */ /* Copyright (c) Yitzhak Sapir, 1999 */ /* */ /* NetHack Overlay Schema */ *** nethack-3.3.1/sys/msdos/schema2.BC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/schema2.BC Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)schema2.BC 3.3 99/10/28 */ /* Copyright (c) Yitzhak Sapir, 1999 */ /* */ /* NetHack Overlay Schema */ --- 1,4 ---- ! /* SCCS Id: @(#)schema2.BC 3.4 1999/10/28 */ /* Copyright (c) Yitzhak Sapir, 1999 */ /* */ /* NetHack Overlay Schema */ *** nethack-3.3.1/sys/msdos/schema3.MSC Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/schema3.MSC Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! ; SCCS Id: @(#)schema3.MSC 3.3 2000/07/31 ; Copyright (c) NetHack PC Development Team, 2000 ; ; NetHack Overlay Schema --- 1,4 ---- ! ; SCCS Id: @(#)schema3.MSC 3.4 2000/07/31 ; Copyright (c) NetHack PC Development Team, 2000 ; ; NetHack Overlay Schema *************** *** 19,37 **** 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:1 _display_artifact_score _display_warning _dlb_fgetc _doattributes _dochug _dochugw ! functions:1 _fill_point _fill_room _fill_zoo _fillholetyp _find_ac _find_branch _find_branch_room _find_defensive ; functions:2 _do_vicinity_map functions:3 _pcmain ; 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 --- 19,38 ---- 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 *************** *** 82,88 **** 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 _doconfuse _doconsult _docorner _docrt _doddoremarm _doddrop _dodip ! ;functions:61 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 --- 83,89 ---- 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 _doconfuse _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 *************** *** 106,112 **** 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 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 --- 107,113 ---- 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 *************** *** 116,122 **** 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 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 --- 117,124 ---- 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_artifact_score _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 *************** *** 143,149 **** 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 _leaderless _learn _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 --- 145,151 ---- 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 _leaderless _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 *************** *** 225,231 **** 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 _self_pronoun _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 --- 227,233 ---- 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 *************** *** 417,425 **** 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 functions:385 _doname _Doname2 ! functions:386 _minwater functions:387 _missmm functions:388 _missmu functions:389 _missum --- 419,427 ---- 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 *** nethack-3.3.1/sys/msdos/setup.bat Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/setup.bat Thu Mar 21 07:37:42 2002 *************** *** 1,10 **** @echo off ! REM SCCS Id: @(#)setup.bat 97/09/28 ! REM Copyright (c) NetHack PC Development Team 1990 - 1997 REM NetHack may be freely redistributed. See license for details. echo. ! echo Copyright (c) NetHack PC Development Team 1990 - 1997 echo NetHack may be freely redistributed. See license for details. echo. REM setup batch file for msdos, see Install.dos for details. --- 1,10 ---- @echo off ! REM SCCS Id: @(#)setup.bat 2002/03/17 ! REM Copyright (c) NetHack PC Development Team 1990 - 2002 REM NetHack may be freely redistributed. See license for details. echo. ! echo Copyright (c) NetHack PC Development Team 1990 - 2002 echo NetHack may be freely redistributed. See license for details. echo. REM setup batch file for msdos, see Install.dos for details. *************** *** 21,26 **** --- 21,29 ---- if not exist ..\..\win\tty\wintty.c goto err_dir if not exist ..\share\lev_yacc.c goto err_dir echo Directories OK. + + if not exist ..\..\binary\* mkdir ..\..\binary + if NOT exist ..\..\binary\license copy ..\..\dat\license ..\..\binary\license >nul if exist ..\..\dat\data.bas goto long1ok if exist ..\..\dat\data.base goto long1a *** nethack-3.3.1/sys/msdos/sound.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/sound.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)sound.c 3.3 96/02/19 */ /* Copyright (c) NetHack PC Development Team 1993,1995 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)sound.c 3.4 1996/02/19 */ /* Copyright (c) NetHack PC Development Team 1993,1995 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *** nethack-3.3.1/sys/msdos/tile2bin.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/tile2bin.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tile2bin.c 3.3 95/01/26 */ /* Copyright (c) NetHack PC Development Team 1993, 1994, 1995 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)tile2bin.c 3.4 1995/01/26 */ /* Copyright (c) NetHack PC Development Team 1993, 1994, 1995 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 169,175 **** # endif strncpy(tibheader.ident, ! "NetHack 3.3 MSDOS Port binary tile file", 80); strncpy(tibheader.timestamp, asctime(newtime), 24); tibheader.timestamp[25] = '\0'; tibheader.tilecount = tilecount; --- 169,175 ---- # endif strncpy(tibheader.ident, ! "NetHack 3.4 MSDOS Port binary tile file", 80); strncpy(tibheader.timestamp, asctime(newtime), 24); tibheader.timestamp[25] = '\0'; tibheader.tilecount = tilecount; *** nethack-3.3.1/sys/msdos/video.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/video.c Thu Mar 21 07:37:42 2002 *************** *** 1,15 **** ! /* SCCS Id: @(#)video.c 3.3 95/08/05 */ ! /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* */ /* * video.c - Hardware video support front-ends * *Edit History: ! * Initial Creation M. Allison 93/04/04 ! * Add djgpp support K. Smolkowski 93/04/26 ! * Add txt/graphics mode support M. Allison 93/10/30 ! * Add graphics mode cursor sim. M. Allison 94/02/19 */ #include "hack.h" --- 1,16 ---- ! /* SCCS Id: @(#)video.c 3.4 2001/04/07 */ ! /* 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 ! * 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" *************** *** 585,599 **** } void ! xputg(glyphnum,ch) /* write out a glyph picture at current location */ int glyphnum; int ch; { if (!iflags.grmode || !iflags.tile_view) { xputc((char)ch); # ifdef SCREEN_VGA } else { ! vga_xputg(glyphnum, ch); # endif } } --- 586,601 ---- } void ! xputg(glyphnum,ch,special) /* write out a glyph picture at current location */ int glyphnum; int ch; + unsigned special; { if (!iflags.grmode || !iflags.tile_view) { xputc((char)ch); # ifdef SCREEN_VGA } else { ! vga_xputg(glyphnum, ch, special); # endif } } *************** *** 748,754 **** { char choices[120]; char *cptr, *cvalue[3]; ! int i,icolor; strcpy(choices,choiceptr); cvalue[0] = choices; --- 750,756 ---- { char choices[120]; char *cptr, *cvalue[3]; ! int i,icolor = CLR_WHITE; strcpy(choices,choiceptr); cvalue[0] = choices; *************** *** 895,906 **** * getch(); */ iflags.grmode = 0; - iflags.hasvesa = 0; iflags.hasvga = 0; - iflags.has8514 = 0; - iflags.usevesa = 0; iflags.usevga = 0; - iflags.use8514 = 0; if (strncmpi(sopt,"def",3) == 0) { /* default */ /* do nothing - default */ --- 897,904 ---- *************** *** 937,947 **** # endif /* * Auto-detect Priorities (arbitrary for now): ! * VESA, 8514, VGA */ ! if (iflags.hasvesa) iflags.usevesa = 1; ! else if (iflags.has8514) iflags.use8514 = 1; ! else if (iflags.hasvga) { iflags.usevga = 1; /* VGA depends on BIOS to enable function keys*/ iflags.BIOS = 1; --- 935,943 ---- # endif /* * Auto-detect Priorities (arbitrary for now): ! * VGA */ ! if (iflags.hasvga) { iflags.usevga = 1; /* VGA depends on BIOS to enable function keys*/ iflags.BIOS = 1; *** nethack-3.3.1/sys/msdos/vidtxt.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/vidtxt.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vidtxt.c 3.3 94/04/04 */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)vidtxt.c 3.4 1994/04/04 */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *************** *** 31,39 **** # endif #endif ! /* void FDECL(txt_xputc,(char, int)); /* write out character (and attribute) */ - STATIC_VAR char buf[BUFSZ]; 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 */ --- 31,38 ---- # endif #endif ! /* void FDECL(txt_xputc,(char, int)); */ /* write out character (and attribute) */ 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 */ *** nethack-3.3.1/sys/msdos/vidvga.c Thu Feb 14 07:59:33 2002 --- nethack-3.4.0/sys/msdos/vidvga.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vidvga.c 3.3 96/02/16 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* --- 1,4 ---- ! /* SCCS Id: @(#)vidvga.c 3.4 1996/02/16 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* *************** *** 108,114 **** # include # endif ! /* 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 --- 108,114 ---- # include # endif ! /* 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 *************** *** 116,121 **** --- 116,122 ---- #endif STATIC_DCL void FDECL(vga_redrawmap,(BOOLEAN_P)); void FDECL(vga_cliparound,(int, int)); + STATIC_OVL void FDECL(decal_planar,(struct planar_cell_struct *, unsigned)); #ifdef POSITIONBAR STATIC_DCL void NDECL(positionbar); *************** *** 139,161 **** STATIC_VAR unsigned char __far *font; STATIC_VAR char *screentable[SCREENHEIGHT]; ! STATIC_VAR char tmp[SCREENWIDTH]; STATIC_VAR char *paletteptr; STATIC_VAR struct map_struct { int glyph; int ch; int attr; } 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;} } # define TOP_MAP_ROW 1 # if defined(OVLB) STATIC_VAR int vgacmap[CLR_MAX] = {0,3,5,9,4,8,12,14,11,2,6,7,1,8,12,13}; 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_VAR char defpalette[] = { /* Default VGA palette */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, --- 140,164 ---- STATIC_VAR unsigned char __far *font; STATIC_VAR char *screentable[SCREENHEIGHT]; ! STATIC_VAR char *paletteptr; STATIC_VAR struct map_struct { int glyph; int ch; int attr; + unsigned special; } 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;} } # define TOP_MAP_ROW 1 # if defined(OVLB) STATIC_VAR int vgacmap[CLR_MAX] = {0,3,5,9,4,8,12,14,11,2,6,7,1,8,12,13}; 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}; */ ! #if 0 STATIC_VAR char defpalette[] = { /* Default VGA palette */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, *************** *** 174,179 **** --- 177,184 ---- 0xff, 0x00, 0xff, 0xff, 0xff, 0xff }; + #endif + # ifndef ALTERNATE_VIDEO_METHOD int vp[SCREENPLANES] = {8,4,2,1}; # endif *************** *** 195,204 **** # if defined(USE_TILES) STATIC_VAR struct tibhdr_struct tibheader; ! /* extern FILE *tilefile; /* Not needed in here most likely */ # endif ! /* STATIC_VAR int g_attribute; /* Current attribute to use */ #ifdef OVLB void --- 200,209 ---- # if defined(USE_TILES) STATIC_VAR struct tibhdr_struct tibheader; ! /* extern FILE *tilefile; */ /* Not needed in here most likely */ # endif ! /* STATIC_VAR int g_attribute; */ /* Current attribute to use */ #ifdef OVLB void *************** *** 378,406 **** # if defined(USE_TILES) void ! vga_xputg(glyphnum,ch) /* Place tile represent. a glyph at current location */ int glyphnum; int ch; { int col,row; int attr; row = currow; col = curcol; if ((col < 0 || col >= COLNO) || (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW))) return; ! map[row - TOP_MAP_ROW][col].glyph = glyphnum; ! map[row - TOP_MAP_ROW][col].ch = ch; attr = (g_attribute == 0) ? attrib_gr_normal : g_attribute; ! map[row - TOP_MAP_ROW][col].attr = attr; if (iflags.traditional_view) { vga_WriteChar((unsigned char)ch,col,row,attr); } else if (!iflags.over_view) { if ((col >= clipx) && (col <= clipxmax)) { ! if (!ReadPlanarTileFile(glyph2tile[glyphnum], &planecell)) vga_DisplayCell(planecell, col - clipx, row); ! else pline("vga_xputg: Error reading tile (%d,%d) from file", glyphnum,glyph2tile[glyphnum]); } --- 383,416 ---- # if defined(USE_TILES) 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 */ { int col,row; int attr; + int ry; row = currow; col = curcol; if ((col < 0 || col >= COLNO) || (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW))) return; ! ry = row - TOP_MAP_ROW; ! 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].attr = attr; if (iflags.traditional_view) { vga_WriteChar((unsigned char)ch,col,row,attr); } else if (!iflags.over_view) { if ((col >= clipx) && (col <= clipxmax)) { ! if (!ReadPlanarTileFile(glyph2tile[glyphnum], &planecell)) { ! if (map[ry][col].special) decal_planar(planecell, special); vga_DisplayCell(planecell, col - clipx, row); ! } else pline("vga_xputg: Error reading tile (%d,%d) from file", glyphnum,glyph2tile[glyphnum]); } *************** *** 469,475 **** int j,x,y,t; char __far *pch; char volatile a; ! if (clearfirst) { /* y here is in pixel rows */ outportb(0x3ce,5); --- 479,485 ---- int j,x,y,t; char __far *pch; char volatile a; ! if (clearfirst) { /* y here is in pixel rows */ outportb(0x3ce,5); *************** *** 508,513 **** --- 518,525 ---- if (!iflags.over_view) { if (!ReadPlanarTileFile(glyph2tile[t], &planecell)) { + if (map[y][x].special) + decal_planar(planecell, map[y][x].special); vga_DisplayCell(planecell, x - clipx, y + TOP_MAP_ROW); } else *************** *** 648,654 **** for (y = 0; y < ROWNO; ++y) { for (x = i; x < j; x += 2) { t = map[y][x].glyph; ! if (!ReadPlanarTileFile(glyph2tile[t], &planecell)) vga_DisplayCell(planecell, x - clipx, y + TOP_MAP_ROW); else pline("vga_shiftmap: Error reading tile (%d,%d)", --- 660,667 ---- for (y = 0; y < ROWNO; ++y) { for (x = i; x < j; x += 2) { t = map[y][x].glyph; ! if (!ReadPlanarTileFile(glyph2tile[t], &planecell)) ! if (map[y][x].special) decal_planar(planecell, map[y][x].special); vga_DisplayCell(planecell, x - clipx, y + TOP_MAP_ROW); else pline("vga_shiftmap: Error reading tile (%d,%d)", *************** *** 660,665 **** --- 673,690 ---- # endif /* OVL2 */ # ifdef OVLB + STATIC_OVL void + decal_planar(gp, special) + struct planar_cell_struct *gp; + unsigned special; + { + if (special & MG_CORPSE) { + } else if (special & MG_INVIS) { + } else if (special & MG_DETECT) { + } else if (special & MG_PET) { + } else if (special & MG_RIDDEN) { + } + } /* * Open tile files, *************** *** 670,676 **** */ void vga_Init(void) { ! int i, c; # ifdef USE_TILES int tilefailure = 0; --- 695,701 ---- */ void vga_Init(void) { ! int i; # ifdef USE_TILES int tilefailure = 0; *************** *** 692,698 **** iflags.over_view = FALSE; CO = 80; LI = 25; ! /* clear_screen() /* not vga_clear_screen() */ return; } # endif --- 717,723 ---- iflags.over_view = FALSE; CO = 80; LI = 25; ! /* clear_screen() */ /* not vga_clear_screen() */ return; } # endif *************** *** 704,710 **** } vga_SwitchMode(MODE640x480); windowprocs.win_cliparound = vga_cliparound; ! /* vga_NoBorder(BACKGROUND_VGA_COLOR); /* Not needed after palette mod */ # ifdef USE_TILES paletteptr = tibheader.palette; iflags.tile_view = TRUE; --- 729,735 ---- } vga_SwitchMode(MODE640x480); windowprocs.win_cliparound = vga_cliparound; ! /* vga_NoBorder(BACKGROUND_VGA_COLOR); */ /* Not needed after palette mod */ # ifdef USE_TILES paletteptr = tibheader.palette; iflags.tile_view = TRUE; *************** *** 854,860 **** { int i; int x,pixy; ! int floc; char volatile tc; char __far *cp; unsigned char __far *fp = font; --- 879,885 ---- { int i; int x,pixy; ! char volatile tc; char __far *cp; unsigned char __far *fp = font; *************** *** 864,870 **** 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 */ outportb(0x3ce,5); outportb(0x3cf,2); --- 889,895 ---- 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 */ outportb(0x3ce,5); outportb(0x3cf,2); *************** *** 1013,1019 **** } } ! /*static unsigned char colorbits[]={0x01,0x02,0x04,0x08}; /* wrong */ static unsigned char colorbits[]={0x08,0x04,0x02,0x01}; #ifdef POSITIONBAR --- 1038,1044 ---- } } ! /*static unsigned char colorbits[]={0x01,0x02,0x04,0x08}; */ /* wrong */ static unsigned char colorbits[]={0x08,0x04,0x02,0x01}; #ifdef POSITIONBAR *************** *** 1042,1048 **** int feature, ucol; int k, y, colour, row; char __far *pch; ! char bitblock; int startk, stopk; char volatile a; boolean nowhere = FALSE; --- 1067,1073 ---- int feature, ucol; int k, y, colour, row; char __far *pch; ! int startk, stopk; char volatile a; boolean nowhere = FALSE; *************** *** 1138,1144 **** vga_special(chr,col,color) int chr,col,color; { ! int i,y,pixx,pixy; char __far *tmp_d; /* destination pointer */ int vplane; char fnt; --- 1163,1169 ---- vga_special(chr,col,color) int chr,col,color; { ! int i,y,pixy; char __far *tmp_d; /* destination pointer */ int vplane; char fnt; *** nethack-3.3.1/sys/os2/Install.os2 Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/os2/Install.os2 Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! Instructions for compiling and installing NetHack 3.3 on an OS/2 system ===================================================== Timo Hakulinen --- 1,4 ---- ! Instructions for compiling and installing NetHack 3.4 on an OS/2 system ===================================================== Timo Hakulinen *************** *** 51,57 **** 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.3 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 --- 51,57 ---- 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.4 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 *************** *** 171,177 **** 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.3. 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: --- 171,177 ---- 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: *************** *** 181,187 **** 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.3, 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 --- 181,187 ---- 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 *************** *** 199,205 **** 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.3 Path and file name: c:\games\nh33\nethack.cmd Parameters: Working directory: c:\games\nh33 --- 199,205 ---- 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 *************** *** 226,232 **** ----- 1) Save-files and bones-files from previous versions will not work with ! NetHack 3.3. 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 --- 226,232 ---- ----- 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 *** nethack-3.3.1/sys/os2/Makefile.os2 Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/os2/Makefile.os2 Thu Mar 21 07:37:42 2002 *************** *** 1,12 **** ! # SCCS Id: @(#)Makefile.os2 3.3 96/10/29 ! # OS/2 NetHack 3.3 Makefile for OS/2 versions 1.x and 2.x # Copyright (C) 1990, 1991, 1992, 1993, 1996 Timo Hakulinen # ! # The supported compilers list is mainly from the NetHack 3.1 era. ! # There should be newer versions of all these compilers nowadays. # ! # Supported compilers: Microsoft C 5.1 and 6.0A, GCC emx 0.8f, ! # GCC emx 0.9c, IBM C Set/2 1.00 with Toolkit/2 2.00, IBM CSet++ 2.01. # # NDMAKE ver 4.5, Microsoft/IBM NMAKE, or Dennis Vadura's DMAKE is # required; old MS-MAKE will not work. To enable the appropriate --- 1,12 ---- ! # SCCS Id: @(#)Makefile.os2 3.4 1996/10/29 ! # OS/2 NetHack 3.4 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 ! # and the support is left here for historic purposes. # ! # Supported compilers: GCC emx 0.9g # # NDMAKE ver 4.5, Microsoft/IBM NMAKE, or Dennis Vadura's DMAKE is # required; old MS-MAKE will not work. To enable the appropriate *************** *** 25,42 **** # $(SRC). If required, termcap library can be built from termcap # sources using makefile.lib in "sys\share" directory. # - # "MSC" in this makefile refers to Microsoft C 5.1 and 6.0A. - # Whenever the distinction is significant, it is indicated. - # # "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 (rrt0136@ibm.net) and Stefan Neis (neis@cs.uni-sb.de). ! # ! # "CSet/2" refers to both older CSet/2 ver 1 (IBM 32 bit C compiler for ! # OS/2 2.0) and newer CSet++ ver 2 (C/C++ compiler). Original CSet/2 ! # support courtesy Jeff Urlwin (jurlwin@gandalf.umcs.maine.edu). ! # CSet++ support courtesy Helge Hafting (hhafting@intermec.no) and ! # Justin Frank (belford-manor@worldnet.att.net). # # "OMF" is short for "Object Module Format" and refers to the # standard OS/2 object format, which e.g. link386 uses. MSC and --- 25,33 ---- # $(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 *************** *** 57,68 **** # Compiler and linker selection. # - #CC = cl # MSC CC = gcc # GCC - #CC = icc # CSet/2 ! #LINK = link # MSC ! LINK = link386 # GCC OMF, CSet/2 # # Make syntax peculiarities. --- 48,88 ---- # Compiler and linker selection. # CC = gcc # GCC ! LINK = gcc ! #LINK = link386 # GCC OMF, CSet/2 ! ! # ! # Uncomment the following to compile for X11 and set X11ROOT apropriately ! # ! #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 ! ! ! # # Make syntax peculiarities. *************** *** 148,154 **** # Source tree base directory. # ! NHSRC = \nethack\3.3.1\uunet # # Source directories. Makedefs hardcodes these, don't change them. --- 168,174 ---- # Source tree base directory. # ! NHSRC = \nethack # # Source directories. Makedefs hardcodes these, don't change them. *************** *** 160,167 **** --- 180,189 ---- 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 *************** *** 175,227 **** OBJ = \tmp\obj # Object files TEMP = \tmp\bin # Temporary files during make process ! GAMEDIR = \games\nh331 # Game directory PLIBP = c:\emx\lib # Protected mode C libraries RLIBP = c:\emx\lib # Possible real mode C libraries - TLIBP = \toolkt20\os2lib # CSet/2 Toolkit libpath (OS2386.LIB) - # # The game name and description. # GAME = nethack ! GAMEDES = "NetHack 3.3.1" ! ! # ! # Only if you're using CSet/2. Define the upper line for ver. 1, ! # the lower one for ver. 2 (= CSet++). ! # ! ! #CSETVER = /DOS2_CSET2_VER_1 ! CSETVER = /DOS2_CSET2_VER_2 # # The uppermost two lines for MSC, the middle two for GCC, and # the lowermost two for CSet/2. # - # MSC: compile only, compiler id, large memory model, optimization level, - # remove stack probes, 80286 instruction set, dedicated datasegment for - # items >= 10 bytes, pack structures on 1 byte boundaries, generate code - # for 8087 coprocessor, compiler warning level, include file path, invoke - # large model compiler, debug flags, ANSI conformance. - # # GCC: compile only, compiler id, object format selection, warnings, # include file path, debug flags, ANSI conformance. # - # CSet/2: compile only, compiler id, migration lib, remove stack probes, - # large 32 bit memory model, fast integer code, optimize (to avoid a - # compiler bug - sometimes it *does* work that way around), don't print - # IBM logo, force optlink linkage on function calls, warning level, - # include file path, debug flags, ANSI conformance. - # ! #CFLAGS = /c /DOS2_MSC /AL /O /Gs /G2 /Gt10 /Zp1 /FPi $(WARN) /I$(INCL) $(BIGC) $(CDFLAGS) $(STDC) ! #O = /Fo ! CFLAGS = -c -DOS2_GCC $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) O = -s -O -o - #CFLAGS = /c /DOS2_CSET2 $(CSETVER) /Sm /Gs+ /Gt- /Gi+ /O+ /Q+ /Mp $(WARN) /I$(INCL) $(CDFLAGS) $(STDC) - #O = /Fo # # Compiler warning levels. These are really for development, so --- 197,223 ---- OBJ = \tmp\obj # Object files TEMP = \tmp\bin # Temporary files during make process ! GAMEDIR = \games\nh34 # 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.4" # # 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) O = -s -O -o # # Compiler warning levels. These are really for development, so *************** *** 229,257 **** # from masses of benign warnings. If any problems arise, however, # they may help in finding the trouble. # - # MSC: warning level 3 is highest in 5.1, second highest in 6.0. - # Cries a lot, but for no real cause. Warning level 0 for distribution. - # # 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. # - # CSet/2: warning level 3. The second optional parameter gives - # lots of extra warnings. - # - #WARN = /W0 #/W3 # MSC WARN = #-W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN # GCC - #WARN = #/W3 #/Kbper # CSet/2 # # GCC object format selection. The upper line for standard OS/2 OMF # object format, the lower for Unix style a.out format. # ! GCCO = -Zomf -Zsys # GCC OMF ! #GCCO = # GCC a.out # # MSC 5.1 needs the large model first pass of the compiler. --- 225,245 ---- # 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. # ! #GCCO = -Zomf -Zsys # GCC OMF ! GCCO = # GCC a.out # # MSC 5.1 needs the large model first pass of the compiler. *************** *** 259,265 **** # BIGC = - #BIGC = /B1 d:\binb\c1l.exe # MSC 5.1 # # Unset CL to avoid troubles with conflicting switches in MSC 6.0. --- 247,252 ---- *************** *** 268,322 **** CL = # - # MSC, CSet/2: don't ignore case in symbols, no default lib search, - # stack 8KB, allow max 1024 segments in program. - # - # GCC: likes a big stack. - # - # CSet/2: give it a bit more stack since we can. - # - - #LFLAGS = /noig /nod /stack:8192 /seg:1024 $(LDFLAGS) # MSC - LFLAGS = /noig /stack:40000 # GCC OMF - #LFLAGS = /noig /nod /stack:32768 /seg:1024 $(LDFLAGS) # CSet/2 - - # # Prepare for a debugger. # CDFLAGS = LDFLAGS = ! #CDFLAGS = /Zi # CodeView (MSC) ! #LDFLAGS = /CO # - " - ! #CDFLAGS = -g # GDB (GCC a.out) ! #LDFLAGS = -g # - " - ! #CDFLAGS = /Ti+ # IPMD (CSet/2) ! #LDFLAGS = /CO # - " - # # How to produce the most ANSI-like environment. # - #STDC = # MSC 5.1 - STDC = /D__STDC__ # MSC 6.0, CSet/2 STDC = -ansi # GCC # # Possible system object files required during linking. # ! #SYSOBJ = # MSC, GCC a.out, CSet/2 ! SYSOBJ = $(PLIBP)\crt0.obj $(PLIBP)\end.lib# GCC OMF # # Compiler library selection. Change if necessary. # - # MSC: Protected mode C libraries for 8087 emulator, - # OS/2 API entry points. - # - # GCC emx 0.8 OMF: C standard lib, extra GCC lib, static system lib, - # OS/2 API entry points. - # # 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. --- 255,284 ---- CL = # # Prepare for a debugger. # CDFLAGS = LDFLAGS = ! CDFLAGS = -g # GDB (GCC a.out) ! LDFLAGS = -g # - " - # # How to produce the most ANSI-like environment. # STDC = -ansi # GCC # # Possible system object files required during linking. # ! SYSOBJ = # MSC, GCC a.out, CSet/2 ! #SYSOBJ = $(PLIBP)\crt0.obj $(PLIBP)\end.lib# GCC OMF # # 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. *************** *** 324,340 **** # GCC a.out: extra GCC lib, C standard lib, extra GCC lib (again), # OS/2 API entry points. # - # CSet/2: C standard libraries, OS/2 API entry points. - # Note that ver 1 needs lib dde4sbm.lib whereas ver 2 doesn't. - # ! #PLIBS = $(PLIBP)\llibcep $(PLIBP)\doscalls # MSC 5.1 ! #PLIBS = $(PLIBP)\llibcep $(PLIBP)\os2 # MSC 6.0 ! #PLIBS = $(PLIBP)\libc $(PLIBP)\libgcc $(PLIBP)\libsys $(PLIBP)\libos2 # GCC emx 0.8 OMF ! PLIBS = $(PLIBP)\st\c $(PLIBP)\st\c_app $(PLIBP)\c_alias $(PLIBP)\gcc $(PLIBP)\st\sys $(PLIBP)\os2 # GCC emx 0.9 OMF ! #PLIBS = -lgcc -lc -lgcc -los2 # GCC a.out (defining -lgcc twice is required) ! #PLIBS = $(PLIBP)\dde4sbs.lib $(PLIBP)\dde4sbm.lib $(TLIBP)\os2386.lib # CSet/2 ver 1 ! #PLIBS = $(PLIBP)\dde4sbs.lib $(TLIBP)\os2386.lib # CSet++ ver 2 # # C libraries used by makedefs, lev_comp and dgn_comp (change if --- 286,294 ---- # GCC a.out: extra GCC lib, C standard lib, extra GCC lib (again), # OS/2 API entry points. # ! #PLIBS = $(PLIBP)\st\c $(PLIBP)\st\c_app $(PLIBP)\c_alias $(PLIBP)\gcc $(PLIBP)\st\sys $(PLIBP)\os2 # GCC emx 0.9 OMF ! PLIBS = -lgcc -lc -lgcc -los2 $(X11LIBS) # GCC a.out # # C libraries used by makedefs, lev_comp and dgn_comp (change if *************** *** 346,362 **** #RLIBS = $(RLIBP)\llibcer RLIBS = $(PLIBS) - # - # Default compilation skeletons. The uppermost six are for - # MSC and CSet/2 and the lowermost six for GCC. - # - - #SRCCC = $(CC) $(CFLAGS) $(O)$@ $(SRC)\$(AB) - #UTILCC = $(CC) $(CFLAGS) $(O)$@ $(UTIL)\$(AB) - #SYSCC = $(CC) $(CFLAGS) $(O)$@ $(SYS)\$(AB) - #SSYSCC = $(CC) $(CFLAGS) $(O)$@ $(SSYS)\$(AB) - #PSYSCC = $(CC) $(CFLAGS) $(O)$@ $(SSYS)\pc$(AB) - #WINCC = $(CC) $(CFLAGS) $(O)$@ $(WIN)\$(AB) SRCCC = $(CC) $(CFLAGS) $(O) $@ $(AB) UTILCC = $(B) cd $(UTIL) $(S) $(CC) $(CFLAGS) $(O) $@ $(AB) $(E) SYSCC = $(B) cd $(SYS) $(S) $(CC) $(CFLAGS) $(O) $@ $(AB) $(E) --- 300,305 ---- *************** *** 370,387 **** # the lower six for GCC a.out format. # ! 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 ! #GAMELN = $(CC) $(LDFLAGS) -o $(GAMEDIR)\$(GAME).exe $(TEMP)\$(GAMEDEF) $(SYSOBJ) $(HOBJ) $(PLIBS) $(TERMLIB) ! #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) # # OS/2 module definition files for NetHack, --- 313,330 ---- # the lower six for GCC a.out format. # ! #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 ! 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) # # OS/2 module definition files for NetHack, *************** *** 454,460 **** # only choice for now. # ! WINOBJ = $(OBJ)\getline.o $(OBJ)\termcap.o $(OBJ)\topl.o $(OBJ)\wintty.o # # The default make target, so just typing 'make' is useful. --- 397,407 ---- # 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. *************** *** 511,521 **** # out the lower line and uncomment the upper. Also, make sure # that DLB is defined in config.h. # - # NOTE: this feature is presently untested under OS/2. - # ! #do_dlb : dlb_yup ! do_dlb : dlb_nope ###################################################################### # --- 458,466 ---- # 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 ###################################################################### # *************** *** 566,672 **** # Object files for dlb. # ! DLBOBJS = $(OBJ)\dlb_main.o $(OBJ)\dlb.o $(OBJ)\alloc.c $(OBJ)\panic.o # # Data files for dlb. # DATHELP = \ ! $(GAMEDIR)\help $(GAMEDIR)\hh $(GAMEDIR)\cmdhelp $(GAMEDIR)\history \ ! $(GAMEDIR)\opthelp $(GAMEDIR)\wizhelp SPEC_LEVS = \ ! $(GAMEDIR)\asmodeus.lev $(GAMEDIR)\baalz.lev $(GAMEDIR)\bigrm-1.lev \ ! $(GAMEDIR)\bigrm-2.lev $(GAMEDIR)\bigrm-3.lev $(GAMEDIR)\bigrm-4.lev \ ! $(GAMEDIR)\castle.lev $(GAMEDIR)\fakewiz1.lev $(GAMEDIR)\fakewiz2.lev \ ! $(GAMEDIR)\juiblex.lev $(GAMEDIR)\knox.lev $(GAMEDIR)\medusa-1.lev \ ! $(GAMEDIR)\medusa-2.lev $(GAMEDIR)\minend-1.lev $(GAMEDIR)\minend-2.lev \ ! $(GAMEDIR)\minefill.lev $(GAMEDIR)\minetn-1.lev $(GAMEDIR)\minetn-2.lev \ ! $(GAMEDIR)\oracle.lev $(GAMEDIR)\orcus.lev $(GAMEDIR)\sanctum.lev \ ! $(GAMEDIR)\tower1.lev $(GAMEDIR)\tower2.lev $(GAMEDIR)\tower3.lev \ ! $(GAMEDIR)\valley.lev $(GAMEDIR)\wizard1.lev $(GAMEDIR)\wizard2.lev \ ! $(GAMEDIR)\wizard3.lev $(GAMEDIR)\astral.lev $(GAMEDIR)\air.lev \ ! $(GAMEDIR)\earth.lev $(GAMEDIR)\fire.lev $(GAMEDIR)\water.lev \ ! $(GAMEDIR)\soko1-1.lev $(GAMEDIR)\soko1-2.lev \ ! $(GAMEDIR)\soko2-1.lev $(GAMEDIR)\soko2-2.lev \ ! $(GAMEDIR)\soko3-1.lev $(GAMEDIR)\soko3-2.lev \ ! $(GAMEDIR)\soko4-1.lev $(GAMEDIR)\soko4-2.lev QUEST_LEVS = \ ! $(GAMEDIR)\Arc-goal.lev $(GAMEDIR)\Arc-fila.lev $(GAMEDIR)\Arc-filb.lev \ ! $(GAMEDIR)\Arc-loca.lev $(GAMEDIR)\Arc-strt.lev \ ! $(GAMEDIR)\Bar-goal.lev $(GAMEDIR)\Bar-fila.lev $(GAMEDIR)\Bar-filb.lev \ ! $(GAMEDIR)\Bar-loca.lev $(GAMEDIR)\Bar-strt.lev \ ! $(GAMEDIR)\Cav-goal.lev $(GAMEDIR)\Cav-fila.lev $(GAMEDIR)\Cav-filb.lev \ ! $(GAMEDIR)\Cav-loca.lev $(GAMEDIR)\Cav-strt.lev \ ! $(GAMEDIR)\Hea-goal.lev $(GAMEDIR)\Hea-fila.lev $(GAMEDIR)\Hea-filb.lev \ ! $(GAMEDIR)\Hea-loca.lev $(GAMEDIR)\Hea-strt.lev \ ! $(GAMEDIR)\Kni-goal.lev $(GAMEDIR)\Kni-fila.lev $(GAMEDIR)\Kni-filb.lev \ ! $(GAMEDIR)\Kni-loca.lev $(GAMEDIR)\Kni-strt.lev \ ! $(GAMEDIR)\Mon-goal.lev $(GAMEDIR)\Mon-fila.lev $(GAMEDIR)\Mon-filb.lev \ ! $(GAMEDIR)\Mon-loca.lev $(GAMEDIR)\Mon-strt.lev \ ! $(GAMEDIR)\Pri-goal.lev $(GAMEDIR)\Pri-fila.lev $(GAMEDIR)\Pri-filb.lev \ ! $(GAMEDIR)\Pri-loca.lev $(GAMEDIR)\Pri-strt.lev \ ! $(GAMEDIR)\Ran-goal.lev $(GAMEDIR)\Ran-fila.lev $(GAMEDIR)\Ran-filb.lev \ ! $(GAMEDIR)\Ran-loca.lev $(GAMEDIR)\Ran-strt.lev \ ! $(GAMEDIR)\Rog-goal.lev $(GAMEDIR)\Rog-fila.lev $(GAMEDIR)\Rog-filb.lev \ ! $(GAMEDIR)\Rog-loca.lev $(GAMEDIR)\Rog-strt.lev \ ! $(GAMEDIR)\Sam-goal.lev $(GAMEDIR)\Sam-fila.lev $(GAMEDIR)\Sam-filb.lev \ ! $(GAMEDIR)\Sam-loca.lev $(GAMEDIR)\Sam-strt.lev \ ! $(GAMEDIR)\Tou-goal.lev $(GAMEDIR)\Tou-fila.lev $(GAMEDIR)\Tou-filb.lev \ ! $(GAMEDIR)\Tou-loca.lev $(GAMEDIR)\Tou-strt.lev \ ! $(GAMEDIR)\Val-goal.lev $(GAMEDIR)\Val-fila.lev $(GAMEDIR)\Val-filb.lev \ ! $(GAMEDIR)\Val-loca.lev $(GAMEDIR)\Val-strt.lev \ ! $(GAMEDIR)\Wiz-goal.lev $(GAMEDIR)\Wiz-fila.lev $(GAMEDIR)\Wiz-filb.lev \ ! $(GAMEDIR)\Wiz-loca.lev $(GAMEDIR)\Wiz-strt.lev VARDATD = \ ! $(GAMEDIR)\data $(GAMEDIR)\oracles $(GAMEDIR)\options \ ! $(GAMEDIR)\quest.dat $(GAMEDIR)\rumors ! DATDLB = $(DATHELP) $(GAMEDIR)\dungeon $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD) # # Object files for the game itself. # ! VOBJ01 = $(OBJ)\allmain.o $(OBJ)\alloc.o $(OBJ)\apply.o $(OBJ)\artifact.o ! VOBJ02 = $(OBJ)\attrib.o $(OBJ)\ball.o $(OBJ)\bones.o $(OBJ)\botl.o ! VOBJ03 = $(OBJ)\cmd.o $(OBJ)\dbridge.o $(OBJ)\decl.o $(OBJ)\detect.o ! VOBJ04 = $(OBJ)\dig.o $(OBJ)\display.o $(OBJ)\dlb.o $(OBJ)\do.o ! VOBJ05 = $(OBJ)\do_name.o $(OBJ)\do_wear.o $(OBJ)\dog.o $(OBJ)\dogmove.o ! VOBJ06 = $(OBJ)\dokick.o $(OBJ)\dothrow.o $(OBJ)\drawing.o $(OBJ)\dungeon.o ! VOBJ07 = $(OBJ)\eat.o $(OBJ)\end.o $(OBJ)\engrave.o $(OBJ)\exper.o ! VOBJ08 = $(OBJ)\explode.o $(OBJ)\extralev.o $(OBJ)\files.o $(OBJ)\fountain.o ! VOBJ09 = $(OBJ)\hack.o $(OBJ)\hacklib.o $(OBJ)\invent.o $(OBJ)\light.o ! VOBJ10 = $(OBJ)\lock.o $(OBJ)\mail.o $(OBJ)\main.o $(OBJ)\makemon.o ! VOBJ11 = $(OBJ)\mcastu.o $(OBJ)\mhitm.o $(OBJ)\mhitu.o $(OBJ)\minion.o ! VOBJ12 = $(OBJ)\mklev.o $(OBJ)\mkmap.o $(OBJ)\mkmaze.o $(OBJ)\mkobj.o ! VOBJ13 = $(OBJ)\mkroom.o $(OBJ)\mon.o $(OBJ)\mondata.o $(OBJ)\monmove.o ! VOBJ14 = $(OBJ)\monst.o $(OBJ)\monstr.o $(OBJ)\mplayer.o $(OBJ)\mthrowu.o ! VOBJ15 = $(OBJ)\muse.o $(OBJ)\music.o $(OBJ)\o_init.o $(OBJ)\objects.o ! VOBJ16 = $(OBJ)\objnam.o $(OBJ)\options.o $(OBJ)\os2.o $(OBJ)\pager.o ! VOBJ17 = $(OBJ)\pcsys.o $(OBJ)\pickup.o $(OBJ)\pline.o $(OBJ)\polyself.o ! VOBJ18 = $(OBJ)\potion.o $(OBJ)\pray.o $(OBJ)\priest.o $(OBJ)\quest.o ! VOBJ19 = $(OBJ)\questpgr.o $(OBJ)\read.o $(OBJ)\rect.o $(OBJ)\region.o $(OBJ)\restore.o ! VOBJ20 = $(OBJ)\rip.o $(OBJ)\rnd.o $(OBJ)\rumors.o $(OBJ)\save.o ! VOBJ21 = $(OBJ)\shk.o $(OBJ)\shknam.o $(OBJ)\sit.o $(OBJ)\sounds.o ! VOBJ22 = $(OBJ)\sp_lev.o $(OBJ)\spell.o $(OBJ)\steal.o $(OBJ)\teleport.o ! VOBJ23 = $(OBJ)\timeout.o $(OBJ)\topten.o $(OBJ)\track.o $(OBJ)\trap.o ! VOBJ24 = $(OBJ)\tty.o $(OBJ)\u_init.o $(OBJ)\uhitm.o $(OBJ)\unix.o ! VOBJ25 = $(OBJ)\vault.o $(OBJ)\vision.o $(OBJ)\vis_tab.o $(OBJ)\weapon.o ! VOBJ26 = $(OBJ)\were.o $(OBJ)\wield.o $(OBJ)\windows.o $(OBJ)\wizard.o ! VOBJ27 = $(OBJ)\worm.o $(OBJ)\worn.o $(OBJ)\write.o $(OBJ)\zap.o ! VOBJ28 = $(WINOBJ) $(OBJ)\role.o $(OBJ)\steed.o ! VOBJ29 = $(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) --- 511,715 ---- # 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 \ ! minefill.lev minetn-1.lev minetn-2.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 ! ! 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) ! 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) *************** *** 704,710 **** $(TEMP)\$(RCVRDEF) : $(MAKEB) DD_NAME=recover DD_DESC="Recovery utility" DD_TARG=$@ do_def $(TEMP)\$(DLBDEF) : ! $(MAKEB) DD_NAME=dld DD_DESC="Archive utility" DD_TARG=$@ do_def do_def : $(ECHO) NAME $(DD_NAME) WINDOWCOMPAT> $(DD_TARG) --- 747,753 ---- $(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) *************** *** 718,726 **** $(GAME) : $(GAMEDIR)\$(GAME).exe $(GAME).exe : $(GAMEDIR)\$(GAME).exe ! $(GAMEDIR)\$(GAME).exe : $(TEMP)\$(GAME).rsp $(GAMELN) $(TEMP)\$(GAME).rsp : $(HOBJ) $(TEMP)\$(GAMEDEF) $(ECHO) $(SYSOBJ) $(VOBJ01) +> $@ $(ECHO) $(VOBJ02) +>> $@ --- 761,902 ---- $(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) $(WINOBJ1) >> $@ + $(ECHO) $(WINOBJ2) >> $@ + $(ECHO) $(WINOBJ3) >> $@ + $(ECHO) $(WINOBJ4) >> $@ + $(ECHO) $(HHOBJ) >> $@ + $(ECHO) $(RANDOM) >> $@ + $(X11ECHO) $(WINX11OBJ01) >> $@ + $(X11ECHO) $(WINX11OBJ02) >> $@ + $(X11ECHO) $(WINX11OBJ03) >> $@ + $(X11ECHO) $(WINX11OBJ04) >> $@ + $(X11ECHO) $(WINX11OBJ05) >> $@ + $(X11ECHO) $(WINX11OBJ06) >> $@ + $(X11ECHO) $(WINX11OBJ07) >> $@ + $(X11ECHO) $(WINX11OBJ08) >> $@ + $(X11ECHO) $(WINX11OBJ09) >> $@ + $(X11ECHO) $(WINX11OBJ10) >> $@ + $(X11ECHO) $(WINX11OBJ11) >> $@ + + + $(TEMP)\$(GAME).rsp : $(HOBJ) $(TEMP)\$(GAMEDEF) $(ECHO) $(SYSOBJ) $(VOBJ01) +> $@ $(ECHO) $(VOBJ02) +>> $@ *************** *** 751,756 **** --- 927,933 ---- $(ECHO) $(VOBJ27) +>> $@ $(ECHO) $(VOBJ28) +>> $@ $(ECHO) $(VOBJ29) +>> $@ + $(ECHO) $(VOBJ30) +>> $@ $(ECHO) $(HHOBJ)>> $@ $(ECHO) $(GAMEDIR)\$(GAME).exe>> $@ $(ECHO) $(TEMP)\$(GAME)>> $@ *************** *** 908,914 **** dlb : $(TEMP)\dlb.exe $(TEMP)\dlb.exe : $(TEMP)\dlb.rsp ! $(RCVRLN) $(TEMP)\dlb.rsp : $(DLBOBJS) $(TEMP)\$(DLBDEF) $(ECHO) $(SYSOBJ) $(DLBOBJS)> $@ --- 1085,1091 ---- dlb : $(TEMP)\dlb.exe $(TEMP)\dlb.exe : $(TEMP)\dlb.rsp ! $(DLBRLN) $(TEMP)\dlb.rsp : $(DLBOBJS) $(TEMP)\$(DLBDEF) $(ECHO) $(SYSOBJ) $(DLBOBJS)> $@ *************** *** 920,930 **** $(OBJ)\dlb_main.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\dlb.h $(UTILCC) ! $(GAMEDIR)\nhdat : $(MAKEB) do_dlb dlb_yup : dlb ! $(TEMP)\dlb cf $(GAMEDIR)\nhdat $(DATDLB) -$(RM) $(GAMEDIR)\help -$(RM) $(GAMEDIR)\hh -$(RM) $(GAMEDIR)\cmdhelp --- 1097,1107 ---- $(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 *************** *** 962,967 **** --- 1139,1148 ---- -$(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. *************** *** 1067,1073 **** 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 help_fil : $(GAMEDIR)\cmdhelp $(GAMEDIR)\help $(GAMEDIR)\hh $(GAMEDIR)\history \ $(GAMEDIR)\license $(GAMEDIR)\opthelp $(GAMEDIR)\wizhelp --- 1248,1255 ---- 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 *************** *** 1399,1404 **** --- 1581,1588 ---- $(SRCCC) $(OBJ)\makemon.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\epri.h $(INCL)\emin.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 $(INCL)\edog.h *************** *** 1531,1533 **** --- 1715,1784 ---- $(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) + *** nethack-3.3.1/sys/os2/os2.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/os2/os2.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)os2.c 3.3 96/02/29 */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)os2.c 3.4 1996/02/29 */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/dgn_lex.c Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/share/dgn_lex.c Thu Mar 21 07:37:42 2002 *************** *** 406,412 **** #define YY_MORE_ADJ 0 char *yytext; #define INITIAL 0 ! /* SCCS Id: @(#)dgn_lex.c 3.3 96/03/02 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 406,412 ---- #define YY_MORE_ADJ 0 char *yytext; #define INITIAL 0 ! /* SCCS Id: @(#)dgn_lex.c 3.4 1996/03/02 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 481,513 **** extern YYSTYPE yylval; int line_number = 1; - /* - * This is a hack required by Michael Hamel to get things - * working on the Mac. - */ - #if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) - #undef input - #undef unput - #define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; } - # ifndef YYNEWLINE - # define YYNEWLINE 10 - # endif - - char - input() /* Under MPW \n is chr(13)! Compensate for this. */ - { - if (yysptr > yysbuf) return(*--yysptr); - else { - yytchar = getc(yyin); - if (yytchar == '\n') { - yylineno++; - return(YYNEWLINE); - } - if (yytchar == EOF) return(0); - else return(yytchar); - } - } - #endif /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */ /* Macros after this point can all be overridden by user definitions in --- 481,486 ---- *** nethack-3.3.1/sys/share/dgn_yacc.c Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/share/dgn_yacc.c Thu Mar 21 07:37:42 2002 *************** *** 8,14 **** #define yyerrok (yyerrflag=0) #define YYRECOVERING (yyerrflag!=0) #define YYPREFIX "yy" ! /* SCCS Id: @(#)dgn_comp.c 3.3 96/06/22 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 8,14 ---- #define yyerrok (yyerrflag=0) #define YYRECOVERING (yyerrflag!=0) #define YYPREFIX "yy" ! /* SCCS Id: @(#)dgn_comp.c 3.4 1996/06/22 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/ioctl.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/ioctl.c Thu Mar 21 07:37:42 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)ioctl.c 3.3 90/22/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)ioctl.c 3.4 1990/22/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/lev_lex.c Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/share/lev_lex.c Thu Mar 21 07:37:42 2002 *************** *** 208,225 **** *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; ! #define YY_NUM_RULES 111 ! #define YY_END_OF_BUFFER 112 ! static yyconst short int yy_accept[627] = { 0, ! 0, 0, 0, 0, 112, 110, 108, 107, 110, 110, ! 110, 105, 4, 110, 110, 110, 110, 110, 110, 110, ! 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, ! 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, ! 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, ! 2, 108, 110, 110, 110, 110, 110, 110, 110, 110, ! 110, 110, 110, 110, 110, 110, 108, 0, 106, 0, ! 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 208,225 ---- *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; ! #define YY_NUM_RULES 112 ! #define YY_END_OF_BUFFER 113 ! static yyconst short int yy_accept[633] = { 0, ! 0, 0, 0, 0, 113, 111, 108, 107, 111, 111, ! 111, 105, 4, 111, 111, 111, 111, 111, 111, 111, ! 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, ! 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, ! 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, ! 2, 108, 111, 111, 105, 111, 111, 111, 111, 111, ! 111, 111, 111, 111, 111, 111, 111, 108, 0, 106, ! 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** *** 227,286 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 87, 0, 0, 3, 0, ! 2, 108, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 2, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 72, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, ! 0, 0, 0, 40, 0, 0, 0, 6, 0, 0, ! 42, 0, 0, 0, 33, 0, 0, 0, 36, 32, ! 0, 0, 0, 16, 0, 0, 104, 0, 0, 0, ! ! 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, ! 0, 0, 88, 91, 51, 0, 0, 0, 0, 0, ! 0, 60, 0, 0, 0, 0, 0, 94, 0, 0, ! 0, 0, 0, 0, 55, 0, 0, 0, 45, 0, ! 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, ! 0, 53, 12, 0, 0, 0, 0, 25, 0, 0, ! 0, 0, 0, 0, 10, 0, 0, 0, 0, 8, ! 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, ! 27, 0, 0, 0, 59, 86, 0, 0, 80, 0, ! 0, 0, 0, 74, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 50, 0, 0, 0, 58, ! 0, 64, 0, 0, 0, 52, 0, 0, 68, 0, ! 0, 30, 43, 0, 0, 0, 0, 0, 0, 0, ! 26, 0, 0, 0, 0, 0, 13, 28, 0, 21, ! 0, 0, 0, 0, 79, 0, 66, 49, 62, 46, ! 0, 0, 97, 0, 69, 0, 0, 0, 0, 0, ! 47, 0, 0, 0, 0, 0, 0, 48, 101, 0, ! 0, 56, 0, 54, 0, 0, 85, 0, 0, 1, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, ! ! 15, 0, 0, 0, 37, 0, 20, 0, 95, 0, ! 0, 92, 0, 0, 0, 78, 0, 0, 0, 0, ! 57, 73, 71, 0, 0, 0, 84, 0, 0, 0, ! 0, 39, 0, 0, 31, 11, 9, 19, 0, 0, ! 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, ! 0, 0, 0, 0, 83, 0, 0, 77, 0, 96, ! 70, 14, 0, 41, 0, 0, 0, 0, 0, 0, ! 0, 75, 98, 61, 0, 100, 44, 81, 82, 0, ! 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, ! 63, 0, 99, 0, 0, 0, 0, 0, 0, 0, ! ! 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, ! 76, 103, 0, 0, 0, 24, 0, 0, 0, 22, ! 0, 0, 23, 29, 38, 0 } ; static yyconst int yy_ec[256] = --- 227,287 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, ! 3, 0, 2, 108, 0, 105, 0, 0, 0, 0, ! 0, 0, 0, 0, 2, 0, 110, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, ! 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, ! 0, 0, 0, 17, 0, 0, 0, 0, 0, 40, ! 0, 0, 0, 6, 0, 0, 42, 0, 0, 0, ! 33, 0, 0, 0, 36, 32, 0, 0, 0, 16, ! ! 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, ! 0, 93, 0, 0, 0, 0, 0, 0, 88, 91, ! 51, 0, 0, 0, 0, 0, 0, 60, 0, 0, ! 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, ! 55, 0, 0, 0, 45, 0, 0, 0, 0, 0, ! 0, 0, 0, 90, 0, 0, 0, 53, 12, 0, ! 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, ! 10, 0, 0, 0, 0, 8, 0, 0, 0, 7, ! 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, ! 59, 86, 0, 0, 80, 0, 0, 0, 0, 74, + 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 50, 0, 0, 0, 58, 0, 64, 0, 0, ! 0, 52, 0, 0, 68, 0, 0, 30, 43, 0, ! 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, ! 0, 0, 13, 28, 0, 21, 0, 0, 0, 0, ! 79, 0, 66, 49, 62, 46, 0, 0, 97, 0, ! 69, 0, 0, 0, 0, 0, 47, 0, 0, 0, ! 0, 0, 0, 48, 101, 0, 0, 56, 0, 54, ! 0, 0, 85, 0, 0, 1, 0, 0, 0, 0, ! ! 0, 0, 0, 0, 0, 5, 15, 0, 0, 0, ! 37, 0, 20, 0, 95, 0, 0, 92, 0, 0, ! 0, 78, 0, 0, 0, 0, 57, 73, 71, 0, ! 0, 0, 84, 0, 0, 0, 0, 39, 0, 0, ! 31, 11, 9, 19, 0, 0, 0, 0, 0, 0, ! 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, ! 83, 0, 0, 77, 0, 96, 70, 14, 0, 41, ! 0, 0, 0, 0, 0, 0, 0, 75, 98, 61, ! 0, 100, 44, 81, 82, 0, 0, 0, 18, 0, ! 0, 0, 0, 0, 0, 0, 63, 0, 99, 0, ! ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, ! 35, 0, 0, 0, 0, 0, 76, 103, 0, 0, ! 0, 24, 0, 0, 0, 22, 0, 0, 23, 29, ! 38, 0 } ; static yyconst int yy_ec[256] = *************** *** 294,303 **** 1, 1, 1, 1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 1, 30, 31, 32, 33, 34, 35, 1, 36, 37, ! 38, 11, 39, 1, 40, 1, 41, 42, 43, 44, ! 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, ! 55, 56, 1, 57, 58, 59, 60, 61, 62, 1, 1, 1, 11, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, --- 295,304 ---- 1, 1, 1, 1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 1, 30, 31, 32, 33, 34, 35, 1, 36, 37, ! 38, 39, 40, 1, 41, 1, 42, 43, 44, 45, ! 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, ! 56, 57, 1, 58, 59, 60, 61, 62, 63, 1, 1, 1, 11, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, *************** *** 315,572 **** 1, 1, 1, 1, 1 } ; ! static yyconst int yy_meta[63] = { 0, 1, 2, 3, 2, 1, 2, 1, 1, 2, 2, ! 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1, ! 2, 2, 1, 1, 2, 1, 1, 1, 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 short int yy_base[631] = { 0, ! 0, 57, 81, 60, 756, 757, 63, 757, 750, 0, ! 742, 741, 757, 727, 721, 43, 40, 723, 44, 60, ! 722, 59, 61, 66, 733, 719, 90, 87, 63, 732, ! 70, 65, 69, 80, 76, 57, 66, 89, 92, 98, ! 97, 92, 98, 105, 108, 100, 104, 700, 741, 147, ! 757, 164, 167, 169, 171, 174, 177, 716, 157, 162, ! 173, 165, 178, 189, 170, 217, 160, 737, 757, 733, ! 728, 707, 724, 723, 165, 708, 721, 714, 719, 699, ! 703, 705, 707, 711, 693, 689, 694, 697, 697, 182, ! 699, 184, 694, 700, 691, 691, 703, 701, 690, 700, ! ! 688, 147, 190, 166, 670, 659, 669, 664, 649, 652, ! 649, 651, 663, 648, 60, 645, 639, 642, 641, 651, ! 645, 644, 161, 637, 632, 176, 634, 649, 198, 634, ! 636, 629, 206, 638, 642, 645, 644, 630, 636, 628, ! 188, 621, 624, 619, 212, 757, 620, 674, 757, 187, ! 757, 264, 227, 254, 255, 254, 258, 261, 263, 266, ! 269, 757, 0, 757, 662, 648, 647, 641, 642, 641, ! 635, 639, 648, 640, 640, 648, 632, 646, 644, 643, ! 629, 628, 640, 643, 616, 637, 629, 621, 635, 629, ! 624, 625, 626, 617, 628, 616, 619, 231, 596, 601, ! ! 586, 595, 588, 580, 578, 585, 581, 575, 578, 574, ! 579, 571, 571, 574, 568, 567, 568, 566, 571, 576, ! 577, 561, 757, 560, 561, 757, 566, 571, 560, 572, ! 562, 554, 552, 558, 554, 555, 246, 548, 561, 560, ! 550, 560, 559, 557, 552, 556, 541, 548, 537, 757, ! 550, 534, 544, 543, 532, 587, 274, 279, 563, 281, ! 282, 284, 558, 571, 570, 571, 562, 757, 568, 568, ! 550, 548, 561, 757, 538, 559, 551, 540, 560, 541, ! 757, 543, 286, 555, 757, 556, 541, 540, 757, 757, ! 537, 538, 536, 757, 542, 278, 757, 509, 505, 504, ! ! 515, 514, 500, 502, 511, 757, 510, 496, 508, 503, ! 510, 505, 757, 757, 757, 508, 503, 502, 536, 499, ! 495, 757, 498, 497, 500, 486, 489, 757, 479, 480, ! 487, 480, 493, 478, 757, 484, 479, 487, 757, 484, ! 483, 472, 467, 466, 465, 469, 474, 757, 464, 468, ! 460, 757, 757, 293, 504, 294, 296, 757, 496, 498, ! 493, 497, 483, 478, 757, 497, 478, 483, 478, 757, ! 493, 486, 487, 757, 482, 489, 470, 476, 474, 472, ! 757, 470, 469, 477, 757, 757, 450, 438, 757, 448, ! 439, 437, 433, 757, 445, 441, 438, 442, 424, 757, ! ! 440, 264, 431, 430, 434, 436, 420, 420, 432, 431, ! 434, 427, 416, 416, 430, 757, 425, 410, 422, 757, ! 414, 757, 406, 407, 419, 757, 405, 410, 757, 432, ! 308, 757, 757, 433, 431, 436, 435, 434, 425, 440, ! 757, 428, 434, 421, 430, 418, 757, 757, 408, 757, ! 421, 416, 409, 403, 757, 399, 757, 757, 757, 757, ! 388, 387, 757, 395, 757, 394, 389, 382, 391, 386, ! 757, 374, 374, 389, 374, 378, 375, 757, 757, 376, ! 371, 757, 366, 757, 372, 375, 757, 378, 377, 757, ! 311, 403, 390, 402, 391, 390, 380, 386, 390, 757, ! ! 757, 393, 381, 304, 757, 379, 757, 358, 757, 364, ! 363, 757, 361, 359, 350, 757, 349, 346, 357, 342, ! 757, 757, 757, 351, 344, 346, 757, 350, 352, 351, ! 364, 757, 373, 372, 757, 757, 757, 757, 377, 355, ! 361, 360, 372, 361, 345, 757, 340, 339, 323, 333, ! 323, 325, 333, 320, 757, 329, 318, 757, 326, 757, ! 757, 757, 355, 757, 357, 357, 340, 342, 345, 353, ! 336, 757, 757, 757, 306, 757, 757, 757, 757, 310, ! 304, 303, 757, 336, 335, 329, 327, 328, 329, 326, ! 757, 298, 757, 297, 323, 315, 317, 306, 321, 318, ! ! 315, 290, 287, 757, 757, 311, 301, 281, 274, 263, ! 757, 757, 234, 231, 223, 757, 212, 204, 186, 757, ! 118, 45, 757, 757, 757, 757, 347, 350, 352, 354 } ; ! static yyconst short int yy_def[631] = { 0, ! 626, 1, 1, 3, 626, 626, 626, 626, 627, 628, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 629, 626, ! 626, 630, 630, 630, 630, 630, 630, 626, 57, 57, ! 57, 57, 57, 61, 61, 629, 626, 627, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 629, 626, 626, ! 626, 630, 630, 630, 61, 626, 61, 61, 61, 61, ! 61, 626, 66, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 61, 61, 626, 61, ! 61, 61, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 61, 626, 61, 61, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 61, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 61, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 0, 626, 626, 626, 626 } ; ! static yyconst short int yy_nxt[820] = { 0, 6, 7, 8, 7, 9, 6, 6, 10, 11, 11, 6, 12, 13, 14, 15, 16, 17, 18, 19, 20, 6, 21, 6, 6, 22, 23, 24, 25, 26, 27, 28, 29, 6, 6, 30, 6, 6, 31, 6, 6, ! 32, 33, 34, 35, 36, 37, 6, 38, 6, 6, ! 6, 39, 40, 41, 42, 43, 44, 45, 46, 47, ! 6, 48, 49, 74, 67, 66, 67, 76, 79, 77, ! 75, 80, 84, 102, 86, 625, 85, 81, 87, 89, ! 99, 103, 50, 51, 52, 50, 53, 82, 88, 54, ! 54, 53, 100, 90, 55, 56, 57, 119, 58, 59, ! ! 211, 53, 60, 93, 53, 61, 121, 94, 96, 62, ! 120, 63, 64, 212, 122, 65, 104, 95, 97, 98, ! 108, 105, 106, 109, 112, 110, 107, 113, 111, 123, ! 117, 114, 125, 134, 115, 118, 126, 129, 130, 116, ! 127, 132, 136, 124, 624, 138, 128, 135, 140, 137, ! 102, 133, 131, 139, 143, 141, 144, 145, 103, 146, ! 150, 67, 142, 67, 87, 67, 151, 152, 626, 151, ! 626, 151, 626, 151, 88, 626, 151, 153, 626, 151, ! 71, 157, 153, 161, 80, 153, 158, 626, 83, 626, ! 85, 168, 92, 153, 169, 154, 198, 155, 153, 159, ! ! 626, 103, 153, 73, 75, 626, 99, 184, 185, 160, ! 98, 187, 220, 188, 199, 256, 623, 221, 100, 162, ! 163, 224, 163, 180, 200, 163, 163, 163, 626, 151, ! 163, 163, 163, 622, 296, 163, 225, 163, 163, 621, ! 163, 163, 247, 228, 248, 163, 234, 163, 163, 235, ! 229, 163, 230, 620, 252, 626, 151, 253, 236, 237, ! 619, 618, 238, 254, 239, 67, 151, 152, 258, 297, ! 259, 260, 626, 172, 153, 626, 153, 178, 626, 261, ! 626, 296, 153, 626, 617, 257, 626, 354, 334, 192, ! 335, 626, 153, 262, 153, 153, 626, 153, 626, 626, ! ! 271, 626, 375, 356, 616, 265, 153, 153, 357, 153, ! 626, 626, 615, 626, 376, 466, 297, 431, 614, 541, ! 467, 153, 358, 381, 153, 626, 491, 613, 626, 542, ! 612, 543, 544, 611, 610, 609, 608, 607, 606, 605, ! 604, 603, 602, 601, 600, 599, 507, 68, 68, 68, ! 70, 70, 148, 148, 148, 153, 153, 598, 597, 596, ! 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, ! 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, ! 575, 574, 573, 572, 571, 570, 569, 568, 567, 566, ! 565, 564, 563, 562, 561, 560, 559, 558, 557, 556, ! ! 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, ! 545, 540, 539, 538, 537, 536, 535, 534, 533, 532, ! 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, ! 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, ! 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, ! 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, ! 490, 489, 488, 487, 486, 485, 484, 483, 482, 481, ! 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, ! 470, 469, 468, 465, 464, 463, 462, 461, 460, 459, ! 458, 457, 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, 430, 429, 428, ! 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, ! 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, ! 407, 406, 405, 404, 403, 402, 401, 400, 399, 398, ! 397, 396, 395, 394, 393, 392, 391, 390, 389, 388, ! 387, 386, 385, 384, 383, 382, 381, 380, 379, 378, ! 377, 374, 373, 372, 371, 370, 369, 368, 367, 366, ! 365, 364, 363, 362, 361, 360, 359, 358, 355, 353, ! 352, 351, 350, 349, 348, 347, 346, 345, 344, 343, ! ! 342, 341, 340, 339, 338, 337, 336, 333, 332, 331, ! 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, ! 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, ! 310, 309, 308, 307, 306, 305, 304, 303, 302, 301, ! 300, 299, 298, 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, 263, 149, 255, 251, 250, ! 249, 246, 245, 244, 243, 242, 241, 240, 233, 232, ! 231, 227, 226, 223, 222, 219, 218, 217, 216, 215, ! ! 214, 213, 210, 209, 208, 207, 206, 205, 204, 203, ! 202, 201, 197, 196, 195, 194, 193, 192, 191, 190, ! 189, 186, 183, 182, 181, 180, 179, 178, 177, 176, ! 175, 174, 173, 172, 171, 170, 167, 166, 165, 71, ! 164, 69, 156, 149, 147, 101, 92, 91, 83, 78, ! 73, 72, 71, 71, 69, 626, 5, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626 } ; ! static yyconst short int yy_chk[820] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, --- 316,578 ---- 1, 1, 1, 1, 1 } ; ! static yyconst int yy_meta[64] = { 0, 1, 2, 3, 2, 1, 2, 1, 1, 2, 2, ! 2, 2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1, ! 2, 2, 1, 1, 2, 1, 1, 1, 2, 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 short int yy_base[638] = { 0, ! 0, 58, 82, 61, 781, 782, 64, 782, 775, 740, ! 766, 765, 782, 751, 745, 44, 41, 747, 45, 61, ! 746, 60, 62, 67, 757, 743, 91, 90, 90, 756, ! 71, 71, 75, 86, 21, 60, 68, 84, 95, 102, ! 92, 103, 103, 111, 108, 69, 97, 723, 765, 141, ! 782, 163, 160, 168, 170, 172, 174, 181, 740, 183, ! 176, 187, 185, 190, 196, 192, 224, 213, 761, 782, ! 757, 756, 751, 730, 747, 746, 180, 731, 744, 737, ! 742, 722, 726, 728, 730, 734, 716, 712, 717, 720, ! 720, 192, 722, 201, 717, 723, 714, 714, 726, 724, ! ! 713, 723, 711, 212, 184, 182, 692, 681, 691, 686, ! 671, 674, 671, 673, 685, 670, 126, 667, 661, 664, ! 663, 673, 667, 666, 167, 659, 654, 190, 656, 671, ! 204, 656, 658, 651, 212, 660, 664, 667, 666, 652, ! 658, 650, 206, 643, 646, 641, 197, 782, 642, 697, ! 782, 232, 782, 271, 274, 276, 278, 280, 248, 282, ! 284, 287, 289, 295, 782, 0, 782, 691, 690, 683, ! 669, 668, 662, 663, 662, 656, 660, 669, 661, 661, ! 669, 653, 667, 665, 664, 650, 649, 661, 664, 636, ! 658, 650, 642, 656, 650, 645, 646, 647, 638, 649, ! ! 637, 640, 267, 616, 621, 606, 615, 608, 600, 598, ! 605, 601, 595, 598, 594, 599, 591, 591, 594, 588, ! 587, 588, 586, 591, 596, 597, 581, 782, 580, 581, ! 782, 586, 591, 580, 592, 582, 574, 572, 578, 574, ! 575, 249, 568, 581, 580, 570, 580, 579, 577, 572, ! 576, 561, 568, 557, 782, 570, 554, 564, 563, 552, ! 608, 297, 302, 584, 306, 310, 313, 782, 579, 592, ! 591, 592, 583, 782, 589, 589, 571, 569, 582, 782, ! 558, 580, 572, 561, 581, 562, 782, 564, 289, 576, ! 782, 577, 562, 561, 782, 782, 558, 559, 557, 782, ! ! 563, 313, 782, 529, 525, 524, 535, 534, 520, 522, ! 531, 782, 530, 516, 528, 523, 530, 525, 782, 782, ! 782, 528, 523, 522, 557, 519, 515, 782, 518, 517, ! 520, 506, 509, 782, 499, 500, 507, 500, 513, 498, ! 782, 504, 499, 507, 782, 504, 503, 492, 487, 486, ! 485, 489, 494, 782, 484, 488, 480, 782, 782, 319, ! 525, 321, 325, 782, 517, 519, 514, 518, 504, 499, ! 782, 518, 499, 504, 499, 782, 514, 507, 508, 782, ! 503, 510, 491, 497, 495, 493, 782, 491, 490, 498, ! 782, 782, 470, 458, 782, 468, 459, 457, 453, 782, ! ! 465, 461, 458, 462, 444, 782, 460, 272, 451, 450, ! 454, 456, 440, 440, 452, 451, 454, 447, 436, 436, ! 450, 782, 445, 430, 442, 782, 434, 782, 426, 427, ! 439, 782, 425, 430, 782, 453, 331, 782, 782, 454, ! 452, 457, 456, 455, 446, 461, 782, 449, 455, 442, ! 451, 439, 782, 782, 428, 782, 442, 437, 430, 423, ! 782, 419, 782, 782, 782, 782, 408, 407, 782, 415, ! 782, 414, 409, 402, 411, 406, 782, 394, 394, 409, ! 394, 398, 395, 782, 782, 396, 391, 782, 386, 782, ! 392, 395, 782, 398, 397, 782, 333, 424, 411, 423, ! ! 412, 411, 401, 407, 411, 782, 782, 414, 402, 315, ! 782, 400, 782, 378, 782, 384, 383, 782, 381, 379, ! 370, 782, 369, 366, 377, 362, 782, 782, 782, 371, ! 364, 366, 782, 370, 372, 371, 385, 782, 394, 393, ! 782, 782, 782, 782, 398, 376, 382, 381, 393, 382, ! 365, 782, 360, 359, 343, 353, 343, 345, 353, 340, ! 782, 349, 338, 782, 346, 782, 782, 782, 376, 782, ! 378, 378, 361, 363, 366, 374, 357, 782, 782, 782, ! 326, 782, 782, 782, 782, 330, 324, 323, 782, 357, ! 343, 337, 335, 347, 348, 345, 782, 316, 782, 315, ! ! 342, 334, 336, 325, 340, 337, 334, 307, 303, 782, ! 782, 329, 327, 310, 309, 317, 782, 782, 309, 289, ! 271, 782, 219, 191, 169, 782, 89, 68, 782, 782, ! 782, 782, 369, 372, 374, 376, 379 } ; ! static yyconst short int yy_def[638] = { 0, ! 632, 1, 1, 3, 632, 632, 632, 632, 633, 634, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 635, 632, ! 632, 636, 636, 636, 636, 636, 636, 636, 632, 636, ! 636, 636, 636, 636, 636, 636, 635, 632, 633, 632, ! 632, 637, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 635, ! 632, 632, 632, 636, 636, 636, 636, 636, 632, 636, ! 636, 636, 636, 636, 632, 67, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 636, 636, 632, 636, 636, 636, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 636, ! 632, 636, 636, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 636, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 636, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 0, 632, 632, 632, 632, 632 } ; ! static yyconst short int yy_nxt[846] = { 0, 6, 7, 8, 7, 9, 6, 6, 10, 11, 11, 6, 12, 13, 14, 15, 16, 17, 18, 19, 20, 6, 21, 6, 6, 22, 23, 24, 25, 26, 27, 28, 29, 6, 6, 30, 6, 6, 31, 6, 6, ! 6, 32, 33, 34, 35, 36, 37, 6, 38, 6, ! 6, 6, 39, 40, 41, 42, 43, 44, 45, 46, ! 47, 6, 48, 49, 76, 68, 67, 68, 78, 81, ! 79, 77, 82, 86, 104, 88, 119, 87, 83, 89, ! 91, 120, 105, 50, 51, 52, 50, 53, 84, 90, ! 54, 54, 53, 55, 92, 56, 57, 58, 631, 59, ! ! 60, 121, 53, 61, 95, 53, 62, 101, 96, 123, ! 63, 98, 64, 65, 122, 630, 66, 124, 97, 102, ! 53, 99, 100, 106, 145, 125, 146, 110, 107, 108, ! 111, 114, 112, 109, 115, 113, 127, 134, 116, 126, ! 128, 117, 131, 132, 129, 136, 118, 135, 138, 142, ! 130, 147, 140, 148, 152, 139, 143, 133, 89, 137, ! 141, 632, 153, 144, 68, 153, 154, 216, 90, 632, ! 153, 632, 153, 632, 153, 632, 153, 632, 153, 156, ! 217, 156, 632, 153, 632, 153, 632, 153, 632, 153, ! 203, 632, 153, 632, 153, 105, 157, 632, 153, 629, ! ! 161, 158, 85, 75, 87, 164, 173, 160, 77, 174, ! 82, 162, 94, 101, 68, 104, 68, 189, 190, 225, ! 628, 163, 100, 105, 226, 102, 165, 166, 192, 166, ! 193, 204, 166, 166, 166, 166, 229, 166, 166, 166, ! 257, 205, 166, 258, 166, 166, 627, 166, 166, 259, ! 233, 230, 166, 239, 166, 166, 240, 234, 166, 235, ! 261, 252, 166, 253, 264, 241, 242, 177, 185, 243, ! 302, 244, 68, 153, 154, 632, 153, 632, 153, 632, ! 153, 632, 153, 632, 153, 632, 153, 156, 632, 153, ! 632, 153, 340, 263, 341, 265, 632, 153, 632, 153, ! ! 183, 626, 266, 632, 153, 381, 303, 632, 153, 262, ! 360, 632, 153, 197, 632, 153, 302, 382, 625, 267, ! 632, 153, 632, 153, 472, 277, 632, 153, 271, 473, ! 547, 362, 632, 153, 632, 153, 624, 363, 623, 622, ! 548, 621, 549, 550, 620, 619, 437, 618, 364, 497, ! 387, 617, 303, 616, 615, 614, 613, 612, 611, 610, ! 609, 608, 607, 606, 605, 604, 603, 602, 513, 69, ! 69, 69, 71, 71, 150, 150, 150, 155, 155, 168, ! 168, 601, 600, 599, 598, 597, 596, 595, 594, 593, ! 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, ! ! 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, ! 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, ! 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, ! 552, 551, 546, 545, 544, 543, 542, 541, 540, 539, ! 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, ! 528, 527, 526, 525, 524, 523, 522, 521, 520, 519, ! 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, ! 508, 507, 506, 505, 504, 503, 502, 501, 500, 499, ! 498, 496, 495, 494, 493, 492, 491, 490, 489, 488, ! 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, ! ! 477, 476, 475, 474, 471, 470, 469, 468, 467, 466, ! 465, 464, 463, 462, 461, 460, 459, 458, 457, 456, ! 455, 454, 453, 452, 451, 450, 449, 448, 447, 446, ! 445, 444, 443, 442, 441, 440, 439, 438, 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, 411, 410, 409, 408, 407, 406, 405, ! 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, ! 394, 393, 392, 391, 390, 389, 388, 387, 386, 385, ! 384, 383, 380, 379, 378, 377, 376, 375, 374, 373, ! ! 372, 371, 370, 369, 368, 367, 366, 365, 364, 361, ! 359, 358, 357, 356, 355, 354, 353, 352, 351, 350, ! 349, 348, 347, 346, 345, 344, 343, 342, 339, 338, ! 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, ! 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, ! 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, ! 307, 306, 305, 304, 301, 300, 299, 298, 297, 296, ! 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, 268, 151, ! ! 260, 256, 255, 254, 251, 250, 249, 248, 247, 246, ! 245, 238, 237, 236, 232, 231, 228, 227, 224, 223, ! 222, 221, 220, 219, 218, 215, 214, 213, 212, 211, ! 210, 209, 208, 207, 206, 202, 201, 200, 199, 198, ! 197, 196, 195, 194, 191, 188, 187, 186, 185, 184, ! 183, 182, 181, 180, 179, 178, 177, 176, 175, 172, ! 171, 170, 73, 169, 167, 70, 159, 151, 149, 103, ! 94, 93, 85, 80, 75, 74, 73, 73, 72, 70, ! 632, 5, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632 } ; ! static yyconst short int yy_chk[846] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, *************** *** 574,663 **** 1, 1, 1, 1, 1, 1, 1, 1, 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, 16, 7, 4, 7, 17, 19, 17, ! 16, 19, 22, 31, 23, 622, 22, 20, 23, 24, ! 29, 31, 2, 3, 3, 4, 3, 20, 23, 3, ! 3, 3, 29, 24, 3, 3, 3, 36, 3, 3, ! ! 115, 3, 3, 27, 3, 3, 37, 27, 28, 3, ! 36, 3, 3, 115, 37, 3, 32, 27, 28, 28, ! 33, 32, 32, 33, 34, 33, 32, 34, 33, 38, ! 35, 34, 39, 42, 34, 35, 39, 40, 40, 34, ! 39, 41, 43, 38, 621, 44, 39, 42, 45, 43, ! 102, 41, 40, 44, 46, 45, 46, 47, 102, 47, ! 50, 67, 45, 67, 50, 52, 52, 52, 53, 53, ! 54, 54, 55, 55, 50, 56, 56, 59, 57, 57, ! 54, 59, 60, 65, 59, 62, 61, 65, 60, 60, ! 61, 75, 62, 61, 75, 55, 103, 57, 63, 63, ! ! 61, 103, 64, 56, 57, 63, 64, 90, 90, 63, ! 63, 92, 123, 92, 104, 150, 619, 123, 64, 66, ! 66, 126, 66, 150, 104, 66, 66, 66, 153, 153, ! 66, 66, 66, 618, 198, 66, 126, 66, 66, 617, ! 66, 66, 141, 129, 141, 66, 133, 66, 66, 133, ! 129, 66, 129, 615, 145, 154, 154, 145, 133, 133, ! 614, 613, 133, 145, 133, 152, 152, 152, 155, 198, ! 156, 157, 155, 156, 158, 157, 159, 158, 158, 160, ! 159, 296, 161, 160, 610, 154, 161, 257, 237, 159, ! 237, 257, 258, 161, 260, 261, 258, 262, 260, 261, ! ! 260, 262, 283, 261, 609, 258, 354, 356, 262, 357, ! 354, 356, 608, 357, 283, 402, 296, 357, 607, 504, ! 402, 431, 354, 356, 491, 431, 431, 606, 491, 504, ! 603, 504, 504, 602, 601, 600, 599, 598, 597, 596, ! 595, 594, 592, 590, 589, 588, 491, 627, 627, 627, ! 628, 628, 629, 629, 629, 630, 630, 587, 586, 585, ! 584, 582, 581, 580, 575, 571, 570, 569, 568, 567, ! 566, 565, 563, 559, 557, 556, 554, 553, 552, 551, ! 550, 549, 548, 547, 545, 544, 543, 542, 541, 540, ! 539, 534, 533, 531, 530, 529, 528, 526, 525, 524, ! ! 520, 519, 518, 517, 515, 514, 513, 511, 510, 508, ! 506, 503, 502, 499, 498, 497, 496, 495, 494, 493, ! 492, 489, 488, 486, 485, 483, 481, 480, 477, 476, ! 475, 474, 473, 472, 470, 469, 468, 467, 466, 464, ! 462, 461, 456, 454, 453, 452, 451, 449, 446, 445, ! 444, 443, 442, 440, 439, 438, 437, 436, 435, 434, ! 430, 428, 427, 425, 424, 423, 421, 419, 418, 417, ! 415, 414, 413, 412, 411, 410, 409, 408, 407, 406, ! 405, 404, 403, 401, 399, 398, 397, 396, 395, 393, ! 392, 391, 390, 388, 387, 384, 383, 382, 380, 379, ! ! 378, 377, 376, 375, 373, 372, 371, 369, 368, 367, ! 366, 364, 363, 362, 361, 360, 359, 355, 351, 350, ! 349, 347, 346, 345, 344, 343, 342, 341, 340, 338, ! 337, 336, 334, 333, 332, 331, 330, 329, 327, 326, ! 325, 324, 323, 321, 320, 319, 318, 317, 316, 312, ! 311, 310, 309, 308, 307, 305, 304, 303, 302, 301, ! 300, 299, 298, 295, 293, 292, 291, 288, 287, 286, ! 284, 282, 280, 279, 278, 277, 276, 275, 273, 272, ! 271, 270, 269, 267, 266, 265, 264, 263, 259, 256, ! 255, 254, 253, 252, 251, 249, 248, 247, 246, 245, ! ! 244, 243, 242, 241, 240, 239, 238, 236, 235, 234, ! 233, 232, 231, 230, 229, 228, 227, 225, 224, 222, ! 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, ! 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, ! 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, ! 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, ! 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, ! 170, 169, 168, 167, 166, 165, 148, 147, 144, 143, ! 142, 140, 139, 138, 137, 136, 135, 134, 132, 131, ! 130, 128, 127, 125, 124, 122, 121, 120, 119, 118, ! ! 117, 116, 114, 113, 112, 111, 110, 109, 108, 107, ! 106, 105, 101, 100, 99, 98, 97, 96, 95, 94, ! 93, 91, 89, 88, 87, 86, 85, 84, 83, 82, ! 81, 80, 79, 78, 77, 76, 74, 73, 72, 71, ! 70, 68, 58, 49, 48, 30, 26, 25, 21, 18, ! 15, 14, 12, 11, 9, 5, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! ! 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, ! 626, 626, 626, 626, 626, 626, 626, 626, 626 } ; static yy_state_type yy_last_accepting_state; --- 580,672 ---- 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 16, 7, 4, 7, 17, 19, ! 17, 16, 19, 22, 31, 23, 35, 22, 20, 23, ! 24, 35, 31, 2, 3, 3, 4, 3, 20, 23, ! 3, 3, 3, 3, 24, 3, 3, 3, 628, 3, ! ! 3, 36, 3, 3, 27, 3, 3, 29, 27, 37, ! 3, 28, 3, 3, 36, 627, 3, 37, 27, 29, ! 3, 28, 28, 32, 46, 38, 46, 33, 32, 32, ! 33, 34, 33, 32, 34, 33, 39, 41, 34, 38, ! 39, 34, 40, 40, 39, 42, 34, 41, 43, 45, ! 39, 47, 44, 47, 50, 43, 45, 40, 50, 42, ! 44, 53, 53, 45, 52, 52, 52, 117, 50, 54, ! 54, 55, 55, 56, 56, 57, 57, 61, 61, 54, ! 117, 55, 58, 58, 60, 60, 63, 63, 62, 62, ! 105, 64, 64, 66, 66, 105, 56, 65, 65, 625, ! ! 62, 58, 61, 57, 62, 66, 77, 60, 58, 77, ! 60, 64, 63, 65, 68, 104, 68, 92, 92, 125, ! 624, 64, 64, 104, 125, 65, 67, 67, 94, 67, ! 94, 106, 67, 67, 67, 67, 128, 67, 67, 67, ! 147, 106, 67, 147, 67, 67, 623, 67, 67, 147, ! 131, 128, 67, 135, 67, 67, 135, 131, 67, 131, ! 152, 143, 67, 143, 159, 135, 135, 159, 152, 135, ! 203, 135, 154, 154, 154, 155, 155, 156, 156, 157, ! 157, 158, 158, 160, 160, 161, 161, 156, 162, 162, ! 163, 163, 242, 158, 242, 160, 164, 164, 262, 262, ! ! 161, 621, 163, 263, 263, 289, 203, 265, 265, 157, ! 262, 266, 266, 162, 267, 267, 302, 289, 620, 164, ! 360, 360, 362, 362, 408, 265, 363, 363, 263, 408, ! 510, 266, 437, 437, 497, 497, 619, 267, 616, 615, ! 510, 614, 510, 510, 613, 612, 363, 609, 360, 437, ! 362, 608, 302, 607, 606, 605, 604, 603, 602, 601, ! 600, 598, 596, 595, 594, 593, 592, 591, 497, 633, ! 633, 633, 634, 634, 635, 635, 635, 636, 636, 637, ! 637, 590, 588, 587, 586, 581, 577, 576, 575, 574, ! 573, 572, 571, 569, 565, 563, 562, 560, 559, 558, ! ! 557, 556, 555, 554, 553, 551, 550, 549, 548, 547, ! 546, 545, 540, 539, 537, 536, 535, 534, 532, 531, ! 530, 526, 525, 524, 523, 521, 520, 519, 517, 516, ! 514, 512, 509, 508, 505, 504, 503, 502, 501, 500, ! 499, 498, 495, 494, 492, 491, 489, 487, 486, 483, ! 482, 481, 480, 479, 478, 476, 475, 474, 473, 472, ! 470, 468, 467, 462, 460, 459, 458, 457, 455, 452, ! 451, 450, 449, 448, 446, 445, 444, 443, 442, 441, ! 440, 436, 434, 433, 431, 430, 429, 427, 425, 424, ! 423, 421, 420, 419, 418, 417, 416, 415, 414, 413, ! ! 412, 411, 410, 409, 407, 405, 404, 403, 402, 401, ! 399, 398, 397, 396, 394, 393, 390, 389, 388, 386, ! 385, 384, 383, 382, 381, 379, 378, 377, 375, 374, ! 373, 372, 370, 369, 368, 367, 366, 365, 361, 357, ! 356, 355, 353, 352, 351, 350, 349, 348, 347, 346, ! 344, 343, 342, 340, 339, 338, 337, 336, 335, 333, ! 332, 331, 330, 329, 327, 326, 325, 324, 323, 322, ! 318, 317, 316, 315, 314, 313, 311, 310, 309, 308, ! 307, 306, 305, 304, 301, 299, 298, 297, 294, 293, ! 292, 290, 288, 286, 285, 284, 283, 282, 281, 279, ! ! 278, 277, 276, 275, 273, 272, 271, 270, 269, 264, ! 261, 260, 259, 258, 257, 256, 254, 253, 252, 251, ! 250, 249, 248, 247, 246, 245, 244, 243, 241, 240, ! 239, 238, 237, 236, 235, 234, 233, 232, 230, 229, ! 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, ! 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, ! 207, 206, 205, 204, 202, 201, 200, 199, 198, 197, ! 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, ! 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, ! 176, 175, 174, 173, 172, 171, 170, 169, 168, 150, ! ! 149, 146, 145, 144, 142, 141, 140, 139, 138, 137, ! 136, 134, 133, 132, 130, 129, 127, 126, 124, 123, ! 122, 121, 120, 119, 118, 116, 115, 114, 113, 112, ! 111, 110, 109, 108, 107, 103, 102, 101, 100, 99, ! 98, 97, 96, 95, 93, 91, 90, 89, 88, 87, ! 86, 85, 84, 83, 82, 81, 80, 79, 78, 76, ! 75, 74, 73, 72, 71, 69, 59, 49, 48, 30, ! 26, 25, 21, 18, 15, 14, 12, 11, 10, 9, ! 5, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, ! 632, 632, 632, 632, 632 } ; static yy_state_type yy_last_accepting_state; *************** *** 671,677 **** #define YY_MORE_ADJ 0 char *yytext; #define INITIAL 0 ! /* SCCS Id: @(#)lev_lex.c 3.3 96/05/16 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 680,686 ---- #define YY_MORE_ADJ 0 char *yytext; #define INITIAL 0 ! /* SCCS Id: @(#)lev_lex.c 3.4 2000/12/22 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 746,779 **** static char map[4096]; static int map_cnt = 0; - /* - * This is a hack required by Michael Hamel to get things - * working on the Mac. - */ - #if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) - #undef input - #undef unput - #define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; } - # ifndef YYNEWLINE - # define YYNEWLINE 10 - # endif - - char - input() /* Under MPW \n is chr(13)! Compensate for this. */ - { - if (yysptr > yysbuf) return(*--yysptr); - else { - yytchar = getc(yyin); - if (yytchar == '\n') { - yylineno++; - return(YYNEWLINE); - } - if (yytchar == EOF) return(0); - else return(yytchar); - } - } - #endif /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */ - #define MAPC 1 --- 755,760 ---- *************** *** 928,940 **** 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 >= 627 ) 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] != 757 ); yy_find_action: yy_act = yy_accept[yy_current_state]; --- 909,921 ---- 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 >= 633 ) 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] != 782 ); yy_find_action: yy_act = yy_accept[yy_current_state]; *************** *** 1409,1422 **** YY_BREAK case 109: YY_RULE_SETUP ! { yylval.i = yytext[1]; return CHAR; } YY_BREAK case 110: YY_RULE_SETUP ! { return yytext[0]; } YY_BREAK case 111: YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): --- 1390,1407 ---- YY_BREAK case 109: YY_RULE_SETUP ! { yylval.i = yytext[2]; return CHAR; } YY_BREAK case 110: YY_RULE_SETUP ! { yylval.i = yytext[1]; return CHAR; } YY_BREAK case 111: YY_RULE_SETUP + { return yytext[0]; } + YY_BREAK + case 112: + YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): *************** *** 1710,1716 **** 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 >= 627 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; --- 1695,1701 ---- 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 >= 633 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *************** *** 1741,1751 **** 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 >= 627 ) 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 == 626); return yy_is_jam ? 0 : yy_current_state; } --- 1726,1736 ---- 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 >= 633 ) 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 == 632); return yy_is_jam ? 0 : yy_current_state; } *** nethack-3.3.1/sys/share/lev_yacc.c Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/share/lev_yacc.c Thu Mar 21 07:37:43 2002 *************** *** 8,14 **** #define yyerrok (yyerrflag=0) #define YYRECOVERING (yyerrflag!=0) #define YYPREFIX "yy" ! /* SCCS Id: @(#)lev_yacc.c 3.3 2000/01/17 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 8,14 ---- #define yyerrok (yyerrflag=0) #define YYRECOVERING (yyerrflag!=0) #define YYPREFIX "yy" ! /* SCCS Id: @(#)lev_yacc.c 3.4 2000/01/17 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/Makefile.lib Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/Makefile.lib Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! # SCCS Id: @(#)Makefile.lib 3.3 90/22/02 # Nethack makefile for Fred fish termlib -- Norman Meluch # CC = cl /c --- 1,4 ---- ! # SCCS Id: @(#)Makefile.lib 3.4 1990/22/02 # Nethack makefile for Fred fish termlib -- Norman Meluch # CC = cl /c *** nethack-3.3.1/sys/share/NetHack.cnf Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/NetHack.cnf Thu Mar 21 07:37:43 2002 *************** *** 49,54 **** --- 49,56 ---- #OPTIONS=nolegacy,noverbose #OPTIONS=menustyle:traditional + # If you wish to change the symbol used to display boulders use: + OPTIONS=boulder:0 # # General options. You might also set "silent" so as not to attract # the boss's attention. *************** *** 58,64 **** # If you want to get rid of "use #quit to quit..." use: #OPTIONS=suppress_alert:3.3.1 # - # #HACKDIR=c:\games\nethack # --- 60,65 ---- *************** *** 82,102 **** # processing. # # ================================================ ! # An example using the IBM graphics character set: ! #DUNGEON= 032 179 196 218 191 192 217 197 193 194 \ ! # 180 195 249 239 239 254 254 240 241 249 \ ! # 177 177 060 062 060 062 220 124 190 035 \ ! # 244 247 249 247 042 042 186 205 046 035 \ ! # 247 ! # ! #TRAPS= 094 094 094 094 094 094 094 094 094 094 \ ! # 094 094 094 094 232 232 232 157 094 094 \ ! # 094 094 ! # ! #EFFECTS= 179 196 092 047 042 033 041 040 \ ! # 048 035 064 042 \ ! # 047 045 092 058 058 092 045 047 \ ! # 047 045 092 058 032 058 092 045 047 # # ================================================ # Some alternatives: --- 83,94 ---- # processing. # # ================================================ ! # The defaults using the IBM graphics character set: ! #DUNGEON = 032 179 196 218 191 192 217 197 193 194 \ ! # 180 195 250 254 254 043 043 240 241 250 \ ! # 176 177 243 242 060 062 095 124 092 035 \ ! # 244 247 250 247 250 250 035 035 032 035 \ ! # 247 # # ================================================ # Some alternatives: *** nethack-3.3.1/sys/share/nhlan.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/nhlan.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)nhlan.c 3.3 99/11/21 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)nhlan.c 3.4 1999/11/21 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/pcmain.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/pcmain.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pcmain.c 3.3 97/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pcmain.c 3.4 1997/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 70,76 **** extern void FDECL(pcmain, (int,char **)); ! #ifdef __BORLANDC__ void NDECL( startup ); # ifdef OVLB unsigned _stklen = STKSIZ; --- 70,76 ---- extern void FDECL(pcmain, (int,char **)); ! #if defined(__BORLANDC__) && !defined(_WIN32) void NDECL( startup ); # ifdef OVLB unsigned _stklen = STKSIZ; *************** *** 106,112 **** register int fd; register char *dir; ! #ifdef __BORLANDC__ startup(); #endif --- 106,112 ---- register int fd; register char *dir; ! #if defined(__BORLANDC__) && !defined(_WIN32) startup(); #endif *************** *** 167,179 **** if(argc == 0) chdirx(HACKDIR, 1); # endif - ami_argset(&argc, argv); ami_wininit_data(); #endif initoptions(); - #ifdef AMIGA - ami_mkargline(&argc, &argv); - #endif #if defined(TOS) && defined(TEXTCOLOR) if (iflags.BIOS && iflags.use_color) --- 167,175 ---- *************** *** 235,242 **** u.ux = 0; /* prevent flush_screen() */ /* chdir shouldn't be called before this point to keep the ! * code parallel to other ports which call gethdate just ! * before here. */ #ifdef CHDIR chdirx(hackdir,1); --- 231,237 ---- u.ux = 0; /* prevent flush_screen() */ /* chdir shouldn't be called before this point to keep the ! * code parallel to other ports. */ #ifdef CHDIR chdirx(hackdir,1); *************** *** 382,391 **** if(yn("Do you want to keep the save file?") == 'n'){ (void) delete_savefile(); } - # ifdef AMIGA - else - preserve_icon(); - # endif } flags.move = 0; --- 377,382 ---- *************** *** 427,432 **** --- 418,434 ---- argv++; argc--; switch(argv[0][1]){ + case 'a': + if (argv[0][2]) { + if ((i = str2align(&argv[0][2])) >= 0) + flags.initalign = i; + } else if (argc > 1) { + argc--; + argv++; + if ((i = str2align(argv[0])) >= 0) + flags.initalign = i; + } + break; case 'D': #ifdef WIZARD /* If they don't have a valid wizard name, it'll be *************** *** 467,472 **** --- 469,485 ---- switch_graphics(DEC_GRAPHICS); break; #endif + case 'g': + if (argv[0][2]) { + if ((i = str2gend(&argv[0][2])) >= 0) + flags.initgend = i; + } else if (argc > 1) { + argc--; + argv++; + if ((i = str2gend(argv[0])) >= 0) + flags.initgend = i; + } + break; case 'p': /* profession (role) */ if (argv[0][2]) { if ((i = str2role(&argv[0][2])) >= 0) *************** *** 507,512 **** --- 520,528 ---- bigscreen = -1; break; #endif + case '@': + flags.randomall = 1; + break; default: if ((i = str2role(&argv[0][1])) >= 0) { flags.initrole = i; *************** *** 621,627 **** # ifndef WIN32 Strcpy (tmp, str); # else ! *(tmp + GetModuleFileName((HANDLE)0, tmp, bsize)) = '\0'; # endif tmp2 = strrchr(tmp, PATH_SEPARATOR); if (tmp2) *tmp2 = '\0'; --- 637,651 ---- # ifndef WIN32 Strcpy (tmp, str); # else ! #ifdef UNICODE ! { ! TCHAR wbuf[BUFSZ]; ! GetModuleFileName((HANDLE)0, wbuf, BUFSZ); ! WideCharToMultiByte(CP_ACP, 0, wbuf, -1, tmp, bsize, NULL, NULL); ! } ! #else ! *(tmp + GetModuleFileName((HANDLE)0, tmp, bsize)) = '\0'; ! #endif # endif tmp2 = strrchr(tmp, PATH_SEPARATOR); if (tmp2) *tmp2 = '\0'; *** nethack-3.3.1/sys/share/pcsys.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/pcsys.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pcsys.c 3.3 1999/12/10 /* NetHack may be freely redistributed. See license for details. */ /* --- 1,4 ---- ! /* SCCS Id: @(#)pcsys.c 3.4 2002/01/22 */ /* NetHack may be freely redistributed. See license for details. */ /* *************** *** 11,17 **** #include #include ! #ifndef MSDOS /* already done */ #include #endif #ifdef __GO32__ --- 11,17 ---- #include #include ! #if !defined(MSDOS) && !defined(WIN_CE) /* already done */ #include #endif #ifdef __GO32__ *************** *** 45,53 **** #define __MOVE_PAUSE_CACHE 4 /* Represents the cache memory */ #endif /* MOVERLAY */ STATIC_DCL boolean NDECL(record_exists); ! #ifndef TOS STATIC_DCL boolean NDECL(comspec_exists); #endif #ifdef WIN32CON --- 45,55 ---- #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 #ifdef WIN32CON *************** *** 78,88 **** { extern char orgdir[]; char *comspec; int spawnstat; #if defined(MSDOS) && defined(NO_TERMS) ! int grmode; #endif ! if (comspec = getcomspec()) { # ifndef TOS /* TOS has a variety of shells */ suspend_nhwindows("To return to NetHack, enter \"exit\" at the system prompt.\n"); # else --- 80,92 ---- { extern char orgdir[]; char *comspec; + # ifndef __GO32__ int spawnstat; + # endif #if defined(MSDOS) && defined(NO_TERMS) ! int grmode = iflags.grmode; #endif ! if ((comspec = getcomspec())) { # ifndef TOS /* TOS has a variety of shells */ suspend_nhwindows("To return to NetHack, enter \"exit\" at the system prompt.\n"); # else *************** *** 297,304 **** return 1; } - # endif /* MFLOPPY */ - /* Return 1 if the record file was found */ STATIC_OVL boolean record_exists() --- 301,306 ---- *************** *** 312,321 **** --- 314,325 ---- } 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() *************** *** 323,337 **** int fd; char *comspec; ! if (comspec = getcomspec()) if ((fd = open(comspec, O_RDONLY)) >= 0) { (void) close(fd); return TRUE; } return FALSE; } # endif # ifdef MFLOPPY /* Prompt for game disk, then check for record file. */ --- 327,343 ---- int fd; char *comspec; ! if ((comspec = getcomspec())) if ((fd = open(comspec, O_RDONLY)) >= 0) { (void) close(fd); return TRUE; } return FALSE; } + # endif /* MFLOPPY */ # endif + # ifdef MFLOPPY /* Prompt for game disk, then check for record file. */ *************** *** 429,435 **** */ (void) strncpy(buf, name, BUFSIZ - 1); buf[BUFSIZ-1] = '\0'; ! if (fp = fopen(buf, mode)) return fp; else { int ccnt = 0; --- 435,441 ---- */ (void) strncpy(buf, name, BUFSIZ - 1); buf[BUFSIZ-1] = '\0'; ! if ((fp = fopen(buf, mode))) return fp; else { int ccnt = 0; *************** *** 445,452 **** ccnt++; } (void) strncpy(bp, name, (BUFSIZ - ccnt) - 2); ! bp[BUFSIZ-1] = '\0'; ! if (fp = fopen(buf, mode)) return fp; if (*pp) pp++; --- 451,458 ---- ccnt++; } (void) strncpy(bp, name, (BUFSIZ - ccnt) - 2); ! bp[BUFSIZ - ccnt - 1] = '\0'; ! if ((fp = fopen(buf, mode))) return fp; if (*pp) pp++; *** nethack-3.3.1/sys/share/pctty.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/pctty.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pctty.c 3.3 90/22/02 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pctty.c 3.4 1990/22/02 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/pcunix.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/pcunix.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)pcunix.c 3.3 94/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)pcunix.c 3.4 1994/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 21,85 **** #ifdef OVLB static struct stat buf; # ifdef WANT_GETHDATE static struct stat hbuf; # endif ! void ! gethdate(name) ! char *name; ! { ! # ifdef WANT_GETHDATE ! /* old version - for people short of space */ ! /* ! /* register char *np; ! /* if(stat(name, &hbuf)) ! /* error("Cannot get status of %s.", ! /* (np = rindex(name, '/')) ? np+1 : name); ! /* ! /* version using PATH from: seismo!gregc@ucsf-cgl.ARPA (Greg Couch) */ ! ! /* ! * The problem with #include is that this include file ! * does not exist on all systems, and moreover, that it sometimes includes ! * again, so that the compiler sees these typedefs twice. ! */ ! #define MAXPATHLEN 1024 ! ! register char *np, *path; ! char filename[MAXPATHLEN+1], *getenv(); ! int pathlen; ! ! if (index(name, '/') != (char *)0 || (path = getenv("PATH")) == (char *)0) ! path = ""; ! ! for (;;) { ! if ((np = index(path, ':')) == (char *)0) ! np = path + strlen(path); /* point to end str */ ! pathlen = np - path; ! if (pathlen > MAXPATHLEN) ! pathlen = MAXPATHLEN; ! if (pathlen <= 1) { /* %% */ ! (void) strncpy(filename, name, MAXPATHLEN); ! } else { ! (void) strncpy(filename, path, pathlen); ! filename[pathlen] = '/'; ! (void) strncpy(filename + pathlen + 1, name, ! (MAXPATHLEN - 1) - pathlen); ! } ! filename[MAXPATHLEN] = '\0'; ! if (stat(filename, &hbuf) == 0) ! return; ! if (*np == '\0') ! path = ""; ! path = np + 1; ! } ! if (strlen(name) > BUFSZ/2) ! name = name + strlen(name) - BUFSZ/2; ! error("Cannot get status of %s.", (np = rindex(name, '/')) ? np+1 : name); ! # endif /* WANT_GETHDATE */ ! } #if 0 int --- 21,37 ---- #ifdef OVLB + #if 0 static struct stat buf; + #endif + # ifdef WANT_GETHDATE static struct stat hbuf; # endif ! #ifdef PC_LOCKING ! static int NDECL(eraseoldlocks); ! #endif #if 0 int *************** *** 144,154 **** void getlock() { ! register int i = 0, fd, c, ci, ct; char tbuf[BUFSZ]; const char *fq_lock; # if defined(MSDOS) && defined(NO_TERMS) ! int grmode; # endif /* we ignore QUIT and INT at this point */ --- 96,106 ---- void getlock() { ! register int fd, c, ci, ct; char tbuf[BUFSZ]; const char *fq_lock; # if defined(MSDOS) && defined(NO_TERMS) ! int grmode = iflags.grmode; # endif /* we ignore QUIT and INT at this point */ *** nethack-3.3.1/sys/share/tclib.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/tclib.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tclib.c 3.3 96/02/25 */ /* Copyright (c) Robert Patrick Rankin, 1995 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)tclib.c 3.4 1996/02/25 */ /* Copyright (c) Robert Patrick Rankin, 1995 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/share/unixtty.c Thu Feb 14 07:59:35 2002 --- nethack-3.4.0/sys/share/unixtty.c Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)unixtty.c 3.3 90/22/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)unixtty.c 3.4 1990/22/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 35,40 **** --- 35,45 ---- # define termstruct termio # endif # endif /* POSIX_TYPES */ + # ifdef LINUX + # include + # undef delay_output /* curses redefines this */ + # include + # endif # define kill_sym c_cc[VKILL] # define erase_sym c_cc[VERASE] # define intr_sym c_cc[VINTR] *** nethack-3.3.1/sys/share/sounds/README Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/share/sounds/README Thu Mar 21 07:37:43 2002 *************** *** 29,34 **** Any comment on the sounds or their use is welcome: - h+@nada.kth.se Jon W{tte Mac Team --- 29,34 ---- Any comment on the sounds or their use is welcome: Jon W{tte Mac Team + nethack-bugs@nethack.org *** nethack-3.3.1/sys/unix/depend.awk Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/depend.awk Thu Mar 21 07:37:43 2002 *************** *** 35,41 **** } /^\#[ \t]*include[ \t]+\"/ { #find `#include "X"' incl = $2; ! #[3.3.1: gnomehack headers currently aren't in include] if (incl ~ /\.h$/) { if (incl ~ /^gn/) # gnomehack special case incl = "../win/gnome/" incl --- 35,41 ---- } /^\#[ \t]*include[ \t]+\"/ { #find `#include "X"' incl = $2; ! #[3.4.0: gnomehack headers currently aren't in include] if (incl ~ /\.h$/) { if (incl ~ /^gn/) # gnomehack special case incl = "../win/gnome/" incl *** nethack-3.3.1/sys/unix/Install.unx Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/Install.unx Thu Mar 21 07:37:43 2002 *************** *** 1,4 **** ! Instructions for installing NetHack 3.3 on a UNIX system ======================================= --- 1,4 ---- ! Instructions for installing NetHack 3.4 on a UNIX system ======================================= *************** *** 25,32 **** in Files, which should be in the top directory.) 2. Your Makefiles may still be in sys/unix with tags on the end of them. ! If so, run setup.sh in that directory to distribute the Makefiles to ! places they can do their work. (If later official patches change these Makefiles, setup.sh should be rerun to make sure you use the current copies.) --- 25,32 ---- in Files, which should be in the top directory.) 2. Your Makefiles may still be in sys/unix with tags on the end of them. ! If so, run "sh setup.sh" in that directory to distribute the Makefiles ! to places they can do their work. (If later official patches change these Makefiles, setup.sh should be rerun to make sure you use the current copies.) *************** *** 85,91 **** Notes: 1. Save files and bones files from previous versions will not work with ! NetHack 3.3. 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 --- 85,91 ---- 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 this version of NetHack after changing something, type 'make update' from the main directory. If you created the new *** nethack-3.3.1/sys/unix/Makefile.dat Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/Makefile.dat Thu Mar 21 07:37:43 2002 *************** *** 1,5 **** # NetHack Makefile. ! # SCCS Id: @(#)Makefile.dat 3.3 92/09/18 # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP --- 1,5 ---- # NetHack Makefile. ! # SCCS Id: @(#)Makefile.dat 3.4 1992/09/18 # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP *************** *** 43,55 **** --- 43,62 ---- 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 + ../util/tile2img.ttp: (cd ../util ; make tile2img.ttp) + ../util/xpm2img.ttp: + (cd ../util ; make xpm2img.ttp) nh16.img: ../util/tile2img.ttp ../win/share/monsters.txt \ ../win/share/objects.txt ../win/share/other.txt ../util/tile2img.ttp nh16.img + rip.img: ../util/xpm2img.ttp + ../util/xpm2img.ttp ../win/X11/rip.xpm rip.img title.img: # cp ../win/gem/title.img title.img $(UUDECODE) ../win/gem/title.uu *************** *** 118,120 **** --- 125,128 ---- spotless: -rm -f spec_levs quest_levs *.lev $(VARDAT) dungeon dungeon.pdf -rm -f nhdat x11tiles beostiles pet_mark.xbm rip.xpm mapbg.xpm + -rm -f rip.img GEM_RSC.RSC title.img nh16.img *** nethack-3.3.1/sys/unix/Makefile.doc Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/Makefile.doc Thu Mar 21 07:37:43 2002 *************** *** 1,5 **** # NetHack Makefile. ! # SCCS Id: @(#)Makefile.doc 3.3 96/03/23 # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP --- 1,5 ---- # NetHack Makefile. ! # SCCS Id: @(#)Makefile.doc 3.4 1996/03/23 # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP *************** *** 14,19 **** --- 14,23 ---- 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 # GUIDECMD = cat Guidebook.txt GUIDECMD = tbl tmac.n Guidebook.mn | nroff | $(COLCMD) *************** *** 24,30 **** # Fancier output for those with ditroff, psdit and a PostScript printer. Guidebook.ps: Guidebook.mn ! tbl tmac.n Guidebook.mn | ditroff | psdit > Guidebook.ps # Guidebook.tex is the same as Guidebook.mn but formatted with LaTeX. # - The invocation command for LaTeX may vary in different installations. --- 28,34 ---- # Fancier output for those with ditroff, psdit and a PostScript printer. Guidebook.ps: Guidebook.mn ! tbl tmac.n Guidebook.mn | $(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. *** nethack-3.3.1/sys/unix/Makefile.src Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/Makefile.src Thu Mar 21 07:37:43 2002 *************** *** 1,5 **** # NetHack Makefile. ! # SCCS Id: @(#)Makefile.src 3.3 97/04/17 # newer makes predefine $(MAKE) to 'make' and do smarter processing of # recursive make calls if $(MAKE) is used --- 1,5 ---- # NetHack Makefile. ! # SCCS Id: @(#)Makefile.src 3.4 2002/03/02 # newer makes predefine $(MAKE) to 'make' and do smarter processing of # recursive make calls if $(MAKE) is used *************** *** 40,47 **** # # for UNIX systems SYSSRC = ../sys/share/ioctl.c ../sys/share/unixtty.c ../sys/unix/unixmain.c \ ! ../sys/unix/unixunix.c ! SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o # # for Systos # SYSSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ --- 40,47 ---- # # 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 # # for Systos # SYSSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ *************** *** 117,127 **** # flags for Linux # compile normally ! # CFLAGS = -O2 -fomit-frame-pointer -I../include -I/usr/X11/include ! # LFLAGS = -L/usr/X11/lib # OR compile backwards compatible a.out format ! # CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include -I/usr/X11/include ! # LFLAGS = -b i486-linuxaout -L/usr/X11/lib # flags for BeOS # on a Mac/BeBox: --- 117,127 ---- # flags for Linux # compile normally ! # CFLAGS = -O2 -fomit-frame-pointer -I../include ! # LFLAGS = -L/usr/X11R6/lib # OR compile backwards compatible a.out format ! # CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include ! # LFLAGS = -b i486-linuxaout -L/usr/X11R6/lib # flags for BeOS # on a Mac/BeBox: *************** *** 175,182 **** # # Files for a Qt port # ! WINQTSRC = ../win/Qt/qt_win.cpp ../win/Qt/qt_clust.cpp ! WINQTOBJ = qt_win.o qt_clust.o tile.o # # Files for a Gnome port # --- 175,182 ---- # # Files for a Qt port # ! 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 Gnome port # *************** *** 191,198 **** # # Files for a Gem port WINGEMSRC = ../win/gem/wingem.c ../win/gem/wingem1.c ../win/gem/load_img.c \ ! tile.c ! WINGEMOBJ = wingem.o wingem1.o load_img.o tile.o # # Files for a BeOS InterfaceKit port -- not ready for prime time WINBESRC = --- 191,198 ---- # # 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 # # Files for a BeOS InterfaceKit port -- not ready for prime time WINBESRC = *************** *** 212,218 **** # Systos needs -lcurses16 if you use -mshort # AIX 3.1 on RS/6000 likes -lcurses if TERMINFO defined in unixconf.h # and -ltermcap otherwise ! # Linux uses -ltermcap or -lncurses # Be uses -ltermcap # # libraries for tty ports --- 212,218 ---- # Systos needs -lcurses16 if you use -mshort # AIX 3.1 on RS/6000 likes -lcurses if TERMINFO defined in unixconf.h # and -ltermcap otherwise ! # Linux uses -lncurses (newer) or -ltermcap (older) # Be uses -ltermcap # # libraries for tty ports *************** *** 305,312 **** 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 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 \ --- 305,313 ---- 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 \ *************** *** 320,326 **** SYSCSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ ../sys/share/pctty.c ../sys/share/pcunix.c ../sys/share/random.c \ ../sys/share/ioctl.c ../sys/share/unixtty.c ../sys/unix/unixmain.c \ ! ../sys/unix/unixunix.c ../sys/be/bemain.c # all windowing-system-dependent .c (for dependencies and such) WINCSRC = $(WINTTYSRC) $(WINX11SRC) $(WINGNOMESRC) $(WINGEMSRC) --- 321,330 ---- SYSCSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ ../sys/share/pctty.c ../sys/share/pcunix.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 ! ! # generated source files (tile.c is handled separately via WINxxxSRC) ! GENCSRC = monstr.c vis_tab.c #tile.c # all windowing-system-dependent .c (for dependencies and such) WINCSRC = $(WINTTYSRC) $(WINX11SRC) $(WINGNOMESRC) $(WINGEMSRC) *************** *** 328,337 **** WINCXXSRC = $(WINQTSRC) $(WINBESRC) # .c files for this version (for date.h) ! VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) monstr.c vis_tab.c # .c files for all versions using this Makefile (for lint and tags) ! CSOURCES = $(HACKCSRC) $(SYSSRC) $(WINCSRC) monstr.c vis_tab.c # all .h files except date.h, onames.h, pm.h, and vis_tab.h which would --- 332,341 ---- WINCXXSRC = $(WINQTSRC) $(WINBESRC) # .c files for this version (for date.h) ! VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(GENCSRC) # .c files for all versions using this Makefile (for lint and tags) ! CSOURCES = $(HACKCSRC) $(SYSSRC) $(WINCSRC) $(GENCSRC) # all .h files except date.h, onames.h, pm.h, and vis_tab.h which would *************** *** 358,365 **** 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 light.o lock.o \ ! mail.o makemon.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 monstr.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 \ --- 362,370 ---- 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 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 monstr.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 \ *************** *** 450,455 **** --- 455,463 ---- qt_win.moc: ../include/qt_win.h $(QTDIR)/bin/moc ../include/qt_win.h > qt_win.moc + qttableview.moc: ../include/qttableview.h + $(QTDIR)/bin/moc ../include/qttableview.h > qttableview.moc + $(MAKEDEFS): ../util/makedefs.c $(CONFIG_H) ../include/permonst.h \ ../include/objclass.h ../include/monsym.h \ ../include/artilist.h ../include/dungeon.h ../include/obj.h \ *************** *** 465,472 **** @( cd ../util ; $(MAKE) ../src/monstr.c ) ../include/vis_tab.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/vis_tab.h ) ! vis_tab.c: $(MAKEDEFS) ! @( cd ../util ; $(MAKE) ../src/vis_tab.c ) tile.c: ../win/share/tilemap.c $(HACK_H) @( cd ../util ; $(MAKE) ../src/tile.c ) --- 473,480 ---- @( cd ../util ; $(MAKE) ../src/monstr.c ) ../include/vis_tab.h: $(MAKEDEFS) @( 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 tile.c: ../win/share/tilemap.c $(HACK_H) @( cd ../util ; $(MAKE) ../src/tile.c ) *************** *** 510,517 **** -rm -f ../win/gnome/gn_rip.h ! depend: ../sys/unix/depend.awk $(SYSCSRC) $(WINCSRC) $(WINCXXSRC) $(HACKCSRC) ! $(AWK) -f ../sys/unix/depend.awk ../include/*.h $(SYSCSRC) $(WINCSRC) $(WINCXXSRC) $(HACKCSRC) >makedep @echo '/^# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT/+2,$$d' >eddep @echo '$$r makedep' >>eddep @echo 'w' >>eddep --- 518,527 ---- -rm -f ../win/gnome/gn_rip.h ! depend: ../sys/unix/depend.awk \ ! $(SYSCSRC) $(WINCSRC) $(WINCXXSRC) $(GENCSRC) $(HACKCSRC) ! $(AWK) -f ../sys/unix/depend.awk ../include/*.h \ ! $(SYSCSRC) $(WINCSRC) $(WINCXXSRC) $(GENCSRC) $(HACKCSRC) >makedep @echo '/^# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT/+2,$$d' >eddep @echo '$$r makedep' >>eddep @echo 'w' >>eddep *************** *** 571,576 **** --- 581,588 ---- $(CC) $(CFLAGS) -c ../sys/unix/unixmain.c unixunix.o: ../sys/unix/unixunix.c $(HACK_H) $(CC) $(CFLAGS) -c ../sys/unix/unixunix.c + unixres.o: ../sys/unix/unixres.c $(CONFIG_H) + $(CC) $(CFLAGS) -c ../sys/unix/unixres.c bemain.o: ../sys/be/bemain.c $(HACK_H) ../include/dlb.h $(CC) $(CFLAGS) -c ../sys/be/bemain.c getline.o: ../win/tty/getline.c $(HACK_H) ../include/func_tab.h *************** *** 614,620 **** 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) -c ../win/gnome/gnbind.c ! gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../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) \ --- 626,632 ---- 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) -c ../win/gnome/gnbind.c ! gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h ../include/tile2x11.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../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) \ *************** *** 654,667 **** $(CC) $(CFLAGS) -c ../win/gem/wingem1.c load_img.o: ../win/gem/load_img.c ../include/load_img.h $(CC) $(CFLAGS) -c ../win/gem/load_img.c tile.o: tile.c $(HACK_H) qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) ../include/func_tab.h \ ! ../include/dlb.h ../include/patchlevel.h ../include/qt_win.h \ ! ../include/qt_clust.h ../include/qt_kde0.h \ ! ../include/qt_xpms.h qt_win.moc qt_kde0.moc $(CXX) $(CXXFLAGS) -c ../win/Qt/qt_win.cpp qt_clust.o: ../win/Qt/qt_clust.cpp ../include/qt_clust.h $(CXX) $(CXXFLAGS) -c ../win/Qt/qt_clust.cpp allmain.o: allmain.c $(HACK_H) alloc.o: alloc.c $(CONFIG_H) apply.o: apply.c $(HACK_H) ../include/edog.h --- 666,685 ---- $(CC) $(CFLAGS) -c ../win/gem/wingem1.c load_img.o: ../win/gem/load_img.c ../include/load_img.h $(CC) $(CFLAGS) -c ../win/gem/load_img.c + gr_rect.o: ../win/gem/gr_rect.c + $(CC) $(CFLAGS) -c ../win/gem/gr_rect.c tile.o: tile.c $(HACK_H) 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 ../win/Qt/qt_win.cpp qt_clust.o: ../win/Qt/qt_clust.cpp ../include/qt_clust.h $(CXX) $(CXXFLAGS) -c ../win/Qt/qt_clust.cpp + qttableview.o: ../win/Qt/qttableview.cpp ../include/qttableview.h + $(CXX) $(CXXFLAGS) -c ../win/Qt/qttableview.cpp + monstr.o: monstr.c $(CONFIG_H) + 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) ../include/edog.h *************** *** 702,707 **** --- 720,726 ---- mail.o: mail.c $(HACK_H) ../include/mail.h makemon.o: makemon.c $(HACK_H) ../include/epri.h ../include/emin.h \ ../include/edog.h + mapglyph.o: mapglyph.c $(HACK_H) mcastu.o: mcastu.c $(HACK_H) mhitm.o: mhitm.c $(HACK_H) ../include/artifact.h ../include/edog.h mhitu.o: mhitu.c $(HACK_H) ../include/artifact.h ../include/edog.h *************** *** 730,736 **** $(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) ../include/epri.h polyself.o: polyself.c $(HACK_H) potion.o: potion.c $(HACK_H) pray.o: pray.c $(HACK_H) ../include/epri.h --- 749,755 ---- $(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) ../include/epri.h ../include/edog.h polyself.o: polyself.c $(HACK_H) potion.o: potion.c $(HACK_H) pray.o: pray.c $(HACK_H) ../include/epri.h *************** *** 740,746 **** 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) restore.o: restore.c $(HACK_H) ../include/lev.h ../include/tcap.h rip.o: rip.c $(HACK_H) rnd.o: rnd.c $(HACK_H) --- 759,765 ---- 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) *** nethack-3.3.1/sys/unix/Makefile.top Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/Makefile.top Thu Mar 21 07:37:43 2002 *************** *** 1,5 **** # NetHack Makefile. ! # SCCS Id: @(#)Makefile.top 3.3 95/01/05 # newer makes predefine $(MAKE) to 'make' and do smarter processing of # recursive make calls if $(MAKE) is used --- 1,5 ---- # NetHack Makefile. ! # SCCS Id: @(#)Makefile.top 3.4 1995/01/05 # newer makes predefine $(MAKE) to 'make' and do smarter processing of # recursive make calls if $(MAKE) is used *************** *** 44,50 **** # VARDATND = x11tiles pet_mark.xbm # VARDATND = x11tiles pet_mark.xbm rip.xpm # for Atari/Gem ! # VARDATND = nh16.img title.img GEM_RSC.RSC # for BeOS # VARDATND = beostiles # for Gnome --- 44,50 ---- # VARDATND = x11tiles pet_mark.xbm # VARDATND = x11tiles pet_mark.xbm rip.xpm # for Atari/Gem ! # VARDATND = nh16.img title.img GEM_RSC.RSC rip.img # for BeOS # VARDATND = beostiles # for Gnome *************** *** 90,131 **** all: $(GAME) Guidebook $(VARDAT) dungeon spec_levs check-dlb @echo "Done." Guidebook: ( cd doc ; $(MAKE) Guidebook ) manpages: ( cd doc ; $(MAKE) manpages ) ! data: ( cd dat ; $(MAKE) data ) ! rumors: ( cd dat ; $(MAKE) rumors ) ! oracles: ( cd dat ; $(MAKE) oracles ) # Note: options should have already been made with make, but... ! options: ( cd dat ; $(MAKE) options ) ! quest.dat: ( cd dat ; $(MAKE) quest.dat ) ! spec_levs: ( cd util ; $(MAKE) lev_comp ) ( cd dat ; $(MAKE) spec_levs ) ( cd dat ; $(MAKE) quest_levs ) ! dungeon: ( cd util ; $(MAKE) dgn_comp ) ( cd dat ; $(MAKE) dungeon ) ! x11tiles: ( cd util ; $(MAKE) tile2x11 ) ( cd dat ; $(MAKE) x11tiles ) ! beostiles: ( cd util ; $(MAKE) tile2beos ) ( cd dat ; $(MAKE) beostiles ) --- 90,134 ---- all: $(GAME) Guidebook $(VARDAT) dungeon spec_levs check-dlb @echo "Done." + # Note: many of the dependencies below are here to allow parallel make + # to generate valid output + Guidebook: ( cd doc ; $(MAKE) Guidebook ) manpages: ( cd doc ; $(MAKE) manpages ) ! data: $(GAME) ( cd dat ; $(MAKE) data ) ! rumors: $(GAME) ( cd dat ; $(MAKE) rumors ) ! oracles: $(GAME) ( cd dat ; $(MAKE) oracles ) # Note: options should have already been made with make, but... ! options: $(GAME) ( cd dat ; $(MAKE) options ) ! quest.dat: $(GAME) ( cd dat ; $(MAKE) quest.dat ) ! spec_levs: dungeon ( cd util ; $(MAKE) lev_comp ) ( cd dat ; $(MAKE) spec_levs ) ( cd dat ; $(MAKE) quest_levs ) ! dungeon: $(GAME) ( cd util ; $(MAKE) dgn_comp ) ( cd dat ; $(MAKE) dungeon ) ! x11tiles: $(GAME) ( cd util ; $(MAKE) tile2x11 ) ( cd dat ; $(MAKE) x11tiles ) ! beostiles: $(GAME) ( cd util ; $(MAKE) tile2beos ) ( cd dat ; $(MAKE) beostiles ) *************** *** 138,155 **** mapbg.xpm: (cd dat ; $(MAKE) mapbg.xpm ) ! nh16.img: ( cd util ; $(MAKE) tile2img.ttp ) ( cd dat ; $(MAKE) nh16.img ) GEM_RSC.RSC: ( cd dat ; $(MAKE) GEM_RSC.RSC ) title.img: ( cd dat ; $(MAKE) title.img ) ! check-dlb: ! ( cd dat; $(MAKE) options ) @if egrep -s librarian dat/options ; then $(MAKE) dlb ; else true ; fi dlb: --- 141,163 ---- mapbg.xpm: (cd dat ; $(MAKE) mapbg.xpm ) ! nhsplash.xpm: ! ( cd dat ; $(MAKE) nhsplash.xpm ) ! ! nh16.img: $(GAME) ( cd util ; $(MAKE) tile2img.ttp ) ( cd dat ; $(MAKE) nh16.img ) + rip.img: + ( cd util ; $(MAKE) xpm2img.ttp ) + ( cd dat ; $(MAKE) rip.img ) GEM_RSC.RSC: ( cd dat ; $(MAKE) GEM_RSC.RSC ) title.img: ( cd dat ; $(MAKE) title.img ) ! check-dlb: options @if egrep -s librarian dat/options ; then $(MAKE) dlb ; else true ; fi dlb: *** nethack-3.3.1/sys/unix/Makefile.utl Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/Makefile.utl Thu Mar 21 07:37:43 2002 *************** *** 1,5 **** # Makefile for NetHack's utility programs. ! # SCCS Id: @(#)Makefile.utl 3.3 97/04/19 # newer makes predefine $(MAKE) to 'make' and do smarter processing of # recursive make calls if $(MAKE) is used --- 1,5 ---- # Makefile for NetHack's utility programs. ! # SCCS Id: @(#)Makefile.utl 3.4 1997/04/19 # newer makes predefine $(MAKE) to 'make' and do smarter processing of # recursive make calls if $(MAKE) is used *************** *** 72,82 **** # flags for Linux # compile normally ! # CFLAGS = -O2 -fomit-frame-pointer -I../include -I/usr/X11/include ! # LFLAGS = -L/usr/X11/lib # OR compile backwards compatible a.out format ! # CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include -I/usr/X11/include ! # LFLAGS = -b i486-linuxaout -L/usr/X11/lib # flags for BeOS using the command line # remember to uncomment flex and bison below --- 72,82 ---- # flags for Linux # compile normally ! # CFLAGS = -O2 -fomit-frame-pointer -I../include ! # LFLAGS = -L/usr/X11R6/lib # OR compile backwards compatible a.out format ! # CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include ! # LFLAGS = -b i486-linuxaout -L/usr/X11R6/lib # flags for BeOS using the command line # remember to uncomment flex and bison below *************** *** 187,194 **** ./makedefs -m ../include/vis_tab.h: makedefs ./makedefs -z ! ../src/vis_tab.c: makedefs ! ./makedefs -z lintdefs: @lint -axbh -I../include -DLINT $(MAKESRC) $(CMONOBJ) | sed '/_flsbuf/d' --- 187,194 ---- ./makedefs -m ../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' *************** *** 304,309 **** --- 304,311 ---- tile2img.ttp: tile2img.o bitmfile.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2img.ttp tile2img.o bitmfile.o $(TEXT_IO) $(LIBS) + xpm2img.ttp: xpm2img.o bitmfile.o + $(CC) $(LFLAGS) -o xpm2img.ttp xpm2img.o bitmfile.o $(LIBS) tile2beos: tile2beos.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2beos tile2beos.o $(TEXT_IO) -lbe *************** *** 332,337 **** --- 334,341 ---- tile2img.o: ../win/gem/tile2img.c $(HACK_H) ../include/tile.h \ ../include/bitmfile.h $(CC) $(CFLAGS) -c ../win/gem/tile2img.c + xpm2img.o: ../win/gem/xpm2img.c $(HACK_H) ../include/bitmfile.h + $(CC) $(CFLAGS) -c ../win/gem/xpm2img.c bitmfile.o: ../win/gem/bitmfile.c ../include/bitmfile.h $(CC) $(CFLAGS) -c ../win/gem/bitmfile.c *************** *** 381,384 **** -rm -f ../include/lev_comp.h ../include/dgn_comp.h -rm -f ../include/tile.h -rm -f makedefs lev_comp dgn_comp recover dlb ! -rm -f gif2txt txt2ppm tile2x11 tile2img.ttp tilemap --- 385,388 ---- -rm -f ../include/lev_comp.h ../include/dgn_comp.h -rm -f ../include/tile.h -rm -f makedefs lev_comp dgn_comp recover dlb ! -rm -f gif2txt txt2ppm tile2x11 tile2img.ttp xpm2img.ttp tilemap *** nethack-3.3.1/sys/unix/nethack.sh Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/nethack.sh Thu Mar 21 07:37:43 2002 *************** *** 1,5 **** #!/bin/sh ! # SCCS Id: @(#)nethack.sh 3.3 90/02/26 HACKDIR=/usr/games/lib/nethackdir export HACKDIR --- 1,5 ---- #!/bin/sh ! # SCCS Id: @(#)nethack.sh 3.4 1990/02/26 HACKDIR=/usr/games/lib/nethackdir export HACKDIR *** nethack-3.3.1/sys/unix/unixmain.c Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/unixmain.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)unixmain.c 3.3 97/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)unixmain.c 3.4 1997/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 55,60 **** --- 55,89 ---- #endif boolean exact_username; + #if defined(__APPLE__) + /* special hack to change working directory to a resource fork when + running from finder --sam */ + #define MAC_PATH_VALUE ".app/Contents/MacOS/" + char mac_cwd[1024], *mac_exe = argv[0], *mac_tmp; + int arg0_len = strlen(mac_exe), mac_tmp_len, mac_lhs_len=0; + getcwd(mac_cwd, 1024); + if(mac_exe[0] == '/' && !strcmp(mac_cwd, "/")) { + if((mac_exe = strrchr(mac_exe, '/'))) + mac_exe++; + else + mac_exe = argv[0]; + mac_tmp_len = (strlen(mac_exe) * 2) + strlen(MAC_PATH_VALUE); + if(mac_tmp_len <= arg0_len) { + mac_tmp = malloc(mac_tmp_len + 1); + sprintf(mac_tmp, "%s%s%s", mac_exe, MAC_PATH_VALUE, mac_exe); + if(!strcmp(argv[0] + (arg0_len - mac_tmp_len), mac_tmp)) { + mac_lhs_len = (arg0_len - mac_tmp_len) + strlen(mac_exe) + 5; + if(mac_lhs_len > mac_tmp_len - 1) + mac_tmp = realloc(mac_tmp, mac_lhs_len); + strncpy(mac_tmp, argv[0], mac_lhs_len); + mac_tmp[mac_lhs_len] = '\0'; + chdir(mac_tmp); + } + free(mac_tmp); + } + } + #endif + hname = argv[0]; hackpid = getpid(); (void) umask(0777 & ~FCMASK); *************** *** 107,119 **** } /* - * Find the creation date of this game, - * so as to avoid restoring outdated savefiles. - */ - gethdate(hname); - - /* - * We cannot do chdir earlier, otherwise gethdate will fail. * Change directories before we initialize the window system so * we can find the tile file. */ --- 136,141 ---- *************** *** 363,368 **** --- 385,393 ---- flags.initrace = i; } break; + case '@': + flags.randomall = 1; + break; default: if ((i = str2role(&argv[0][1])) >= 0) { flags.initrole = i; *************** *** 491,494 **** --- 516,540 ---- if (discover) You("are in non-scoring discovery mode."); } + + /* + * Add a slash to any name not ending in /. 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 = '\0'; + } + return; + } + /*unixmain.c*/ *** nethack-3.3.1/sys/unix/unixunix.c Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/unix/unixunix.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)unixunix.c 3.3 94/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)unixunix.c 3.4 1994/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 22,112 **** extern void NDECL(linux_mapoff); #endif ! static struct stat buf, hbuf; ! ! void ! gethdate(name) ! const char *name; ! { ! /* old version - for people short of space ! * ! * register char *np; ! * if(stat(name, &hbuf)) ! * error("Cannot get status of %s.", ! * (np = rindex(name, '/')) ? np+1 : name); ! */ ! /* version using PATH from: seismo!gregc@ucsf-cgl.ARPA (Greg Couch) */ ! ! /* ! * The problem with #include is that this include file ! * does not exist on all systems, and moreover, that it sometimes includes ! * again, so that the compiler sees these typedefs twice. ! */ ! #define MAXPATHLEN 1024 ! ! register const char *np, *path; ! char filename[MAXPATHLEN+1]; ! int pathlen; ! ! if (index(name, '/') != (char *)0 || ! (path = getenv("PATH")) == (char *)0) ! path = ""; ! ! for (;;) { ! if ((np = index(path, ':')) == (char *)0) ! np = path + strlen(path); /* point to end str */ ! pathlen = np - path; ! if (pathlen > MAXPATHLEN) ! pathlen = MAXPATHLEN; ! if (pathlen <= 1) { /* %% */ ! (void) strncpy(filename, name, MAXPATHLEN); ! } else { ! (void) strncpy(filename, path, pathlen); ! filename[pathlen] = '/'; ! (void) strncpy(filename + pathlen + 1, name, ! (MAXPATHLEN - 1) - pathlen); ! } ! filename[MAXPATHLEN] = '\0'; ! if (stat(filename, &hbuf) == 0) ! return; ! if (*np == '\0') ! break; ! path = np + 1; ! } ! if (strlen(name) > BUFSZ/2) ! name = name + strlen(name) - BUFSZ/2; ! #if defined(BOS) && defined(NHSTDC) ! /* ! * This one is really **STUPID**. I don't know why it's happening ! * as similar constructs work elsewhere, but... ! */ ! if((np = rindex(name, '/'))) ! error("Cannot get status of %s.", np+1); ! else error("Cannot get status of %s.", name); ! #else ! error("Cannot get status of %s.", ! (np = rindex(name, '/')) ? np+1 : name); ! #endif ! } ! ! #if 0 ! int ! uptodate(fd) ! int fd; ! { ! if(fstat(fd, &buf)) { ! pline("Cannot get status of saved level? "); ! wait_synch(); ! return(0); ! } ! if(buf.st_mtime < hbuf.st_mtime) { ! pline("Saved level is out of date. "); ! wait_synch(); ! return(0); ! } ! return(1); ! } ! #endif /* see whether we should throw away this xlock file */ static int --- 22,28 ---- extern void NDECL(linux_mapoff); #endif ! static struct stat buf; /* see whether we should throw away this xlock file */ static int *************** *** 368,370 **** --- 284,335 ---- return(0); } #endif + + #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); + + int + (getresuid)(ruid, euid, suid) + uid_t *ruid, *euid, *suid; + { + return nh_getresuid(ruid, euid, suid); + } + + uid_t + (getuid)() + { + return nh_getuid(); + } + + uid_t + (geteuid)() + { + return nh_geteuid(); + } + + int + (getresgid)(rgid, egid, sgid) + gid_t *rgid, *egid, *sgid; + { + return nh_getresgid(rgid, egid, sgid); + } + + gid_t + (getgid)() + { + return nh_getgid(); + } + + gid_t + (getegid)() + { + return nh_getegid(); + } + + #endif /* GETRES_SUPPORT */ *** nethack-3.3.1/sys/vms/Install.vms Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/vms/Install.vms Thu Mar 21 07:37:44 2002 *************** *** 1,21 **** ! Instructions for Installing NetHack 3.3.1 on a VMS system ========================================= 0. Please read this entire file before trying to build or install NetHack, then read it again! ! 1. Building NetHack requires a C compiler (either VAX C, DEC C, or GNU C) ! and VMS version V4.6 or later (but see note #9). This release has been ! tested on VAX/VMS V5.5-2 and V6.2, and Alpha/VMS V6.2 and V7.1. The ! build procedure (vmsbuild.com) should not need to be modified; it accepts an option for selecting the compiler, and it can detect different versions which might require specific command qualifiers. Versions of VAXC earlier than V2.3 will produce many warning messages (about 200 per source file; over to 25,000 total!), but NetHack has been verified to compile, link, and execute correctly when built with VAXC ! V2.2 using vmsbuild.com. There is also a set of Makefiles suitable ! for use with MMS; they may or may not work with other make utilities. 2. Make sure all the NetHack files are in the appropriate directory structure. You should set up a directory--referred to as "top" below --- 1,22 ---- ! Instructions for Installing NetHack 3.4.0 on a VMS system ========================================= 0. Please read this entire file before trying to build or install NetHack, then read it again! ! 1. Building NetHack requires a C compiler (either Compaq C, DEC C, ! VAX C, or GNU C) and VMS version V4.6 or later (but see note #9). ! This release has been tested with Compaq C V6.4 on Alpha/VMS V7.1 ! and with VAX C V3.2 and GNU C 2.7.1 on VAX/VMS V5.5-2. The build ! procedure (vmsbuild.com) should not need to be modified; it accepts an option for selecting the compiler, and it can detect different versions which might require specific command qualifiers. Versions of VAXC earlier than V2.3 will produce many warning messages (about 200 per source file; over to 25,000 total!), but NetHack has been verified to compile, link, and execute correctly when built with VAXC ! V2.2 using vmsbuild.com. There is also a set of Makefiles suitable for ! use with MMS or MMK; they may or may not work with other make utilities. 2. Make sure all the NetHack files are in the appropriate directory structure. You should set up a directory--referred to as "top" below *************** *** 35,47 **** The following subdirectories may be present, but are not useful for building NetHack on VMS and are not required: [.sys .amiga] -- AmigaDOS - [.sys .amiga .splitter] [.sys .atari] -- Atari TOS [.sys .be] -- BeBox BeOS [.sys .mac] -- Macintosh - [.sys .mac .old] [.sys .msdos] -- MSDOS for IBM PCs and compatibles - [.sys .msdos .old] [.sys .os2] -- OS/2 [.sys .share .sounds] -- AIFF format audio files [.sys .unix] -- guess :-) --- 36,45 ---- *************** *** 139,145 **** Notes: 1. Save files and bones files from earlier versions will not work with ! 3.3.1. The scoreboard file (RECORD) from 3.3.0 will work; one from version 3.2.x is slightly different format but should be compatible. 2. To specify user-preference options in your environment, define the --- 137,143 ---- Notes: 1. Save files and bones files from earlier versions will not work with ! 3.4.0. The scoreboard file (RECORD) from 3.3.x will work; one from version 3.2.x is slightly different format but should be compatible. 2. To specify user-preference options in your environment, define the *************** *** 155,161 **** 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 3.3.1 or 3.2.x behave more like 3.1.3. If logical name or DCL symbol NETHACKOPTIONS is not defined, NetHack will try HACKOPTIONS instead. Regardless of whether or not either --- 153,159 ---- 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 *** nethack-3.3.1/sys/vms/lev_lex.h Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/lev_lex.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)lev_lex.h 3.3 1999/08/08 */ /* "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 --- 1,4 ---- ! /* SCCS Id: @(#)lev_lex.h 3.4 1999/08/08 */ /* "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 *** nethack-3.3.1/sys/vms/Makefile.dat Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/vms/Makefile.dat Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** # NetHack Makefile (VMS) - data files: special levels and other data. ! # SCCS Id: @(#)Makefile.dat 3.3 1999/03/19 # Copy this file to [.dat]Makefile.; no editing needed. --- 1,5 ---- # NetHack Makefile (VMS) - data files: special levels and other data. ! # SCCS Id: @(#)Makefile.dat 3.4 2002/03/02 # Copy this file to [.dat]Makefile.; no editing needed. *************** *** 20,25 **** --- 20,26 ---- 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; *************** *** 56,82 **** x11tiles : $(X11TILES) @ $(NOOP) ! $(MAKEDEFS) : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(MAKEDEFS) @ $(CD) $(DAT) ! $(DGNCOMP) : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(DGNCOMP) @ $(CD) $(DAT) ! $(LEVCOMP) : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(LEVCOMP) @ $(CD) $(DAT) ! $(DLB) : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(DLB) @ $(CD) $(DAT) ! $(TILE2X11) : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(TILE2X11) @ $(CD) $(DAT) --- 57,83 ---- x11tiles : $(X11TILES) @ $(NOOP) ! $(MAKEDEFS) : $(UTILMARKER) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(MAKEDEFS) @ $(CD) $(DAT) ! $(DGNCOMP) : $(UTILMARKER) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(DGNCOMP) @ $(CD) $(DAT) ! $(LEVCOMP) : $(UTILMARKER) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(LEVCOMP) @ $(CD) $(DAT) ! $(DLB) : $(UTILMARKER) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(DLB) @ $(CD) $(DAT) ! $(TILE2X11) : $(UTILMARKER) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(TILE2X11) @ $(CD) $(DAT) *** nethack-3.3.1/sys/vms/Makefile.doc Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/vms/Makefile.doc Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** # NetHack Makefile (VMS) - for the [Unix] documentation. ! # SCCS Id: @(#)Makefile.doc 3.3 1993/01/06 # Copy this file to [.doc]Makefile. and edit it if needed. --- 1,5 ---- # NetHack Makefile (VMS) - for the [Unix] documentation. ! # SCCS Id: @(#)Makefile.doc 3.4 1993/01/06 # Copy this file to [.doc]Makefile. and edit it if needed. *** nethack-3.3.1/sys/vms/Makefile.src Thu Feb 14 07:59:36 2002 --- nethack-3.4.0/sys/vms/Makefile.src Thu Mar 21 07:37:44 2002 *************** *** 1,7 **** # NetHack Makefile (VMS) - for building nethack itself. ! # SCCS Id: @(#)Makefile.src 3.3 2000/08/05 # Copy this file to [.src]Makefile. and then edit it as needed. # If you changed CC or CFLAGS, make similar changes in [.util]Makefile. # # Note: modifying this Makefile will cause crtl.opt to be rebuilt, --- 1,8 ---- # NetHack Makefile (VMS) - for building nethack itself. ! # SCCS Id: @(#)Makefile.src 3.4 2002/03/02 # Copy this file to [.src]Makefile. and then edit it as needed. + # The default configuration is for building with DEC C (aka Compaq C). # If you changed CC or CFLAGS, make similar changes in [.util]Makefile. # # Note: modifying this Makefile will cause crtl.opt to be rebuilt, *************** *** 32,47 **** # set option flags for C compiler and linker # ! #CFLAGS = /Debug/noOptimize/Include=$(INC) ! CFLAGS = /Include=$(INC)/noList # VAXC or GNUC ! #CFLAGS = /Prefix=All/Incl=$(INC)/noList # DECC in native mode #LFLAGS = /Debug/Map/Cross_Ref # for development #LFLAGS = /noTraceback/noMap # for installing w/ privs LFLAGS = /noMap LINK = link ! LIBS = sys$share:vaxcrtl.exe/Shareable ! #LIBS = # blank for DECC MORELIBS = # GCC needs an extra library #MORELIBS = gnu_cc:[000000]gcclib.olb/Library --- 33,47 ---- # 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 #LFLAGS = /Debug/Map/Cross_Ref # for development #LFLAGS = /noTraceback/noMap # for installing w/ privs LFLAGS = /noMap LINK = link ! LIBS = # blank for DECC ! #LIBS = sys$share:vaxcrtl.exe/Shareable # VAX C or GNU C MORELIBS = # GCC needs an extra library #MORELIBS = gnu_cc:[000000]gcclib.olb/Library *************** *** 91,97 **** # and config.h # note: no trailing whitespace (or comment) after version or patchlevel numbers ! VERSION =3.3 PATCHLVL =0 MAKEDEFS = $(UTL)makedefs.exe; --- 91,97 ---- # and config.h # note: no trailing whitespace (or comment) after version or patchlevel numbers ! VERSION =3.4 PATCHLVL =0 MAKEDEFS = $(UTL)makedefs.exe; *************** *** 107,113 **** 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 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 \ --- 107,113 ---- 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 \ *************** *** 117,124 **** 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 # .c files for this version (for date.h) ! VERSOURCES = $(HACKCSRC) $(SYSSRC) $(WINSRC) $(RANDSRC) monstr.c vis_tab.c # all .h files except date.h, onames.h, pm.h, and vis_tab.h which would # cause dependency loops if run through "make depend" --- 117,127 ---- 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 = monstr.c vis_tab.c #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 # cause dependency loops if run through "make depend" *************** *** 147,156 **** 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,mcastu.obj,mhitm.obj, \ ! mhitu.obj,minion.obj,mklev.obj,mkmap.obj,mkmaze.obj,mkobj.obj, \ ! mkroom.obj,mon.obj,mondata.obj,monmove.obj,monstr.obj,mplayer.obj ! HOBJ4 = 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, \ --- 150,159 ---- 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, \ ! mhitm.obj,mhitu.obj,minion.obj,mklev.obj,mkmap.obj,mkmaze.obj, \ ! mkobj.obj,mkroom.obj,mon.obj,mondata.obj,monmove.obj,monstr.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, \ *************** *** 312,318 **** # VMS-specific code vmsmain.obj : $(VMS)vmsmain.c $(HACK_H) $(INC)dlb.h vmstty.obj : $(VMS)vmstty.c $(HACK_H) $(INC)wintty.h $(INC)tcap.h ! vmsunix.obj : $(VMS)vmsunix.c $(HACK_H) $(INC)date.h vmsmisc.obj : $(VMS)vmsmisc.c $(VMS)oldcrtl.c vmsfiles.obj : $(VMS)vmsfiles.c $(CONFIG_H) vmsmail.obj : $(VMS)vmsmail.c $(CONFIG_H) $(INC)mail.h \ --- 315,321 ---- # VMS-specific code vmsmain.obj : $(VMS)vmsmain.c $(HACK_H) $(INC)dlb.h vmstty.obj : $(VMS)vmstty.c $(HACK_H) $(INC)wintty.h $(INC)tcap.h ! vmsunix.obj : $(VMS)vmsunix.c $(HACK_H) vmsmisc.obj : $(VMS)vmsmisc.c $(VMS)oldcrtl.c vmsfiles.obj : $(VMS)vmsfiles.c $(CONFIG_H) vmsmail.obj : $(VMS)vmsmail.c $(CONFIG_H) $(INC)mail.h \ *************** *** 343,348 **** --- 346,353 ---- wintext.obj : $(X11)wintext.c $(HACK_H) $(INC)winX.h $(INC)xwindow.h winval.obj : $(X11)winval.c $(CONFIG_H) $(INC)winX.h tile.obj : $(SRC)tile.c $(HACK_H) + monstr.obj : monstr.c $(CONFIG_H) + vis_tab.obj : vis_tab.c $(CONFIG_H) $(INC)vis_tab.h # general code allmain.obj : allmain.c $(HACK_H) alloc.obj : alloc.c $(CONFIG_H) *************** *** 383,388 **** --- 388,394 ---- lock.obj : lock.c $(HACK_H) mail.obj : mail.c $(HACK_H) $(INC)mail.h makemon.obj : makemon.c $(HACK_H) $(INC)epri.h $(INC)emin.h $(INC)edog.h + mapglyph.obj : mapglyph.c $(HACK_H) mcastu.obj : mcastu.c $(HACK_H) mhitm.obj : mhitm.c $(HACK_H) $(INC)artifact.h $(INC)edog.h mhitu.obj : mhitu.c $(HACK_H) $(INC)artifact.h $(INC)edog.h *************** *** 411,417 **** $(HACK_H) $(INC)tcap.h pager.obj : pager.c $(HACK_H) $(INC)dlb.h pickup.obj : pickup.c $(HACK_H) ! pline.obj : pline.c $(HACK_H) $(INC)epri.h polyself.obj : polyself.c $(HACK_H) potion.obj : potion.c $(HACK_H) pray.obj : pray.c $(HACK_H) $(INC)epri.h --- 417,423 ---- $(HACK_H) $(INC)tcap.h pager.obj : pager.c $(HACK_H) $(INC)dlb.h pickup.obj : pickup.c $(HACK_H) ! pline.obj : pline.c $(HACK_H) $(INC)epri.h $(INC)edog.h polyself.obj : polyself.c $(HACK_H) potion.obj : potion.c $(HACK_H) pray.obj : pray.c $(HACK_H) $(INC)epri.h *************** *** 421,427 **** questpgr.obj : questpgr.c $(HACK_H) $(INC)dlb.h $(INC)qtext.h read.obj : read.c $(HACK_H) rect.obj : rect.c $(HACK_H) ! region.obj : region.c $(HACK_H) restore.obj : restore.c $(HACK_H) $(INC)lev.h $(INC)tcap.h rip.obj : rip.c $(HACK_H) rnd.obj : rnd.c $(HACK_H) --- 427,433 ---- questpgr.obj : questpgr.c $(HACK_H) $(INC)dlb.h $(INC)qtext.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 rip.obj : rip.c $(HACK_H) rnd.obj : rnd.c $(HACK_H) *** nethack-3.3.1/sys/vms/Makefile.top Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/Makefile.top Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** # NetHack Makefile (VMS) - top level for making & installing everything. ! # SCCS Id: @(#)Makefile.top 3.3 96/03/02 # Copy this file to Makefile.; edit the appropriate values for # GAMEDIR ("playground" location) and GAMEOWNER (UIC or identifier --- 1,5 ---- # NetHack Makefile (VMS) - top level for making & installing everything. ! # SCCS Id: @(#)Makefile.top 3.4 1996/03/02 # Copy this file to Makefile.; edit the appropriate values for # GAMEDIR ("playground" location) and GAMEOWNER (UIC or identifier *** nethack-3.3.1/sys/vms/Makefile.utl Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/Makefile.utl Thu Mar 21 07:37:44 2002 *************** *** 1,13 **** # NetHack Makefile (VMS) - for utility programs. ! # SCCS Id: @(#)Makefile.utl 3.3 2000/08/05 # Copy this file to [.util]Makefile. and then edit it as needed. # Settings for CC and CFLAGS ought to match the ones used in [.src]Makefile. MAKE = $(MMS) CD = set default ECHO = write sys$output ! MOVE = rename/New # within save device only MUNG = search/Exact/Match=NOR # to strip bogus #module directives NOOP = continue RM = delete/noConfirm --- 1,14 ---- # NetHack Makefile (VMS) - for utility programs. ! # SCCS Id: @(#)Makefile.utl 3.4 2002/03/02 # Copy this file to [.util]Makefile. and then edit it as needed. + # The default configuration is for building with DEC C (aka Compaq C). # Settings for CC and CFLAGS ought to match the ones used in [.src]Makefile. MAKE = $(MMS) CD = set default ECHO = write sys$output ! MOVE = rename/New # within same device only MUNG = search/Exact/Match=NOR # to strip bogus #module directives NOOP = continue RM = delete/noConfirm *************** *** 28,40 **** DGNCOMP = $(UTL)dgn_comp.exe; DLB = $(UTL)dlb.exe; RECOVER = $(UTL)recover.exe; # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment # CC = gcc ! CFLAGS = /Include=$(INC)/noList # VAXC or GNUC ! #CFLAGS = /Prefix=All/Incl=$(INC)/noList # DECC in native mode LFLAGS = /noMap LIBS = $(SRC)crtl.opt/Options # run-time library(s) needed LINK = link --- 29,43 ---- DGNCOMP = $(UTL)dgn_comp.exe; DLB = $(UTL)dlb.exe; RECOVER = $(UTL)recover.exe; + # used by $(DAT)Makefile for synchronization + MARKER = $(UTL)util.timestamp; # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment # CC = gcc ! CFLAGS = /Prefix=All/Incl=$(INC)/noList # DECC in native mode ! #CFLAGS = /Include=$(INC)/noList # VAXC or GNUC LFLAGS = /noMap LIBS = $(SRC)crtl.opt/Options # run-time library(s) needed LINK = link *************** *** 153,158 **** --- 156,162 ---- # $(MAKEDEFS) : $(MAKEOBJS) $(VMSMAKEOBJS) $(LIBOPT) $(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSMAKEOBJS),$(LIBS) + @ $(TOUCH) $(MARKER) makedefs.obj : makedefs.c \ $(CONFIG_H) $(INC)permonst.h $(INC)objclass.h \ *************** *** 365,367 **** --- 369,372 ---- - if f$search("*.exe").nes."" then \ $(RM) $(MAKEDEFS),$(LEVCOMP),$(DGNCOMP),$(RECOVER),$(DLB) - if f$search("*.exe").nes."" then $(RM) $(TILEUTILS) + - if f$search("$(MARKER)").nes."" then $(RM) $(MARKER) *** nethack-3.3.1/sys/vms/oldcrtl.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/oldcrtl.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)oldcrtl.c 3.3 1995/06/01 */ /* Pat Rankin May'90 */ /* VMS NetHack support, not needed for vms 4.6,4.7,5.x,or later */ --- 1,4 ---- ! /* SCCS Id: @(#)oldcrtl.c 3.4 1995/06/01 */ /* Pat Rankin May'90 */ /* VMS NetHack support, not needed for vms 4.6,4.7,5.x,or later */ *** nethack-3.3.1/sys/vms/vmsbuild.com Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmsbuild.com Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** ! $ ! vms/vmsbuild.com -- compile and link NetHack 3.3.* [pr] ! $ version_number = "3.3.0" $ ! $ ! usage: $ ! $ set default [.src] !or [-.-.src] if starting from [.sys.vms] --- 1,5 ---- ! $ ! vms/vmsbuild.com -- compile and link NetHack 3.4.* [pr] ! $ version_number = "3.4.0" $ ! $ ! usage: $ ! $ set default [.src] !or [-.-.src] if starting from [.sys.vms] *************** *** 257,265 **** + ",dig,display,do,do_name,do_wear,dog,dogmove,dokick,dothrow,drawing" - + ",dungeon,eat,end,engrave,exper,explode,extralev,files,fountain" $ gosub compile_list ! $ c_list = "hack,hacklib,invent,light,lock,mail,makemon,mcastu,mhitm,mhitu" - ! + ",minion,mklev,mkmap,mkmaze,mkobj,mkroom,mon,mondata,monmove,monstr" - ! + ",mplayer,mthrowu,muse,music,o_init,objnam,options,pager,pickup" $ gosub compile_list $ c_list = "pline,polyself,potion,pray,priest,quest,questpgr,read" - + ",rect,region,restore,rip,rnd,role,rumors,save,shk,shknam,sit" - --- 257,266 ---- + ",dig,display,do,do_name,do_wear,dog,dogmove,dokick,dothrow,drawing" - + ",dungeon,eat,end,engrave,exper,explode,extralev,files,fountain" $ 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,monstr,mplayer,mthrowu,muse,music,o_init,objnam,options" - ! + ",pager,pickup" $ gosub compile_list $ c_list = "pline,polyself,potion,pray,priest,quest,questpgr,read" - + ",rect,region,restore,rip,rnd,role,rumors,save,shk,shknam,sit" - *** nethack-3.3.1/sys/vms/vmsfiles.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmsfiles.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vmsfiles.c 3.3 1999/08/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vmsfiles.c 3.4 1999/08/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/vms/vmsmail.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmsmail.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vmsmail.c 3.3 1995/06/01 */ /* Copyright (c) Robert Patrick Rankin, 1991. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)vmsmail.c 3.4 1995/06/01 */ /* Copyright (c) Robert Patrick Rankin, 1991. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/vms/vmsmain.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmsmain.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vmsmain.c 3.3 1997/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* main.c - VMS NetHack */ --- 1,4 ---- ! /* SCCS Id: @(#)vmsmain.c 3.4 2001/07/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* main.c - VMS NetHack */ *************** *** 45,51 **** atexit(byebye); hname = argv[0]; - gethdate(hname); /* find executable's creation date */ hname = vms_basename(hname); /* name used in 'usage' type messages */ hackpid = getpid(); (void) umask(0); --- 45,50 ---- *************** *** 303,308 **** --- 302,310 ---- if ((i = str2race(argv[0])) >= 0) flags.initrace = i; } + break; + case '@': + flags.randomall = 1; break; default: if ((i = str2role(&argv[0][1])) >= 0) { *** nethack-3.3.1/sys/vms/vmsmisc.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmsmisc.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vmsmisc.c 3.3 1996/03/02 */ /* NetHack may be freely redistributed. See license for details. */ #include --- 1,4 ---- ! /* SCCS Id: @(#)vmsmisc.c 3.4 1996/03/02 */ /* NetHack may be freely redistributed. See license for details. */ #include *** nethack-3.3.1/sys/vms/vmstty.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmstty.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)vmstty.c 3.3 1995/07/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* tty.c - (VMS) version */ --- 1,4 ---- ! /* SCCS Id: @(#)vmstty.c 3.4 1995/07/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* tty.c - (VMS) version */ *** nethack-3.3.1/sys/vms/vmsunix.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/vms/vmsunix.c Thu Mar 21 07:37:44 2002 *************** *** 1,13 **** ! /* SCCS Id: @(#)vmsunix.c 3.3 1996/02/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* This file implements things from unixunix.c, plus related stuff */ #include "hack.h" - #if 0 - #include "date.h" /* generated by 'makedefs' */ - #endif #include #include --- 1,10 ---- ! /* SCCS Id: @(#)vmsunix.c 3.4 2001/07/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* This file implements things from unixunix.c, plus related stuff */ #include "hack.h" #include #include *************** *** 30,86 **** extern unsigned long smg$init_term_table_by_type(), smg$del_term_table(); #define vms_ok(sts) ((sts) & 1) /* odd => success */ - #if 0 - static long exe_time = BUILD_TIME; - #endif - static int FDECL(veryold, (int)); static char *NDECL(verify_term); #if defined(SHELL) || defined(SUSPEND) static void FDECL(hack_escape, (BOOLEAN_P,const char *)); static void FDECL(hack_resume, (BOOLEAN_P)); - #endif - - /*ARGSUSED*/ - void - gethdate(name) /* get the creation date & time of file 'name' */ - const char *name; /* assumed to be argv[0], full path to nethack.exe */ - { - #if 0 - struct stat hbuf; - /* - [f]stat() won't work across a DECnet link. Would somebody be - masochistic enough to try ``$ RUN node::NETHACK''? One hopes - not, but don't inadvertently forbid it. If stat() fails, use - the compile time provided by 'makedefs' instead of just quitting. - The playground must be local, otherwise all level files will - fail their status check, but the exe image could be remote. - - Note that we care about the executable's creation time, not - its modification time, since the latter is touched by changing - file protection or renaming, two naive ways someone might use - to disable the program during prime time. - */ - if (stat(name, &hbuf) == 0) exe_time = hbuf.st_ctime; - #endif - } - - #if 0 - boolean - uptodate(fd) - int fd; - { - struct stat buf; - - if (fstat(fd, &buf) != 0) - pline("Cannot get status of saved level? "); - else if (buf.st_mtime < exe_time) - pline("Saved level is out of date. "); - else - return TRUE; /* passed the test */ - wait_synch(); - return FALSE; /* failed the test */ - } #endif static int --- 27,37 ---- *** nethack-3.3.1/sys/winnt/Install.nt Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/Install.nt Thu Mar 21 07:37:44 2002 *************** *** 1,74 **** ! Copyright (c) NetHack Development Team 1990-2000 NetHack may be freely redistributed. See license for details. ============================================================== Instructions for compiling and installing ! NetHack 3.3 on a Windows NT, 2000, or Windows 9x system ============================================================== ! (or, How to make NetHack 3.3.1 for the WIN32 Console subsystem) ! Last revision: August 2, 2000 ! Credit for the PC versions of NetHack 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. Credit for the porting of NetHack to the Win32 Console Subsystem goes to the NT Porting Team started by Michael Allison. This version of NetHack for Win32 is a tty port utilizing the WIN32 Console I/O subsystem. I. Dispelling the Myths: ! Compiling NetHack is not as easy as it sounds, nor as hard as it looks, ! however it will behoove you to read this entire file through before ! beginning the task. ! We have provided a Makefile for building NetHack using the ! following compiler: ! Microsoft Visual C++ V6.0 SP3 or greater ! ! The 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 ! 32-bit compiler, but that has not been tested. 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. - To use the distributed NetHack icon, a version of uudecode is required. ! II. To compile your copy of NetHack on a 32 bit Windows machine (NT or 95): 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 Microsoft compiler environment ! are set correctly. ( For example, by executing vcvars32.bat, which ! is probably in the bin directory of your compilers directory tree. ) 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\winnt, util and win\tty. Other subdirectories may also be included in your distribution, but they are not necessary for building the TTY version for the Win32 ! console subsystem. You can delete them to save space. Your distribution ! may contain a directory win\win32. This window port variant was a ! recent addition and was not ready for the 3.3.0 or 3.3.1 releases. ! You may ignore it or contribute to it. Required Directories for a Win32 Console NetHack: top | ! ------------------------------------------------- ! | | | | | | | ! util dat doc include src sys win | | ------ ----- | | | --- 1,148 ---- ! Copyright (c) NetHack Development Team 1990-2002 NetHack may be freely redistributed. See license for details. ============================================================== Instructions for compiling and installing ! NetHack 3.4 on a Windows NT, 2000, or XP system ============================================================== ! Last revision: March 2, 2002 ! {TODO: there are some TODO's in the text below to be resolved before release} 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. + + The PC Windows porting team consisting of Michael Allison, Dave Cohrs, + Alex Kompel, Yitzhak Sapir, and Janet Walz integrated the tty version + and the graphical version into the NetHack 3.4.0 sources. Just as + the release of NetHack 3.4.0 was being prepared, Dion Nicolaas submitted + an entire win32 port of his own to the NetHack Development Team. Dion was + subsequently invited to join the PC Windows porting team where he could + continue to contribute to the win32 port, and that invitation was accepted. + + + You can build either the TTY version of NetHack or the Windows Graphical + version. In either case you can use one of the following build + environments: + + 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. + + OR + + o A copy of Borland C 5.5.1 command line tools. Borland has made a + version of its command line tools available for download after + registration at: + http://www.borland.com/bcppbuilder/freecompiler/. + + Additionally, you can build a TTY version of NetHack with the following + build environment: + + o A copy of MinGW 1.0. MinGW is a collection of header files and import + libraries with which native Windows32 programs can be made; MinGW 1.0 + ships with the GNU Compiler Collection. + You can download MinGW at + http://www.mingw.org/ + + + FIRST STEP: + + The first step in building either version of NetHack is to execute + sys/winnt/nhsetup.bat. + + From the command prompt: + cd sys\winnt + nhsetup + + From a Windows explorer window: + double-click on nhsetup.bat + + A "binary" directory will be created off the top of the NetHack source + tree to house the completed build. + + A build subdirectory will also be created off the top of the NetHack + source tree, and many files appropriate for a graphical build will be + moved there. + + If you wish to build the TTY version, proceed now to "BUILDING TTY VERSION." + If you wish to build the graphical version, proceed now to "BUILDING GRAPHICAL VERSION." + + + ------------------------ + | BUILDING TTY VERSION | + ------------------------ + This version of NetHack for Win32 is a tty port utilizing the WIN32 Console I/O subsystem. I. Dispelling the Myths: ! Compiling NetHack for WIN32 TTY 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 C++ V6.0 SP3 or greater ! o Borland C 5.5.1 ! o MinGW 1.0 with GCC 2.95.3-6 ! ! The Microsoft Visual C 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 32-bit compiler, but ! that has not been tested. ! The Borland C Makefile was created for use with Borland MAKE ! which is provided with the Borland compiler. ! 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 32 bit Windows machine (NT or 2000): ! (Note: build has not been tested on Windows XP. That isn't to say that ! it doesn't work, it just hasn't been tried by us.) 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. (Examples: For the Microsoft compiler by ! executing vcvars32.bat, which is probably in the bin directory of ! your compilers directory tree. For the Borland Makefile, you can ! simply invoke the Make utility from the Makefile's directory (For ! the standard Borland compiler installation you can just ! use the explicit path "c:\borland\bcc55\bin\make /f Makefile.bcc". ! For the GCC Makefile, add \bin to your path, where is ! your MinGW root directory.) 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\winnt, util, win\tty, and ! binary (The "binary" directory was created by nhsetup.bat earlier ! if you followed the steps appropriately). ! Other subdirectories may also be included in your distribution, but they are not necessary for building the TTY version for the Win32 ! console subsystem. You can delete them to save space. Required Directories for a Win32 Console NetHack: top | ! ----------------------------------------------------/ /----- ! | | | | | | | | ! util dat doc include src sys win binary | | ------ ----- | | | *************** *** 86,198 **** with them, so you may need to convert them. The compiler should not have any problems with them however. ! 3. Go to the sys\winnt directory and run the nhsetup.bat batch file. ! The necessary Makefile movements will be accomplished for you. It ! will also verify that your directories are set up properly. It ! will also attempt to uudecode the NetHack icon contained in the ! file sys/winnt/nhico.uu. You must uudecode this file manually ! if the batch file fails to do so. ! ! 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, ! make sure the HACKDIR is set properly. ! ! Also check COMPRESS. ! You may include all or as few of the special game features as you wish. ! 5. Go to the src directory and edit the top of your Makefile. ! Change the setting of (GAMEDIR) to reflect the directory where ! you want NetHack to be installed. ! ie. GAMEDIR = \games\nethackntty ! ! The directory you specify *MUST* exist for all remaining steps to be ! successful. Be sure the directory you want the game installed ! actually exists. If it doesn't, create it now. ! ! If you elected not to use the high-quality BSD random number routines by ! commenting out RANDOM in ntconf.h, comment out (or set equal ! to nothing) the RANDOM macro in your Makefile. 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 "nmake". Compiling ! 6. Now that everything is set up, and with your current directory set ! to src, run "nmake 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 quite a while. If all ! goes well, you will get an NetHack executable. Running NetHack ! 7. Make sure all of the support files -- Guidebook.txt, license, logfile, ! Defaults.nh, NetHack.exe, nhdat, record, and recover.exe ! -- were copied to the game directory. If not, move them there yourself. ! Defaults.nh is actually distributed in the sources as sys/winnt/winnt.cnf, ! but the Makefile should take care of moving it and renaming it correctly. Edit Defaults.nh to reflect your particular setup and personal preferences, by following the comments. As with all releases since ! 3.2.1, HACKDIR defaults to the same directory as that where the NetHack.exe ! executable resides. You only need to set HACKDIR in Defaults.nh if, ! for some reason, you wish to override that. ! 8a. Running from the command prompt: If you add the directory containing the NetHack executable to your PATH, you can just type "nethack" or "nethack -umike" to start it up. Alternatively, you can explicitly invoke it with ! a command such as "c:\games\nethack\nethack" (specifying whatever drive and directory your NetHack executable resides in) each time. ! 8b. Running from a Windows shortcut (win95 or NT4.x) ! ! If you will be running it by launching it from program manager ! or from a shortcut, just use the following information when ! setting up the icon or shortcut. ! Description : NetHack 3.3.1 ! Command Line : C:\GAMES\NETHACK\NETHACK.EXE (changing the directory to the appropriate one of course) ! 9. Play NetHack. If it works, you're done! Notes: ! 1) To install an update of NetHack after changing something, enter "nmake" ! 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.) 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) The executable produced by this port is a 32-bit, flat-address space, ! non-overlayed .exe file, which should run on any true Win32 environment. ! 3) If you encounter a bug and wish to report it, please send e-mail to: nethack-bugs@nethack.org If you have any comments or suggestions, feel free to drop us a line c/o: DevTeam@nethack.org --- 160,497 ---- with them, so you may need to convert them. The compiler should not have any problems with them however. ! 3. Now go to the include subdirectory to check a couple of the header 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. ! You may include all or as few of the special game features as you wish ! (they are located last in the file). ! 4. Edit your Makefile. ! For building the TTY version, ensure that GRAPHICAL is set to "N", ! or commented out. (If you aren't building the TTY version, you are ! currently reading the wrong section, and following the wrong set of ! steps. In that case, you may wish to start reading from the top ! again.) ! ! Optional step: ! If you elected not to use the high-quality BSD random number routines by ! commenting out RANDOM in ntconf.h, comment out (or set equal to nothing) ! the RANDOM macro in your Makefile. 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, change your current directory to src. ! ! For Microsoft compiler: ! nmake install ! For Borland compiler: ! make /f Makefile.bcc install ! ! For GCC: ! 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. Running NetHack ! 6. Make sure all of the support files -- Guidebook.txt, license, ! Defaults.nh, NetHack.exe, nhdat, and recover.exe -- were copied to the ! game directory. If not, move them there yourself. Edit Defaults.nh to reflect your particular setup and personal preferences, by following the comments. As with all releases since ! 3.2.1, HACKDIR defaults to the same directory as that where the NetHack.exe ! executable resides. You only need to set HACKDIR in defaults.nh if, ! for some reason, you wish to override that (be careful). ! 7. Executing the game ! ! a) Running from the command prompt: If you add the directory containing the NetHack executable to your PATH, you can just type "nethack" or "nethack -umike" to start it up. Alternatively, you can explicitly invoke it with ! a command such as "c:\nethack\binary\nethack.exe" (specifying whatever drive and directory your NetHack executable resides in) each time. + b) Running from a Windows shortcut. ! If you will be running it by launching it from a shortcut, just ! use the following information when setting up the shortcut. ! Description : NetHack 3.4.0 ! Command Line : C:\NETHACK\BINARY\NETHACK.EXE (changing the directory to the appropriate one of course) ! 8. Play NetHack. If it works, you're done! 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 Borland compiler: ! make /f Makefile.bcc ! ! For GCC: ! 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) The executable produced by the TTY build is a 32-bit, flat-address space, ! non-overlayed .exe file, which should run on any true Win32 environment ! with console I/O support. ! ! ------------------------------ ! | BUILDING GRAPHICAL VERSION | ! ------------------------------ ! ! ! This version of NetHack is a Win32 native port built on the Windows API. ! ! I. Dispelling the Myths: ! ! Compiling NetHack for Windows is straightforward, as long as you have ! your compiler and tools correctly installed. ! ! It is also assumed that you already changed your directory to ! sys\winnt and executed: ! nhsetup ! as described at the top of this document. If you didn't, you must ! go back and do so before proceeding. ! ! II. To compile your copy of NetHack for Windows on a ! Windows NT/2000/XP machine: ! ! Setting Up ! ! 1. It almost goes without saying that you should make sure that your tools ! are set up and running correctly. (Examples: For the Microsoft Visual ! Studio C compiler it should correctly fire up when you choose it in ! your Start | Programs menus, and for Borland make sure that the compiler ! is in your PATH, or that you know where the make.exe executable resides.) ! ! 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\winnt, util, win\win32, ! and at this point you should also have a build directory and a ! binary directory (both created by nhsetup.bat executed from ! sys\winnt earlier.) ! ! Other subdirectories may also be included in your distribution, but ! they are not necessary for building the graphical version of NetHack ! (you can delete them to save space if you wish.) ! ! Required Directories for a Win32 Graphical NetHack: ! ! top ! | ! -----------------------------------------/ /--------------- ! | | | | | | | | | ! util dat doc include src sys win build binary ! | | ! ------ ----- ! | | | ! share winnt win32 ! ! Those last two (build and binary) are created during the building ! process. They are not disributed as part of the NetHack source ! distribution. nhsetup.bat creates the build directory and moves ! a few files into it, including the Visual C project files. ! The "binary" directory will house everything you need to play the ! game after building is complete. ! ! Check the file "Files" in your top level directory for an exact ! listing of what file is in which directory. In order for the ! build process to work, all the source files must be in the proper ! locations. Remember that nhsetup.bat moves/copies many files around ! to their intended locations for building NetHack. ! ! 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. Visual Studio project ! files and workspace files (dsp and dsw files) in particular need to ! have their lines end in carriage-return-line-feed or they won't work ! properly. ! ! 3. Ready your tool. ! Microsoft compiler users, perform step 3a. ! Borland compiler users, perform step 3b. ! ! Note for Microsoft users: It's possible to build a graphical version ! using the Makefile. For simplicity's sake, however, only the Visual ! C IDE build will be explained. The IDE build has full game ! functionality and is the officially released build.s ! ! a) Microsoft compiler: ! Start the Visual C IDE. In the Visual C IDE Menus, choose: ! File | Open Workspace ! ! b) Borland compiler: ! Chdir to the NetHack src directory: ! chdir ../../src ! if your current directory was still sys/winnt, ! or: ! chdir src ! if your current directory was the top of the NetHack tree. ! ! 4. Set up for the build. ! Microsoft compiler users, perform step 4a. ! Borland compiler users, perform step 4b. ! ! a) Microsoft compiler only: ! o In the Visual C "Open Workspace" dialog box, navigate to the top ! of your NetHack source directory. ! ! In there, highlight "nethack.dsw" and click on Open. ! Once the workspace has been opened, you should see the following ! list in the Visual C selection window: ! + dgncomp files ! + dgnstuff files ! + dlb_main files ! + levcomp files ! + levstuff files ! + makedefs files ! + nethackw files ! + recover files ! + tile2bmp files ! + tilemap files ! + uudecode files ! ! o On the Visual C menus, choose: ! Project | Set Active Project | nethackw ! ! o On the Visual C menus again, choose either: ! Build | Set Active Configuration | nethackw - Win32 Release ! or ! Build | Set Active Configuration | nethackw - Win32 Debug ! ! The first will create the Release build of NetHackW which does ! not contain all the debugging information and is smaller, and ! runs quicker. The second will create the Debug build of NetHackW ! and will spend a lot of time writing debug information to the disk ! as the game is played. Unless you are debugging or enhancing NetHack ! for Windows, choose the Release build. ! ! o For Microsoft compiler build, you may now proceed to step 5. ! ! b) Borland Compiler only: ! ! o Edit the Makefile. Ensure the following are set correctly. ! GRAPHICAL should be set to "Y" ! ! o Ensure that all your tools directories are set up properly. ! By default, your tools are assumed to be in the same ! directory as the MAKE program. ! ! ! Building ! ! 5. Start your build. ! Microsoft compiler users, perform step 5a. ! Borland compiler users, perform step 5b. ! ! a) Microsoft Compiler only: ! o On the Visual C menus once again, choose: ! Build | Build nethackw.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. ! If all goes well, you will get an NetHack executable called ! nethackw.exe in the "binary" directory, along with all the support ! files that it needs. ! ! o For Microsoft compiler build, you may now proceed to step 6. ! ! b) Borland Compiler only: ! o With your current directory the NetHack src directory, ! issue the following command: ! make /f Makefile.bcc install ! ! 6. If all has gone well to this point, you should now have a playable ! game of "NetHack for Windows" in the "binary" directory. ! ! ! Running NetHack ! ! 7. Make sure all of the support files -- Guidebook.txt, license, ! Defaults.nh, nethackw.exe, nhdat, and recover.exe ! -- were copied to the binary directory. ! (If not, find them in the tree and move them there yourself if they ! exist. If they don't exist, something has gone wrong) ! ! Edit Defaults.nh to reflect your particular setup and personal ! preferences, by following the comments. As with all releases since ! 3.2.1, HACKDIR defaults to the same directory as that where the nethackw.exe ! executable resides. You only need to set HACKDIR in Defaults.nh if, ! for some reason, you wish to override that (be careful). ! ! 8. Executing the game ! a) Running from the command prompt: ! ! If you add the directory containing the NetHack executable ! to your PATH, ! You can just type "nethackw" to start it up. Alternatively, you ! can explicitly invoke it with a command such as ! "c:\nethack\binary\nethackw.exe" (specifying whatever drive ! and directory your NetHack executable resides in) each time. ! ! b) Running from a Windows shortcut (win95 or NT4.x) ! ! If you will be running it by launching it from program manager ! or from a shortcut, just use the following information when ! setting up the icon or shortcut. ! ! Description : NetHack 3.4.0 ! Command Line : C:\NETHACK\BINARY\NETHACKW.EXE ! ! (changing the directory in the Command Line to the appropriate one of course) ! ! 9. Play NetHack for Windows. If it works, you're done! ! ! ! PROBLEMS ! ! If you encounter a bug and wish to report it, please send e-mail to: nethack-bugs@nethack.org If you have any comments or suggestions, feel free to drop us a line c/o: DevTeam@nethack.org + + You may wish to vist the NetHack Development Team's website occasionally + to check for updates or known bugs. The website can be found at: + http://www.nethack.org/ + + Happy NetHacking! *** nethack-3.3.1/sys/winnt/mapimail.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/mapimail.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)mapimail.c 3.3 2000/04/25 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)mapimail.c 3.4 2000/04/25 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/winnt/nethack.def Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/nethack.def Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** NAME NETHACK ! DESCRIPTION 'NetHack 3.3.0 for Windows NT' EXETYPE WINDOWS STUB 'WINSTUB.EXE' CODE PRELOAD MOVEABLE DISCARDABLE --- 1,5 ---- NAME NETHACK ! DESCRIPTION 'NetHack 3.4.0 for Windows NT' EXETYPE WINDOWS STUB 'WINSTUB.EXE' CODE PRELOAD MOVEABLE DISCARDABLE *** nethack-3.3.1/sys/winnt/nhico.uu Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/nhico.uu Thu Mar 21 07:37:44 2002 *************** *** 1,25 **** ! section 1 of uuencode 4.13 of file NETHACK.ICO by R.E.M. ! ! begin 644 NETHACK.ICO ! M```!``$`("`0``````#H`@``%@```"@````@````0`````$`!```````@`(`. ! M``````````````````````````````"```"`````@(``@````(``@`"`@```6 ! M@("``,#`P````/\``/\```#__P#_````_P#_`/__``#___\`]F9F9F9F9F9F* ! M9F9F9F9F9O]F9F9F9F9F9F9F9F9F9F;_B(B(B(B(B(B(B(B(B&9F_XB(B(B(D ! MB(B(B(B(B(AF9O^(B(B(A555B(B(B(B(9F;_B(B(B`!5!8B(B(B(B&9F_XB(' ! MB(@```6(B(B(B(AF9O^(B%554`!56(B(B(B(9F;_B(N[N[`.XU6(B(B(B&9F[ ! M_XB[N[L`ONXU6(B(B(AF9O^+N[N[N[ONXUB(B(B(9F;_B[N[N[N[ONY3B(B(N ! MB&9F_XN[NYF9F[ONXSB(B(AF9O^+N[F9F9F[ONXSB(B(9F;_B[N9F9F9F[ON? ! MXSB(B&9F_XNYF9F9F9F[7NXSB(AF9O^+N9F9F9F9NUCNXSB(9F;_B[F9F9F9J ! MF;M8CNXSB&9F_XNYF9F9F9F[6(CNXXAF9O^+N9F9F9F9NUB(CNZ(9F;_B[N9] ! MF9F9F[M8B(CNB&9F_XN[N9F9F;N[6(B(B(AF9O^+N[N9F9N[NUB(B(B(9F;_R ! MB[N[N[N[N[M8B(B(B&9F_XN[N[N[N[N[B(B(B(AF9O^+NXB(B(B+NXB(B(B(F ! M9F;_B[B(B(B(B+N(B(B(B&9F_XB(B(B(B(B(B(B(B(AF9O^(B(B(B(B(B(B(J ! MB(B(9F;_B(B(B(B(B(B(B(B(B&9F___________________V9O__________% ! M__________\`````````````````````````````````````````````````R ! M````````````````````````````````````````````````````````````` ! M````````````````````````````````````````````````````````````` ! !````` ! `` end - sum -r/size 23881/1107 section (from "begin" to "end") - sum -r/size 55184/766 entire input file --- 1,27 ---- ! begin 600 nethack.ico ! M```!``(`("`0``````#H`@``)@```!`0$```````*`$```X#```H````(``` ! M`$`````!``0``````(`"````````````````````````````````@```@``` ! M`("``(````"``(``@(```,#`P`"`@(````#_``#_````__\`_P```/\`_P#_ ! M_P``____````````````````````````__=P```````````'=W<`#___=P`` ! M````````?_?W<`]W:/=P``#_<```!WB'!G`/8'B'<``/_W<```?VAGAP#P=E ! M;W``__]W<``'>`=H\`__=G_P#_!V9_<`!W=H=W``__(:/<`=P=W<` ! M``__\`_W=G9GB'<`!W=P````__#_=G=X2&"/<`=W``````_P_\=T=F>(:/<' ! M<```````#_9V=V5H8(AO<`````````_W=W1WAXAHA_````````#_9\<&>&!H ! M!H9W````````_W=V=6=GAH@(]P``````#_?'9W9T:(!H:&=P``````_V=WQV ! M=X=HA@B/<``````/]GQP=G>':(A@AW``````#_<'9\=VAH!HB&=P``````_V ! M=G=X9V>&"&"'<``````/]W?'9W1@B(:(9W````^&C_?'9W1WAX:`8(=P`'`/ ! M_X_P9W9W:&A@AH:''AH@(AW!W\`=H;_9V=G!H:&"&A@=P ! M`(`'B(_P<'!V<&>(:(B'<`"`#_\/______=W=W=W=W!W<`__#_____?_?W=W ! M=W=P=W`/``__#___]W=W=W!W<`!P```/\`#_]_]_=W<`!W``````#P```/_W ! M=W<```!P```````````````````````````````````````````````````` ! M```````````````````````````````````````````````````````````` ! M```````````````````````````````````````````````````````````` ! M```````````````````````H````$````"`````!``0``````,`````````` ! M````````````````````````@```@````("``(````"``(``@(```,#`P`"` ! M@(````#_``#_````__\`_P```/\`_P#__P``____`````````````/<````` ! M=P`/_W`/<`=W<`#_\/8'!W<```\/9F!P<````/9F!@<`````]F9@9P````]F ! M9@8&<```#V9F8&!P```/9F8&!G````]F9F!@<``/?V9F!@9P<`]_9F9@8'!P ! M#P___W=W<'``#P__=W!P```````````````````````````````````````` ! K```````````````````````````````````````````````````````````` ! ` end *** nethack-3.3.1/sys/winnt/nhsetup.bat Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/nhsetup.bat Thu Mar 21 07:37:44 2002 *************** *** 1,64 **** ! @REM SCCS Id: @(#)nhsetup.bat 96/10/30 ! @REM Copyright (c) NetHack PC Development Team 1993, 1996 @REM NetHack may be freely redistributed. See license for details. @REM Win32 setup batch file, see Install.nt for details @REM @echo off 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 ..\..\util\makedefs.c goto err_dir ! if not exist ..\..\sys\winnt\winnt.c goto err_dir echo Directories look ok. ! :do_rest ! echo "Copying Makefile.NT to ..\..\src\Makefile" ! copy makefile.NT ..\..\src\Makefile >nul ! echo Makefile copied ok. ! if not exist ..\..\win\win32\NetHack.dsp goto nowin32 ! echo "Copying Visual C project files to top level directory" ! copy ..\..\win\win32\NetHack.rc ..\.. ! copy ..\..\win\win32\resource.h ..\.. ! copy ..\..\win\win32\NetHack.dsw ..\.. ! copy ..\..\win\win32\NetHack.clw ..\.. ! copy ..\..\win\win32\makedefs.dsp ..\.. ! copy ..\..\win\win32\NetHack.dsp ..\.. ! copy ..\..\win\win32\tile2bmp.dsp ..\.. ! copy ..\..\win\win32\dgncomp.dsp ..\.. ! copy ..\..\win\win32\levcomp.dsp ..\.. ! copy ..\..\win\win32\dlb_main.dsp ..\.. ! copy ..\..\win\win32\tilemap.dsp ..\.. ! copy ..\..\win\win32\recover.dsp ..\.. ! ! :nowin32 ! ! if exist .\nethack.ico goto hasicon ! if exist .\nhico.uu uudecode nhico.uu >nul ! if NOT exist .\nethack.ico goto err_nouu ! :hasicon ! echo NetHack icon exists ok. ! echo done! ! echo. ! echo Proceed with the next step documented in Install.nt echo. ! goto done ! :err_nouu ! echo Apparently you have no UUDECODE utility in your path. You need a UUDECODE ! echo utility in order to turn "nhico.uu" into "nethack.ico". ! echo Check "Install.nt" for a list of the steps required to build NetHack. ! goto done ! :err_plev ! echo A required file ..\..\include\patchlev.h seems to be missing. ! echo Check "Files." in the root directory for your NetHack distribution ! echo and make sure that all required files exist. ! goto done :err_data echo A required file ..\..\dat\data.bas seems to be missing. echo Check "Files." in the root directory for your NetHack distribution echo and make sure that all required files exist. ! goto done :err_dir echo Your directories are not set up properly, please re-read the ! echo documentation. :done --- 1,114 ---- ! @REM SCCS Id: @(#)nhsetup.bat 2002/03/07 ! @REM Copyright (c) NetHack PC Development Team 1993, 1996, 2002 @REM NetHack may be freely redistributed. See license for details. @REM Win32 setup batch file, see Install.nt for details @REM @echo off + + set _pause= + + :nxtcheck 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 ..\..\util\makedefs.c goto :err_dir ! if not exist ..\..\sys\winnt\winnt.c goto :err_dir echo Directories look ok. ! :do_tty ! if NOT exist ..\..\binary\*.* mkdir ..\..\binary ! if NOT exist ..\..\binary\license copy ..\..\dat\license ..\..\binary\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 Borland Makefile - Makefile.bcc to ..\..\src\Makefile.bcc ! if NOT exist ..\..\src\Makefile.bcc goto :dobor ! copy ..\..\src\Makefile.bcc ..\..\src\Makefile.bcc-orig >nul ! echo Your existing ! echo ..\..\src\Makefile.bcc ! echo has been renamed to ! echo ..\..\src\Makefile.bcc-orig ! :dobor ! copy Makefile.bcc ..\..\src\Makefile.bcc >nul ! echo Borland 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. ! ! :do_win ! if not exist ..\..\win\win32\nethack.dsw goto :err_win echo. ! echo Copying Visual C project files to ..\..\build directory ! echo Copying ..\..\win\win32\nethack.dsw ..\..\nethack.dsw ! copy ..\..\win\win32\nethack.dsw ..\.. >nul ! if NOT exist ..\..\binary\*.* echo Creating ..\..\binary directory ! if NOT exist ..\..\binary\*.* mkdir ..\..\binary ! if NOT exist ..\..\binary\license copy ..\..\dat\license ..\..\binary\license >nul ! if NOT exist ..\..\build\*.* echo Creating ..\..\build directory ! if NOT exist ..\..\build\*.* mkdir ..\..\build ! copy ..\..\win\win32\dgncomp.dsp ..\..\build >nul ! copy ..\..\win\win32\dgnstuff.dsp ..\..\build >nul ! copy ..\..\win\win32\dgnstuff.mak ..\..\build >nul ! copy ..\..\win\win32\dlb_main.dsp ..\..\build >nul ! copy ..\..\win\win32\levcomp.dsp ..\..\build >nul ! copy ..\..\win\win32\levstuff.dsp ..\..\build >nul ! copy ..\..\win\win32\levstuff.mak ..\..\build >nul ! copy ..\..\win\win32\makedefs.dsp ..\..\build >nul ! copy ..\..\win\win32\recover.dsp ..\..\build >nul ! copy ..\..\win\win32\tile2bmp.dsp ..\..\build >nul ! copy ..\..\win\win32\tiles.dsp ..\..\build >nul ! copy ..\..\win\win32\tiles.mak ..\..\build >nul ! copy ..\..\win\win32\tilemap.dsp ..\..\build >nul ! copy ..\..\win\win32\uudecode.dsp ..\..\build >nul ! copy ..\..\win\win32\nethackw.dsp ..\..\build >nul ! ! 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_data echo A required file ..\..\dat\data.bas seems to be missing. echo Check "Files." in the root directory for your NetHack distribution echo and make sure that all required files exist. ! 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=Y + if "%0"=="nhsetup" set _pause=N + if "%0"=="NHSETUP" set _pause=N + if "%_pause%"=="Y" pause + set _pause= *** nethack-3.3.1/sys/winnt/ntsound.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/ntsound.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)ntsound.c 3.3 95/09/06 */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ --- 1,4 ---- ! /* SCCS Id: @(#)ntsound.c 3.4 1995/09/06 */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ *** nethack-3.3.1/sys/winnt/nttty.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/nttty.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)nttty.c 3.3 2000/08/02 /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)nttty.c 3.4 2000/08/02 /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 39,45 **** HANDLE hConOut; /* Win32 Screen buffer,coordinate,console I/O information */ ! CONSOLE_SCREEN_BUFFER_INFO csbi; COORD ntcoord; INPUT_RECORD ir; --- 39,45 ---- HANDLE hConOut; /* Win32 Screen buffer,coordinate,console I/O information */ ! CONSOLE_SCREEN_BUFFER_INFO csbi, origcsbi; COORD ntcoord; INPUT_RECORD ir; *************** *** 52,66 **** */ int GUILaunched; static BOOL FDECL(CtrlHandler, (DWORD)); ! ! # ifdef TEXTCOLOR int ttycolors[CLR_MAX]; static void NDECL(init_ttycolor); # endif static char nullstr[] = ""; char erase_char,kill_char; #define LEFTBUTTON FROM_LEFT_1ST_BUTTON_PRESSED #define RIGHTBUTTON RIGHTMOST_BUTTON_PRESSED #define MIDBUTTON FROM_LEFT_2ND_BUTTON_PRESSED --- 52,81 ---- */ int GUILaunched; static BOOL FDECL(CtrlHandler, (DWORD)); ! ! #ifndef CLR_MAX ! #define CLR_MAX 16 ! #endif int ttycolors[CLR_MAX]; + # ifdef TEXTCOLOR static void NDECL(init_ttycolor); # endif + #define DEFTEXTCOLOR ttycolors[7] + #ifdef TEXTCOLOR + #define DEFGLYPHBGRND (0) + #else + #define DEFGLYPHBGRND (0) + #endif + static char nullstr[] = ""; char erase_char,kill_char; + static char currentcolor = FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE; + static char currenthilite = 0; + static char currentbackground = 0; + static boolean colorchange = TRUE; + #define LEFTBUTTON FROM_LEFT_1ST_BUTTON_PRESSED #define RIGHTBUTTON RIGHTMOST_BUTTON_PRESSED #define MIDBUTTON FROM_LEFT_2ND_BUTTON_PRESSED *************** *** 70,82 **** * Called after returning from ! or ^Z */ void ! gettty(){ ! erase_char = '\b'; kill_char = 21; /* cntl-U */ iflags.cbreak = TRUE; #ifdef TEXTCOLOR init_ttycolor(); #endif } --- 85,103 ---- * Called after returning from ! or ^Z */ void ! gettty() ! { ! #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] = 7; #endif } *************** *** 96,101 **** --- 117,167 ---- start_screen(); } + void + tty_startup(wid, hgt) + int *wid, *hgt; + { + /* int twid = origcsbi.dwSize.X; */ + int twid = origcsbi.srWindow.Right - origcsbi.srWindow.Left; + + if (twid > 80) twid = 80; + *wid = twid; + *hgt = origcsbi.srWindow.Bottom - origcsbi.srWindow.Top; + } + + void + tty_number_pad(state) + int state; + { + } + + void + tty_start_screen() + { + if (iflags.num_pad) tty_number_pad(1); /* make keypad send digits */ + } + + void + tty_end_screen() + { + clear_screen(); + if (GetConsoleScreenBufferInfo(hConOut,&csbi)) + { + DWORD ccnt; + COORD newcoord; + + newcoord.X = 0; + newcoord.Y = 0; + FillConsoleOutputAttribute(hConOut, + FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, + csbi.dwSize.X * csbi.dwSize.Y, + newcoord, &ccnt); + FillConsoleOutputCharacter(hConOut,' ', + csbi.dwSize.X * csbi.dwSize.Y, + newcoord, &ccnt); + } + } + static BOOL CtrlHandler(ctrltype) DWORD ctrltype; { *************** *** 107,119 **** case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: #ifndef NOSAVEONHANGUP ! if (program_state.something_worth_saving) { ! program_state.exiting++; ! (void) dosave0(); ! } #endif clearlocks(); terminate(EXIT_FAILURE); default: return FALSE; } --- 173,184 ---- case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: #ifndef NOSAVEONHANGUP ! hangup(0); #endif + #if 0 clearlocks(); terminate(EXIT_FAILURE); + #endif default: return FALSE; } *************** *** 124,130 **** nttty_open() { HANDLE hStdOut; ! long cmode; long mask; /* Initialize the function pointer that points to --- 189,195 ---- nttty_open() { HANDLE hStdOut; ! DWORD cmode; long mask; /* Initialize the function pointer that points to *************** *** 140,149 **** * the NT program manager. M. Allison */ hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); ! GetConsoleScreenBufferInfo( hStdOut, &csbi); ! GUILaunched = ((csbi.dwCursorPosition.X == 0) && ! (csbi.dwCursorPosition.Y == 0)); ! if ((csbi.dwSize.X <= 0) || (csbi.dwSize.Y <= 0)) GUILaunched = 0; hConIn = GetStdHandle(STD_INPUT_HANDLE); hConOut = GetStdHandle(STD_OUTPUT_HANDLE); --- 205,214 ---- * the NT program manager. M. Allison */ hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); ! GetConsoleScreenBufferInfo( hStdOut, &origcsbi); ! GUILaunched = ((origcsbi.dwCursorPosition.X == 0) && ! (origcsbi.dwCursorPosition.Y == 0)); ! if ((origcsbi.dwSize.X <= 0) || (origcsbi.dwSize.Y <= 0)) GUILaunched = 0; hConIn = GetStdHandle(STD_INPUT_HANDLE); hConOut = GetStdHandle(STD_OUTPUT_HANDLE); *************** *** 156,162 **** hConOut = CreateFile("CONOUT$", GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ |FILE_SHARE_WRITE, ! 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); #endif GetConsoleMode(hConIn,&cmode); #ifndef NO_MOUSE_ALLOWED --- 221,227 ---- hConOut = CreateFile("CONOUT$", GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ |FILE_SHARE_WRITE, ! 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); #endif GetConsoleMode(hConIn,&cmode); #ifndef NO_MOUSE_ALLOWED *************** *** 177,182 **** --- 242,269 ---- get_scr_size(); } + void + get_scr_size() + { + GetConsoleScreenBufferInfo(hConOut, &csbi); + + LI = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; + CO = csbi.srWindow.Right - csbi.srWindow.Left + 1; + + if ( (LI < 25) || (CO < 80) ) { + COORD newcoord; + + LI = 25; + CO = 80; + + newcoord.Y = LI; + newcoord.X = CO; + + SetConsoleScreenBufferSize( hConOut, newcoord ); + } + } + + /* * Keyboard translation tables. * (Adopted from the MSDOS port) *************** *** 202,210 **** {'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 */ --- 289,297 ---- {'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 */ *************** *** 218,224 **** {'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 */ --- 305,311 ---- {'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 */ *************** *** 245,250 **** --- 332,339 ---- #define inmap(x) (SCANLO <= (x) && (x) < SCANLO + SIZE(scanmap)) + int FDECL(process_keystroke, (INPUT_RECORD *ir, boolean *valid)); + int process_keystroke(ir, valid) INPUT_RECORD *ir; boolean *valid; *************** *** 302,309 **** int tgetch() { ! int count; ! int valid = 0; int ch; valid = 0; while (!valid) --- 391,398 ---- int tgetch() { ! DWORD count; ! boolean valid = 0; int ch; valid = 0; while (!valid) *************** *** 319,331 **** ntposkey(x, y, mod) int *x, *y, *mod; { ! int count; unsigned short int scan; unsigned char ch; unsigned long shiftstate; int altseq; int done = 0; ! int valid = 0; while (!done) { count = 0; --- 408,420 ---- ntposkey(x, y, mod) int *x, *y, *mod; { ! DWORD count; unsigned short int scan; unsigned char ch; unsigned long shiftstate; int altseq; int done = 0; ! boolean valid = 0; while (!done) { count = 0; *************** *** 341,350 **** return process_keystroke(&ir, &valid); } else if ((ir.EventType == MOUSE_EVENT && (ir.Event.MouseEvent.dwButtonState & MOUSEMASK))) { - #if 0 - *x = ir.Event.MouseEvent.dwMousePosition.X - csbi.srWindow.Left; - *y = ir.Event.MouseEvent.dwMousePosition.Y - csbi.srWindow.Top; - #endif *x = ir.Event.MouseEvent.dwMousePosition.X + 1; *y = ir.Event.MouseEvent.dwMousePosition.Y - 1; --- 430,435 ---- *************** *** 370,376 **** { int done = 0; /* true = "stop searching" */ int retval; /* true = "we had a match" */ ! int count; unsigned short int scan; unsigned char ch; unsigned long shiftstate; --- 455,461 ---- { int done = 0; /* true = "stop searching" */ int retval; /* true = "we had a match" */ ! DWORD count; unsigned short int scan; unsigned char ch; unsigned long shiftstate; *************** *** 409,483 **** } void - get_scr_size() - { - if (GetConsoleScreenBufferInfo(hConOut,&csbi)) - { - int tmpx, tmpy, ccnt; - COORD newcoord; - - newcoord.X = 0; - newcoord.Y = 0; - FillConsoleOutputCharacter(hConOut,' ', - csbi.dwSize.X * csbi.dwSize.Y, - newcoord, &ccnt); - - tmpy = csbi.dwSize.Y; - tmpx = csbi.dwSize.X; - if ((tmpy < 25) || (tmpx < 80)) { - newcoord.Y = 25; - newcoord.X = 80; - SetConsoleScreenBufferSize(hConOut, newcoord); - } - } - LI = 25; - CO = 80; - } - - - void - tty_startup(wid, hgt) - int *wid, *hgt; - { - - *wid = CO; - *hgt = LI; - } - - void - tty_number_pad(state) - int state; - { - } - - void - tty_start_screen() - { - if (iflags.num_pad) tty_number_pad(1); /* make keypad send digits */ - } - - void - tty_end_screen() - { - clear_screen(); - if (GetConsoleScreenBufferInfo(hConOut,&csbi)) - { - int ccnt; - COORD newcoord; - - newcoord.X = 0; - newcoord.Y = 0; - FillConsoleOutputAttribute(hConOut, - FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, - csbi.dwSize.X * csbi.dwSize.Y, - newcoord, &ccnt); - FillConsoleOutputCharacter(hConOut,' ', - csbi.dwSize.X * csbi.dwSize.Y, - newcoord, &ccnt); - } - } - - void nocmov(x, y) int x,y; { --- 494,499 ---- *************** *** 501,508 **** xputc(c) char c; { ! int count; WriteConsole(hConOut,&c,1,&count,0); } --- 517,529 ---- xputc(c) char c; { ! DWORD count; + if (colorchange) { + SetConsoleTextAttribute(hConOut, + (currentcolor | currenthilite | currentbackground)); + colorchange = FALSE; + } WriteConsole(hConOut,&c,1,&count,0); } *************** *** 510,543 **** xputs(s) const char *s; { ! int count; ! WriteConsole(hConOut,s,strlen(s),&count,0); } void cl_end() { ! int count; ntcoord.X = ttyDisplay->curx; ntcoord.Y = ttyDisplay->cury; FillConsoleOutputCharacter(hConOut,' ', CO - ntcoord.X,ntcoord,&count); tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } void clear_screen() { ! int count; ! ! ntcoord.X = 0; ! ntcoord.Y = 0; ! FillConsoleOutputCharacter(hConOut,' ',CO * LI, ! ntcoord, &count); home(); } --- 531,606 ---- xputs(s) const char *s; { ! DWORD count; ! if (colorchange) { ! SetConsoleTextAttribute(hConOut, ! (currentcolor | currenthilite | currentbackground)); ! colorchange = FALSE; ! } WriteConsole(hConOut,s,strlen(s),&count,0); } + /* + * Overrides winntty.c function of the same name + * for win32. It is used for glyphs only, not text. + */ + void + g_putch(in_ch) + int in_ch; + { + char ch = (char)in_ch; + DWORD count = 1; + int tcolor; + int bckgnd = currentbackground; + + if (colorchange) { + tcolor = currentcolor | bckgnd | currenthilite; + SetConsoleTextAttribute(hConOut, tcolor); + } + WriteConsole(hConOut,&ch,1,&count,0); + colorchange = TRUE; /* force next output back to current nethack values */ + return; + } + void cl_end() { ! DWORD count; ntcoord.X = ttyDisplay->curx; ntcoord.Y = ttyDisplay->cury; + FillConsoleOutputAttribute(hConOut, DEFTEXTCOLOR, + CO - ntcoord.X,ntcoord, &count); + ntcoord.X = ttyDisplay->curx; + ntcoord.Y = ttyDisplay->cury; FillConsoleOutputCharacter(hConOut,' ', CO - ntcoord.X,ntcoord,&count); tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); + colorchange = TRUE; } void clear_screen() { ! if (GetConsoleScreenBufferInfo(hConOut,&csbi)) { ! DWORD ccnt; ! COORD newcoord; ! ! newcoord.X = 0; ! newcoord.Y = 0; ! FillConsoleOutputAttribute(hConOut, ! FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, ! csbi.dwSize.X * csbi.dwSize.Y, ! newcoord, &ccnt); ! newcoord.X = 0; ! newcoord.Y = 0; ! FillConsoleOutputCharacter(hConOut,' ', ! csbi.dwSize.X * csbi.dwSize.Y, ! newcoord, &ccnt); ! } ! colorchange = TRUE; home(); } *************** *** 559,565 **** if (csbi.dwCursorPosition.X > 0) ntcoord.X = csbi.dwCursorPosition.X-1; ntcoord.Y = csbi.dwCursorPosition.Y; ! SetConsoleCursorPosition(hConOut,ntcoord); WriteConsole(hConOut," ",1,&count,0); SetConsoleCursorPosition(hConOut,ntcoord); } --- 622,634 ---- if (csbi.dwCursorPosition.X > 0) ntcoord.X = csbi.dwCursorPosition.X-1; ntcoord.Y = csbi.dwCursorPosition.Y; ! SetConsoleCursorPosition(hConOut,ntcoord); ! /* colorchange shouldn't ever happen here but.. */ ! if (colorchange) { ! SetConsoleTextAttribute(hConOut, ! (currentcolor|currenthilite|currentbackground)); ! colorchange = FALSE; ! } WriteConsole(hConOut," ",1,&count,0); SetConsoleCursorPosition(hConOut,ntcoord); } *************** *** 571,600 **** Beep(8000,500); } void tty_delay_output() { /* delay 50 ms - uses ANSI C clock() function now */ clock_t goal; goal = 50 + clock(); while (goal > clock()) { ! /* Do nothing */ } } void cl_eos() { ! ! register int cy = ttyDisplay->cury+1; while(cy <= LI-2) { cl_end(); xputc('\n'); cy++; } cl_end(); tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } --- 640,690 ---- Beep(8000,500); } + volatile int junk; /* prevent optimizer from eliminating loop below */ void tty_delay_output() { /* delay 50 ms - uses ANSI C clock() function now */ clock_t goal; + int k; goal = 50 + clock(); while (goal > clock()) { ! k = junk; /* Do nothing */ } } void cl_eos() { ! register int cy = ttyDisplay->cury+1; ! #if 0 while(cy <= LI-2) { cl_end(); xputc('\n'); cy++; } cl_end(); + #else + if (GetConsoleScreenBufferInfo(hConOut,&csbi)) { + int ccnt; + COORD newcoord; + + newcoord.X = 0; + newcoord.Y = ttyDisplay->cury; + FillConsoleOutputAttribute(hConOut, + FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, + csbi.dwSize.X * csbi.dwSize.Y - cy, + newcoord, &ccnt); + newcoord.X = 0; + newcoord.Y = ttyDisplay->cury; + FillConsoleOutputCharacter(hConOut,' ', + csbi.dwSize.X * csbi.dwSize.Y - cy, + newcoord, &ccnt); + } + colorchange = TRUE; + #endif tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } *************** *** 646,652 **** ttycolors[CLR_WHITE] = FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|\ FOREGROUND_INTENSITY; } - # endif /* TEXTCOLOR */ int --- 736,741 ---- *************** *** 655,671 **** # ifdef TEXTCOLOR return 1; # else ! return 0; # endif } void term_end_attr(int attr) { ! /* Mix all three colors for white on NT console */ ! SetConsoleTextAttribute(hConOut, ! FOREGROUND_RED|FOREGROUND_BLUE| ! FOREGROUND_GREEN); } void --- 744,782 ---- # ifdef TEXTCOLOR return 1; # else ! if (color == CLR_BLACK) ! return 1; ! else if (color == CLR_WHITE) ! return 1; ! else ! return 0; # endif } void term_end_attr(int attr) { ! switch(attr){ ! ! case ATR_ULINE: ! case ATR_BOLD: ! case ATR_BLINK: ! standoutend(); ! break; ! case ATR_INVERSE: ! if (currentcolor == 0) ! currentcolor = FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED; ! currentbackground = 0; ! colorchange = TRUE; ! break; ! default: ! standoutend(); ! if (currentcolor == 0) ! currentcolor = FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED; ! currentbackground = 0; ! currenthilite = 0; ! break; ! } } void *************** *** 675,689 **** case ATR_ULINE: case ATR_BOLD: - /* Mix all three colors for white on NT console */ - SetConsoleTextAttribute(hConOut, - FOREGROUND_RED|FOREGROUND_BLUE| - FOREGROUND_GREEN|FOREGROUND_INTENSITY ); - break; case ATR_BLINK: case ATR_INVERSE: default: ! term_end_attr(0); break; } } --- 786,804 ---- case ATR_ULINE: case ATR_BOLD: case ATR_BLINK: + standoutbeg(); + break; case ATR_INVERSE: + /* Suggestion by Lee Berger */ + if ((currentcolor & (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED)) == + (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED)) + currentcolor = 0; + currentbackground = (BACKGROUND_RED|BACKGROUND_BLUE|BACKGROUND_GREEN); + colorchange = TRUE; + break; default: ! standoutend(); break; } } *************** *** 704,714 **** term_start_color(int color) { # ifdef TEXTCOLOR - WORD attr; - if (color >= 0 && color < CLR_MAX) { ! attr = (WORD)ttycolors[color]; ! SetConsoleTextAttribute(hConOut,attr); } # endif } --- 819,827 ---- term_start_color(int color) { # ifdef TEXTCOLOR if (color >= 0 && color < CLR_MAX) { ! currentcolor = ttycolors[color]; ! colorchange = TRUE; } # endif } *************** *** 717,746 **** term_end_color(void) { # ifdef TEXTCOLOR ! SetConsoleTextAttribute(hConOut, ! FOREGROUND_RED|FOREGROUND_BLUE| ! FOREGROUND_GREEN); ! # endif } void standoutbeg() { ! /* Mix all three colors for white on NT console */ ! SetConsoleTextAttribute(hConOut, ! FOREGROUND_RED|FOREGROUND_BLUE| ! FOREGROUND_GREEN|FOREGROUND_INTENSITY ); } void standoutend() { ! /* Mix all three colors for white on NT console */ ! SetConsoleTextAttribute(hConOut, ! FOREGROUND_RED|FOREGROUND_BLUE| ! FOREGROUND_GREEN); } #endif /* WIN32CON */ --- 830,854 ---- term_end_color(void) { # ifdef TEXTCOLOR ! currentcolor = DEFTEXTCOLOR; ! colorchange = TRUE; ! # endif } void standoutbeg() { ! currenthilite = FOREGROUND_INTENSITY; ! colorchange = TRUE; } void standoutend() { ! currenthilite = 0; ! colorchange = TRUE; } #endif /* WIN32CON */ *** nethack-3.3.1/sys/winnt/win32api.h Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/win32api.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)win32api.h 3.3 96/02/15 */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)win32api.h 3.4 1996/02/15 */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/sys/winnt/winnt.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/sys/winnt/winnt.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winnt.c 3.3 97/04/12 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winnt.c 3.4 1997/04/12 */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,18 **** --- 12,20 ---- #define NEED_VARARGS #include "hack.h" #include + #ifndef __BORLANDC__ #include + #endif #include #include "win32api.h" *************** *** 159,165 **** nt_regularize(s) /* normalize file name */ register char *s; { ! register char *lp; for (lp = s; *lp; lp++) if ( *lp == '?' || *lp == '"' || *lp == '\\' || --- 161,167 ---- nt_regularize(s) /* normalize file name */ register char *s; { ! register unsigned char *lp; for (lp = s; *lp; lp++) if ( *lp == '?' || *lp == '"' || *lp == '\\' || *************** *** 174,184 **** char *get_username(lan_username_size) int *lan_username_size; { ! static char username_buffer[BUFSZ]; unsigned int status; ! int i = 0; - i = BUFSZ - 1; /* i gets updated with actual size */ status = GetUserName(username_buffer, &i); if (status) username_buffer[i] = '\0'; --- 176,185 ---- char *get_username(lan_username_size) int *lan_username_size; { ! static TCHAR username_buffer[BUFSZ]; unsigned int status; ! DWORD i = BUFSZ - 1; /* i gets updated with actual size */ status = GetUserName(username_buffer, &i); if (status) username_buffer[i] = '\0'; *** nethack-3.3.1/util/dgn_comp.l Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/dgn_comp.l Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** %{ ! /* SCCS Id: @(#)dgn_lex.c 3.3 96/03/02 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,5 ---- %{ ! /* SCCS Id: @(#)dgn_lex.c 3.4 1996/03/02 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 74,106 **** extern YYSTYPE yylval; int line_number = 1; - /* - * This is a hack required by Michael Hamel to get things - * working on the Mac. - */ - #if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) - #undef input - #undef unput - #define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; } - # ifndef YYNEWLINE - # define YYNEWLINE 10 - # endif - - char - input() /* Under MPW \n is chr(13)! Compensate for this. */ - { - if (yysptr > yysbuf) return(*--yysptr); - else { - yytchar = getc(yyin); - if (yytchar == '\n') { - yylineno++; - return(YYNEWLINE); - } - if (yytchar == EOF) return(0); - else return(yytchar); - } - } - #endif /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */ %} %% --- 74,79 ---- *** nethack-3.3.1/util/dgn_comp.y Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/dgn_comp.y Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** %{ ! /* SCCS Id: @(#)dgn_comp.c 3.3 96/06/22 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,5 ---- %{ ! /* SCCS Id: @(#)dgn_comp.c 3.4 1996/06/22 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/util/dgn_main.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/dgn_main.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dgn_main.c 3.3 94/09/23 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dgn_main.c 3.4 1994/09/23 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 12,18 **** #include "dlb.h" #ifdef MAC ! # ifdef applec # define MPWTOOL #include # else --- 12,18 ---- #include "dlb.h" #ifdef MAC ! # if defined(__SC__) || defined(__MRC__) # define MPWTOOL #include # else *************** *** 44,50 **** #endif #define Fprintf (void)fprintf ! #ifdef __BORLANDC__ extern unsigned _stklen = STKSIZ; #endif int --- 44,50 ---- #endif #define Fprintf (void)fprintf ! #if defined(__BORLANDC__) && !defined(_WIN32) extern unsigned _stklen = STKSIZ; #endif int *** nethack-3.3.1/util/dlb_main.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/dlb_main.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)dlb_main.c 3.3 98/08/16 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)dlb_main.c 3.4 1998/08/16 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/util/lev_comp.l Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/lev_comp.l Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** %{ ! /* SCCS Id: @(#)lev_lex.c 3.3 96/05/16 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,5 ---- %{ ! /* SCCS Id: @(#)lev_lex.c 3.4 2000/12/22 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 74,107 **** static char map[4096]; static int map_cnt = 0; - /* - * This is a hack required by Michael Hamel to get things - * working on the Mac. - */ - #if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) - #undef input - #undef unput - #define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; } - # ifndef YYNEWLINE - # define YYNEWLINE 10 - # endif - - char - input() /* Under MPW \n is chr(13)! Compensate for this. */ - { - if (yysptr > yysbuf) return(*--yysptr); - else { - yytchar = getc(yyin); - if (yytchar == '\n') { - yylineno++; - return(YYNEWLINE); - } - if (yytchar == EOF) return(0); - else return(yytchar); - } - } - #endif /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */ - %} %e 1500 %p 5000 --- 74,79 ---- *************** *** 116,122 **** map_cnt = 0; return MAP_ID; } ! [-|}{+ABCISHKPLWTF\\#. ]*\n { line_number++; (void) strncpy(map + map_cnt, yytext, yyleng); map_cnt += yyleng; --- 88,94 ---- map_cnt = 0; return MAP_ID; } ! [-|}{+ABCISHKPLWTF\\#. 0123456789]*\n { line_number++; (void) strncpy(map + map_cnt, yytext, yyleng); map_cnt += yyleng; *************** *** 231,236 **** --- 203,209 ---- return STRING; } \n { line_number++; } [ \t]+ ; + '\\.' { yylval.i = yytext[2]; return CHAR; } '.' { yylval.i = yytext[1]; return CHAR; } . { return yytext[0]; } %% *** nethack-3.3.1/util/lev_comp.y Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/lev_comp.y Thu Mar 21 07:37:44 2002 *************** *** 1,5 **** %{ ! /* SCCS Id: @(#)lev_yacc.c 3.3 2000/01/17 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,5 ---- %{ ! /* SCCS Id: @(#)lev_yacc.c 3.4 2000/01/17 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/util/lev_main.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/lev_main.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)lev_main.c 3.3 2000/08/01 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)lev_main.c 3.4 2000/08/01 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 6,11 **** --- 6,13 ---- * This file contains the main function for the parser * and some useful functions needed by yacc */ + #define SPEC_LEV /* for MPW */ + /* although, why don't we move those special defines here.. and in dgn_main? */ #include "hack.h" #include "date.h" *************** *** 15,21 **** #endif #ifdef MAC ! # ifdef applec # define MPWTOOL #include # else --- 17,23 ---- #endif #ifdef MAC ! # if defined(__SC__) || defined(__MRC__) # define MPWTOOL #include # else *************** *** 23,28 **** --- 25,34 ---- # endif #endif + #ifdef WIN_CE + #define PREFIX "\\nethack\\dat\\" + #endif + #ifndef MPWTOOL # define SpinCursor(x) #endif *************** *** 47,53 **** # define OMASK 0644 #endif ! #define NEWLINE 10 /* under Mac MPW C '\n' is 13 so don't use it. */ #define ERR (-1) --- 53,59 ---- # define OMASK 0644 #endif ! #define NEWLINE '\n' /* changes to 13 for MPW */ #define ERR (-1) *************** *** 55,61 **** #define Free(ptr) if(ptr) free((genericptr_t) (ptr)) #define Write(fd, item, size) if (write(fd, (genericptr_t)(item), size) != size) return FALSE; ! #ifdef __BORLANDC__ extern unsigned _stklen = STKSIZ; #endif #define MAX_ERRORS 25 --- 61,67 ---- #define Free(ptr) if(ptr) free((genericptr_t) (ptr)) #define Write(fd, item, size) if (write(fd, (genericptr_t)(item), size) != size) return FALSE; ! #if defined(__BORLANDC__) && !defined(_WIN32) extern unsigned _stklen = STKSIZ; #endif #define MAX_ERRORS 25 *************** *** 142,147 **** --- 148,156 ---- { "zoo", ZOO }, { "delphi", DELPHI }, { "temple", TEMPLE }, + { "anthole", ANTHOLE }, + { "cocknest", COCKNEST }, + { "leprehall", LEPREHALL }, { "shop", SHOPBASE }, { "armor shop", ARMORSHOP }, { "scroll shop", SCROLLSHOP }, *************** *** 507,514 **** int max_hig = 0; char msg[256]; ! /* First : find the max width of the map */ s1 = map; while (s1 && *s1) { s2 = index(s1, NEWLINE); --- 516,528 ---- int max_hig = 0; char msg[256]; ! /* First, strip out digits 0-9 (line numbering) */ ! for (s1 = s2 = map; *s1; s1++) ! if (*s1 < '0' || *s1 > '9') ! *s2++ = *s1; ! *s2 = '\0'; + /* Second, find the max width of the map */ s1 = map; while (s1 && *s1) { s2 = index(s1, NEWLINE); *************** *** 523,529 **** } /* Then parse it now */ - while (map && *map) { tmpmap[max_hig] = (char *) alloc(max_len); s1 = index(map, NEWLINE); --- 537,542 ---- *************** *** 1105,1111 **** --- 1118,1128 ---- Strcat(lbuf, filename); Strcat(lbuf, LEV_EXT); + #if defined(MAC) && (defined(__SC__) || defined(__MRC__)) + fout = open(lbuf, O_WRONLY|O_CREAT|O_BINARY); + #else fout = open(lbuf, O_WRONLY|O_CREAT|O_BINARY, OMASK); + #endif if (fout < 0) return FALSE; if (room_level) { *************** *** 1150,1157 **** Write(fd, &(pt->ysize), sizeof(pt->ysize)); for(j=0;jysize;j++) { if(!maze->init_lev.init_present || ! pt->xsize > 1 || pt->ysize > 1) ! Write(fd, pt->map[j], pt->xsize * sizeof *pt->map[j]); Free(pt->map[j]); } Free(pt->map); --- 1167,1185 ---- Write(fd, &(pt->ysize), sizeof(pt->ysize)); for(j=0;jysize;j++) { if(!maze->init_lev.init_present || ! pt->xsize > 1 || pt->ysize > 1) { ! #if !defined(_MSC_VER) && !defined(__BORLANDC__) ! Write(fd, pt->map[j], pt->xsize * sizeof *pt->map[j]); ! #else ! /* ! * On MSVC and Borland C compilers the Write macro above caused: ! * warning '!=' : signed/unsigned mismatch ! */ ! unsigned reslt, sz = pt->xsize * sizeof *pt->map[j]; ! reslt = write(fd, (genericptr_t)(pt->map[j]), sz); ! if (reslt != sz) return FALSE; ! #endif ! } Free(pt->map[j]); } Free(pt->map); *************** *** 1300,1306 **** return FALSE; /* The gold piles */ ! Write(fd, &(pt->ngold), sizeof(pt->naltar)); for(j=0;jngold;j++) { Write(fd, pt->golds[j], sizeof(gold)); Free(pt->golds[j]); --- 1328,1334 ---- return FALSE; /* The gold piles */ ! Write(fd, &(pt->ngold), sizeof(pt->ngold)); for(j=0;jngold;j++) { Write(fd, pt->golds[j], sizeof(gold)); Free(pt->golds[j]); *** nethack-3.3.1/util/makedefs.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/makedefs.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)makedefs.c 3.3 1999/08/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) M. Stephenson, 1990, 1991. */ /* Copyright (c) Dean Luick, 1990. */ --- 1,4 ---- ! /* SCCS Id: @(#)makedefs.c 3.4 2002/03/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) M. Stephenson, 1990, 1991. */ /* Copyright (c) Dean Luick, 1990. */ *************** *** 27,33 **** #endif #ifdef MAC ! # ifdef applec /* Means the MPW compiler, I hope */ # define MPWTOOL #include #include --- 27,33 ---- #endif #ifdef MAC ! # if defined(__SC__) || defined(__MRC__) /* MPW compilers */ # define MPWTOOL #include #include *************** *** 49,62 **** #endif #if defined(UNIX) && !defined(LINT) && !defined(GCC_WARN) ! static const char SCCS_Id[] = "@(#)makedefs.c\t3.3\t1999/08/16"; #endif /* names of files to be generated */ #define DATE_FILE "date.h" #define MONST_FILE "pm.h" #define ONAME_FILE "onames.h" #define OPTIONS_FILE "options" #define ORACLE_FILE "oracles" #define DATA_FILE "data" #define RUMOR_FILE "rumors" --- 49,64 ---- #endif #if defined(UNIX) && !defined(LINT) && !defined(GCC_WARN) ! static const char SCCS_Id[] = "@(#)makedefs.c\t3.4\t2002/02/03"; #endif /* names of files to be generated */ #define DATE_FILE "date.h" #define MONST_FILE "pm.h" #define ONAME_FILE "onames.h" + #ifndef OPTIONS_FILE #define OPTIONS_FILE "options" + #endif #define ORACLE_FILE "oracles" #define DATA_FILE "data" #define RUMOR_FILE "rumors" *************** *** 75,103 **** # define DGN_TEMPLATE "NH:dat/%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE "NH:slib/%s" # define DATA_IN_TEMPLATE "NH:dat/%s" ! #else # ifdef MAC # define INCLUDE_TEMPLATE ":include:%s" # define SOURCE_TEMPLATE ":src:%s" # define DGN_TEMPLATE ":dat:%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE ":lib:%s" # define DATA_IN_TEMPLATE ":dat:%s" ! # else /* MAC */ # ifdef OS2 # define INCLUDE_TEMPLATE "..\\include\\%s" # define SOURCE_TEMPLATE "..\\src\\%s" # define DGN_TEMPLATE "..\\dat\\%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE "..\\dat\\%s" # define DATA_IN_TEMPLATE "..\\dat\\%s" ! # else /* OS2 */ # define INCLUDE_TEMPLATE "../include/%s" # define SOURCE_TEMPLATE "../src/%s" # define DGN_TEMPLATE "../dat/%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE "../dat/%s" # define DATA_IN_TEMPLATE "../dat/%s" ! # endif /* OS2 */ ! # endif /* MAC */ ! #endif /* AMIGA */ static const char *Dont_Edit_Code = --- 77,109 ---- # define DGN_TEMPLATE "NH:dat/%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE "NH:slib/%s" # define DATA_IN_TEMPLATE "NH:dat/%s" ! #else /* not AMIGA */ # ifdef MAC # define INCLUDE_TEMPLATE ":include:%s" # define SOURCE_TEMPLATE ":src:%s" # define DGN_TEMPLATE ":dat:%s" /* where dungeon.pdf file goes */ + # if __SC__ || __MRC__ + # define DATA_TEMPLATE ":Dungeon:%s" + # else # define DATA_TEMPLATE ":lib:%s" + # endif /* __SC__ || __MRC__ */ # define DATA_IN_TEMPLATE ":dat:%s" ! # else /* neither AMIGA nor MAC */ # ifdef OS2 # define INCLUDE_TEMPLATE "..\\include\\%s" # define SOURCE_TEMPLATE "..\\src\\%s" # define DGN_TEMPLATE "..\\dat\\%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE "..\\dat\\%s" # define DATA_IN_TEMPLATE "..\\dat\\%s" ! # else /* not AMIGA, MAC, or OS2 */ # define INCLUDE_TEMPLATE "../include/%s" # define SOURCE_TEMPLATE "../src/%s" # define DGN_TEMPLATE "../dat/%s" /* where dungeon.pdf file goes */ # define DATA_TEMPLATE "../dat/%s" # define DATA_IN_TEMPLATE "../dat/%s" ! # endif /* else !OS2 */ ! # endif /* else !MAC */ ! #endif /* else !AMIGA */ static const char *Dont_Edit_Code = *************** *** 191,197 **** /* input, output, tmp */ static FILE *ifp, *ofp, *tfp; ! #ifdef __BORLANDC__ extern unsigned _stklen = STKSIZ; #endif --- 197,203 ---- /* input, output, tmp */ static FILE *ifp, *ofp, *tfp; ! #if defined(__BORLANDC__) && !defined(_WIN32) extern unsigned _stklen = STKSIZ; #endif *************** *** 441,446 **** --- 447,455 ---- #ifdef STEED | (1L << 11) #endif + #ifdef GOLDOBJ + | (1L << 12) + #endif /* flag bits and/or other global variables (15..26) */ #ifdef TEXTCOLOR | (1L << 17) *************** *** 536,542 **** perror(filename); exit(EXIT_FAILURE); } ! Fprintf(ofp,"/*\tSCCS Id: @(#)date.h\t3.3\t1996/05/17 */\n\n"); Fprintf(ofp,Dont_Edit_Code); #ifdef KR1ED --- 545,551 ---- perror(filename); exit(EXIT_FAILURE); } ! Fprintf(ofp,"/*\tSCCS Id: @(#)date.h\t3.4\t2002/02/03 */\n\n"); Fprintf(ofp,Dont_Edit_Code); #ifdef KR1ED *************** *** 575,581 **** Fprintf(ofp,"#define AMIGA_VERSION_STRING "); Fprintf(ofp,"\"\\0$VER: NetHack %d.%d.%d (%d.%d.%d)\"\n", VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, ! tm->tm_mday, tm->tm_mon+1, tm->tm_year); } #endif Fclose(ofp); --- 584,590 ---- Fprintf(ofp,"#define AMIGA_VERSION_STRING "); Fprintf(ofp,"\"\\0$VER: NetHack %d.%d.%d (%d.%d.%d)\"\n", VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, ! tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900); } #endif Fclose(ofp); *************** *** 613,618 **** --- 622,630 ---- #ifdef MFLOPPY "floppy drive support", #endif + #ifdef GOLDOBJ + "gold object in inventories", + #endif #ifdef INSURANCE "insurance files for recovering from crashes", #endif *************** *** 661,683 **** # ifdef MAC "screen control via mactty", # endif - # ifdef SCREEN_8514 - "screen control via 8514/A graphics", - # endif # ifdef SCREEN_BIOS "screen control via BIOS", # endif # ifdef SCREEN_DJGPPFAST "screen control via DJGPP fast", # endif - # ifdef SCREEN_VESA - "screen control via VESA graphics", - # endif # ifdef SCREEN_VGA "screen control via VGA graphics", # endif ! # ifdef WIN32CON "screen control via WIN32 console I/O", # endif #endif #ifdef SEDUCE --- 673,691 ---- # ifdef MAC "screen control via mactty", # endif # ifdef SCREEN_BIOS "screen control via BIOS", # endif # ifdef SCREEN_DJGPPFAST "screen control via DJGPP fast", # endif # ifdef SCREEN_VGA "screen control via VGA graphics", # endif ! # ifndef MSWIN_GRAPHICS ! # ifdef WIN32CON "screen control via WIN32 console I/O", + # endif # endif #endif #ifdef SEDUCE *************** *** 742,749 **** #ifdef GEM_GRAPHICS "Gem", #endif ! #ifdef WIN32_GRAPHICS ! "Win32", #endif #ifdef BEOS_GRAPHICS "BeOS InterfaceKit", --- 750,757 ---- #ifdef GEM_GRAPHICS "Gem", #endif ! #ifdef MSWIN_GRAPHICS ! "mswin", #endif #ifdef BEOS_GRAPHICS "BeOS InterfaceKit", *************** *** 1332,1338 **** perror(filename); exit(EXIT_FAILURE); } ! Fprintf(ofp,"/*\tSCCS Id: @(#)pm.h\t3.3\t1994/09/10 */\n\n"); Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#ifndef PM_H\n#define PM_H\n"); --- 1340,1346 ---- perror(filename); exit(EXIT_FAILURE); } ! Fprintf(ofp,"/*\tSCCS Id: @(#)pm.h\t3.4\t2002/02/03 */\n\n"); Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#ifndef PM_H\n#define PM_H\n"); *************** *** 1645,1651 **** perror(filename); exit(EXIT_FAILURE); } ! Fprintf(ofp,"/*\tSCCS Id: @(#)onames.h\t3.3\t1994/09/10 */\n\n"); Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#ifndef ONAMES_H\n#define ONAMES_H\n\n"); --- 1653,1659 ---- perror(filename); exit(EXIT_FAILURE); } ! Fprintf(ofp,"/*\tSCCS Id: @(#)onames.h\t3.4\t2002/02/03 */\n\n"); Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#ifndef ONAMES_H\n#define ONAMES_H\n\n"); *** nethack-3.3.1/util/panic.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/panic.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)panic.c 3.3 94/03/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)panic.c 3.4 1994/03/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/util/recover.c Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/util/recover.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)recover.c 3.3 99/10/23 */ /* Copyright (c) Janet Walz, 1992. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)recover.c 3.4 1999/10/23 */ /* Copyright (c) Janet Walz, 1992. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 26,32 **** --- 26,38 ---- int NDECL(create_savefile); void FDECL(copy_bytes, (int,int)); + #ifndef WIN_CE #define Fprintf (void)fprintf + #else + #define Fprintf (void)nhce_message + static void nhce_message(FILE*, const char*, ...); + #endif + #define Close (void)close #ifdef UNIX *************** *** 47,53 **** char *FDECL(exepath, (char *)); #endif ! #ifdef __BORLANDC__ extern unsigned _stklen = STKSIZ; #endif char savename[SAVESIZE]; /* holds relative path of save file from playground */ --- 53,59 ---- char *FDECL(exepath, (char *)); #endif ! #if defined(__BORLANDC__) && !defined(_WIN32) extern unsigned _stklen = STKSIZ; #endif char savename[SAVESIZE]; /* holds relative path of save file from playground */ *************** *** 340,350 **** if (!str) return (char *)0; bsize = EXEPATHBUFSZ; tmp = exepathbuf; ! # ifndef WIN32 strcpy (tmp, str); # else *(tmp + GetModuleFileName((HANDLE)0, tmp, bsize)) = '\0'; # endif tmp2 = strrchr(tmp, PATH_SEPARATOR); if (tmp2) *tmp2 = '\0'; return tmp; --- 346,364 ---- if (!str) return (char *)0; bsize = EXEPATHBUFSZ; tmp = exepathbuf; ! #if !defined(WIN32) strcpy (tmp, str); + #else + # if defined(WIN_CE) + { + TCHAR wbuf[EXEPATHBUFSZ]; + GetModuleFileName((HANDLE)0, wbuf, EXEPATHBUFSZ); + NH_W2A(wbuf, tmp, bsize); + } # else *(tmp + GetModuleFileName((HANDLE)0, tmp, bsize)) = '\0'; # endif + #endif tmp2 = strrchr(tmp, PATH_SEPARATOR); if (tmp2) *tmp2 = '\0'; return tmp; *************** *** 354,359 **** --- 368,388 ---- #ifdef AMIGA #include "date.h" const char amiga_version_string[] = AMIGA_VERSION_STRING; + #endif + + #ifdef WIN_CE + void nhce_message(FILE* f, const char* str, ...) + { + va_list ap; + TCHAR wbuf[NHSTR_BUFSIZE]; + char buf[NHSTR_BUFSIZE]; + + va_start(ap, str); + vsprintf(buf, str, ap); + va_end(ap); + + MessageBox(NULL, NH_A2W(buf, wbuf, NHSTR_BUFSIZE), TEXT("Recover"), MB_OK); + } #endif /*recover.c*/ *** nethack-3.3.1/win/gem/Install.gem Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gem/Install.gem Thu Mar 21 07:37:44 2002 *************** *** 1,6 **** Hi, ! This is nethack3.3.1 for Atari Gem and tty Windowing System. It is by far not complete or perfect. --- 1,6 ---- Hi, ! This is nethack3.4.0 for Atari Gem and tty Windowing System. It is by far not complete or perfect. *** nethack-3.3.1/win/gem/load_img.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gem/load_img.c Thu Mar 21 07:37:44 2002 *************** *** 37,43 **** if(i<16) idx=vdi2dev4[i]; else ! idx=i; } vq_color(handle, i, 0, (int *)palette + idx * 3); } --- 37,43 ---- if(i<16) idx=vdi2dev4[i]; else ! idx= i==255 ? 1 : i; } vq_color(handle, i, 0, (int *)palette + idx * 3); } *************** *** 49,55 **** /* set color palette */ end=min(1< pic->img_h) scan_repeat = pic->img_h - line; - /* copy line to image buffer */ if(scan_repeat>1){ /* calculate address of a current line in a current bitplane */ --- 239,244 ---- *** nethack-3.3.1/win/gem/wingem.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gem/wingem.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wingem.c 3.3 1999/12/10 */ /* Copyright (c) Christian Bressler, 1999 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wingem.c 3.4 1999/12/10 */ /* Copyright (c) Christian Bressler, 1999 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 21,32 **** --- 21,48 ---- static char *FDECL(copy_of, (const char *)); static void FDECL(bail, (const char *)); /* __attribute__((noreturn)) */ + extern int mar_set_tile_mode(int); + extern void mar_set_font(int,const char*,int); + extern void mar_set_margin(int); + extern void mar_set_msg_visible(int); + extern void mar_set_status_align(int); + extern void mar_set_msg_align(int); + extern void mar_set_tilefile(char *); + extern void mar_set_tilex(int); + extern void mar_set_tiley(int); extern short glyph2tile[MAX_GLYPH]; /* from tile.c */ extern void mar_display_nhwindow(winid); /* from wingem1.c */ + void Gem_outrip(winid,int); + void Gem_preference_update(const char *); /* Interface definition, for windows.c */ struct window_procs Gem_procs = { "Gem", + WC_COLOR|WC_HILITE_PET|WC_ALIGN_MESSAGE|WC_ALIGN_STATUS| + WC_INVERSE|WC_SCROLL_MARGIN| + 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_FONTSIZ_MAP| + WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT|WC_ASCII_MAP, Gem_init_nhwindows, Gem_player_selection, Gem_askname, *************** *** 79,85 **** /* other defs that really should go away (they're tty specific) */ Gem_start_screen, Gem_end_screen, ! genl_outrip }; #ifdef MAC --- 95,102 ---- /* other defs that really should go away (they're tty specific) */ Gem_start_screen, Gem_end_screen, ! Gem_outrip, ! Gem_preference_update }; #ifdef MAC *************** *** 115,120 **** --- 132,142 ---- return(iflags.msg_history); } + int + mar_get_msg_visible() + { + return(iflags.wc_vary_msgcount); + } /* clean up and quit */ static void bail(mesg) *************** *** 126,131 **** --- 148,164 ---- /*NOTREACHED*/ } + /*$$$*/ + #define DEF_CLIPAROUND_MARGIN -1 + #ifndef TILE_X + #define TILE_X 16 + #endif + #define TILE_Y 16 + #define TILES_PER_LINE 20 + #define NHFONT_DEFAULT_SIZE 10 + #define NHFONT_SIZE_MIN 3 + #define NHFONT_SIZE_MAX 20 + /*$$$*/ /*ARGSUSED*/ void Gem_init_nhwindows(argcp,argv) *************** *** 135,140 **** --- 168,209 ---- argv=argv, argcp=argcp; colors_changed=TRUE; + set_wc_option_mod_status( + WC_ALIGN_MESSAGE | + WC_ALIGN_STATUS | + WC_TILE_WIDTH | + WC_TILE_HEIGHT | + WC_TILE_FILE, + DISP_IN_GAME); + set_wc_option_mod_status( + WC_HILITE_PET | + WC_SCROLL_MARGIN | + WC_FONT_MESSAGE | + WC_FONT_MAP | + WC_FONT_STATUS | + WC_FONT_MENU | + WC_FONT_TEXT | + WC_FONTSIZ_MESSAGE | + WC_FONTSIZ_MAP | + WC_FONTSIZ_STATUS | + WC_FONTSIZ_MENU | + WC_FONTSIZ_TEXT | + WC_VARY_MSGCOUNT, + SET_IN_GAME + ); + if( iflags.wc_align_message==0 ) iflags.wc_align_message = ALIGN_TOP; + if( iflags.wc_align_status==0 ) iflags.wc_align_status = ALIGN_BOTTOM; + 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_tile_file && *iflags.wc_tile_file) + mar_set_tilefile(iflags.wc_tile_file); + if( iflags.wc_vary_msgcount==0 ) iflags.wc_vary_msgcount = 3; + mar_set_tile_mode(!iflags.wc_ascii_map); /* MAR -- 17.Mar 2002 True is tiles */ + mar_set_tilex(iflags.wc_tile_width); + mar_set_tiley(iflags.wc_tile_height); + mar_set_msg_align(iflags.wc_align_message-ALIGN_BOTTOM); + mar_set_status_align(iflags.wc_align_status-ALIGN_BOTTOM); if(mar_gem_init()==0){ bail((char *)0); /*NOTREACHED*/ *************** *** 157,166 **** anything any; menu_item *selected=NULL; /* Should we randomly pick for the player? */ ! if (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE || ! flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE) { ! pick4u = yn_function("Shall I pick a character for you? [ynq]",ynqchars,'n'); if(pick4u=='q'){ give_up: /* Just quit */ if (selected) free((genericptr_t) selected); --- 226,244 ---- anything any; menu_item *selected=NULL; + /* avoid unnecessary prompts further down */ + 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)) { ! /* pick4u = yn_function("Shall I pick a character for you? [ynq]",ynqchars,'n');*/ ! pick4u = yn_function( ! build_plselection_prompt(pbuf, QBUFSZ, flags.initrole,flags.initrace, ! flags.initgend, flags.initalign) ! ,ynqchars,'n' ! ); if(pick4u=='q'){ give_up: /* Just quit */ if (selected) free((genericptr_t) selected); *************** *** 174,183 **** if (flags.initrole < 0) { /* Process the choice */ ! if(pick4u=='y' || flags.initrole == ROLE_RANDOM) { /* Pick a random role */ flags.initrole = pick_role(flags.initrace, flags.initgend, ! flags.initalign); if (flags.initrole < 0) { mar_add_message("Incompatible role!"); mar_display_nhwindow(WIN_MESSAGE); --- 252,261 ---- if (flags.initrole < 0) { /* 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) { mar_add_message("Incompatible role!"); mar_display_nhwindow(WIN_MESSAGE); *************** *** 201,207 **** } } any.a_int = pick_role(flags.initrace, flags.initgend, ! flags.initalign)+1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randrole()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, --- 279,285 ---- } } 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()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, *************** *** 227,235 **** * 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.initrace = pick_race(flags.initrole, flags.initgend, ! flags.initalign); if (flags.initrace < 0) { mar_add_message("Incompatible race!"); mar_display_nhwindow(WIN_MESSAGE); --- 305,313 ---- * 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) { mar_add_message("Incompatible race!"); mar_display_nhwindow(WIN_MESSAGE); *************** *** 254,260 **** } } } - /* Permit the user to pick, if there is more than one */ if (n > 1) { win = create_nhwindow(NHW_MENU); --- 332,337 ---- *************** *** 268,274 **** 0, ATR_NONE, races[i].noun, MENU_UNSELECTED); } any.a_int = pick_race(flags.initrole, flags.initgend, ! flags.initalign)+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, --- 345,351 ---- 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, *************** *** 283,289 **** 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; } --- 360,365 ---- *************** *** 297,305 **** if (flags.initgend < 0 || !validgend(flags.initrole, flags.initrace, flags.initgend)) { /* pre-selected gender not valid */ ! if (pick4u == 'y' || flags.initgend == ROLE_RANDOM) { flags.initgend = pick_gend(flags.initrole, flags.initrace, ! flags.initalign); if (flags.initgend < 0) { mar_add_message("Incompatible gender!"); mar_display_nhwindow(WIN_MESSAGE); --- 373,381 ---- 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) { mar_add_message("Incompatible gender!"); mar_display_nhwindow(WIN_MESSAGE); *************** *** 324,330 **** } } } - /* Permit the user to pick, if there is more than one */ if (n > 1) { win = create_nhwindow(NHW_MENU); --- 400,405 ---- *************** *** 338,344 **** 0, ATR_NONE, genders[i].adj, MENU_UNSELECTED); } any.a_int = pick_gend(flags.initrole, flags.initrace, ! flags.initalign)+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, --- 413,419 ---- 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, *************** *** 354,360 **** 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; } --- 429,434 ---- *************** *** 367,375 **** if (flags.initalign < 0 || !validalign(flags.initrole, flags.initrace, flags.initalign)) { /* pre-selected alignment not valid */ ! if (pick4u == 'y' || flags.initalign == ROLE_RANDOM) { flags.initalign = pick_align(flags.initrole, flags.initrace, ! flags.initgend); if (flags.initalign < 0) { mar_add_message("Incompatible alignment!"); mar_display_nhwindow(WIN_MESSAGE); --- 441,449 ---- 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) { mar_add_message("Incompatible alignment!"); mar_display_nhwindow(WIN_MESSAGE); *************** *** 394,400 **** } } } - /* Permit the user to pick, if there is more than one */ if (n > 1) { win = create_nhwindow(NHW_MENU); --- 468,473 ---- *************** *** 408,414 **** 0, ATR_NONE, aligns[i].adj, MENU_UNSELECTED); } any.a_int = pick_align(flags.initrole, flags.initrace, ! flags.initgend)+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, --- 481,487 ---- 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, *************** *** 427,433 **** 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; } --- 500,505 ---- *************** *** 643,648 **** --- 715,722 ---- Gem_putstr(WIN_MESSAGE,0,str); else mar_map_curs_weiter(); + mar_display_nhwindow(WIN_MESSAGE); + mar_display_nhwindow(WIN_STATUS); break; case NHW_MENU: *************** *** 827,833 **** #endif extern void mar_add_pet_sign(winid,int,int); - extern int mar_set_tile_mode(int); void Gem_print_glyph(window, x, y, glyph) --- 901,906 ---- *************** *** 845,854 **** x--; /* MAR -- because x ranges from 1 to COLNO */ if(mar_set_tile_mode(-1)){ mar_print_glyph(window,x,y,glyph2tile[glyph]); ! if(glyph_is_pet(glyph) #ifdef TEXTCOLOR ! && iflags.hilite_pet #endif ) mar_add_pet_sign(window,x,y); }else --- 918,928 ---- x--; /* MAR -- because x ranges from 1 to COLNO */ if(mar_set_tile_mode(-1)){ mar_print_glyph(window,x,y,glyph2tile[glyph]); ! if( #ifdef TEXTCOLOR ! iflags.hilite_pet && #endif + glyph_is_pet(glyph) ) mar_add_pet_sign(window,x,y); }else *************** *** 862,939 **** xchar x, y; int glyph; { ! uchar ch; ! register int offset; ! #ifdef TEXTCOLOR int color; ! #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 invis_color(n) color = NO_COLOR ! #define pet_color(n) color = iflags.use_color ? mons[n].mcolor : \ ! /* If no color, try to hilite pets; black */ \ ! /* should be HI */ \ ! ((iflags.hilite_pet) ? CLR_BLACK : 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 invis_color(n) ! #define pet_color(c) ! #define warn_color(c) ! #endif /* no text color */ ! ! /* ! * Map the glyph back to a character. ! * ! * Warning: For speed, this makes an assumption on the order of ! * offsets. The order is set in display.h. ! */ ! if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ ! ch = warnsyms[offset]; ! warn_color(offset); ! } else ! if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ ! /* see swallow_to_glyph() in display.c */ ! ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; ! mon_color(offset >> 3); ! } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ ! /* see zapdir_to_glyph() in display.c */ ! ch = showsyms[S_vbeam + (offset & 0x3)]; ! zap_color((offset >> 2)); ! } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ ! ch = showsyms[offset]; ! cmap_color(offset); ! } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ ! ch = oc_syms[(int)objects[offset].oc_class]; ! obj_color(offset); ! } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */ ! ch = monsyms[(int)mons[offset].mlet]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ ! ch = oc_syms[(int)objects[CORPSE].oc_class]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */ ! ch = monsyms[(int)mons[offset].mlet]; ! mon_color(offset); ! /* Disabled for now; anyone want to get reverse video to work? */ ! /* is_reverse = TRUE; */ ! } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ ! ch = DEF_INVISIBLE; ! invis_color(offset); ! } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ ! ch = monsyms[(int)mons[offset].mlet]; ! pet_color(offset); ! } else { /* a monster */ ! ch = monsyms[(int)mons[glyph].mlet]; ! mon_color(glyph); ! } #ifdef TEXTCOLOR /* Turn off color if rogue level. */ --- 936,947 ---- xchar x, y; int glyph; { ! int ch; int color; + unsigned special; ! /* map glyph to character and color */ ! mapglyph(glyph, &ch, &color, &special, x, y); #ifdef TEXTCOLOR /* Turn off color if rogue level. */ *************** *** 1038,1043 **** --- 1046,1227 ---- {} #endif + /** Gem_outrip **/ + void mar_set_text_to_rip(winid); + char** rip_line=0; + extern const char *killed_by_prefix[]; + void + Gem_outrip(w, how) + winid w; + int how; + { + /* Code from X11 windowport */ + #define STONE_LINE_LEN 15 /* # chars that fit on one line */ + #define NAME_LINE 0 /* line # for player name */ + #define GOLD_LINE 1 /* line # for amount of gold */ + #define DEATH_LINE 2 /* line # for death description */ + #define YEAR_LINE 6 /* line # for year */ + char buf[BUFSZ]; + char *dpx; + int line; + if (!rip_line) { + int i; + rip_line= (char **)malloc((YEAR_LINE+1)*sizeof(char *)); + for (i=0; i STONE_LINE_LEN) { + for(i = STONE_LINE_LEN; + ((i0 > STONE_LINE_LEN) && i); i--) + if(dpx[i] == ' ') i0 = i; + if(!i) i0 = STONE_LINE_LEN; + } + tmpchar = dpx[i0]; + dpx[i0] = 0; + strcpy(rip_line[line], dpx); + if (tmpchar != ' ') { + dpx[i0] = tmpchar; + dpx= &dpx[i0]; + } else dpx= &dpx[i0+1]; + } + /* Put year on stone */ + Sprintf(rip_line[YEAR_LINE], "%4d", getyear()); + mar_set_text_to_rip(w); + for(line=0;line<13;line++) + putstr(w, 0, ""); + } + void + mar_get_font(type,p_fname,psize) + int type; + char **p_fname; + int *psize; + { + switch(type){ + case NHW_MESSAGE: + *p_fname=iflags.wc_font_message; + *psize=iflags.wc_fontsiz_message; + break; + case NHW_MAP: + *p_fname=iflags.wc_font_map; + *psize=iflags.wc_fontsiz_map; + break; + case NHW_STATUS: + *p_fname=iflags.wc_font_status; + *psize=iflags.wc_fontsiz_status; + break; + case NHW_MENU: + *p_fname=iflags.wc_font_menu; + *psize=iflags.wc_fontsiz_menu; + break; + case NHW_TEXT: + *p_fname=iflags.wc_font_text; + *psize=iflags.wc_fontsiz_text; + break; + default: + break; + } + } + void + Gem_preference_update(pref) + const char *pref; + { + if( stricmp( pref, "font_message")==0 || + stricmp( pref, "font_size_message")==0 ) { + if( iflags.wc_fontsiz_messageNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_message = NHFONT_DEFAULT_SIZE; + mar_set_font(NHW_MESSAGE,iflags.wc_font_message,iflags.wc_fontsiz_message); + return; + } + if( stricmp( pref, "font_map")==0 || + stricmp( pref, "font_size_map")==0 ) { + if( iflags.wc_fontsiz_mapNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_map = NHFONT_DEFAULT_SIZE; + mar_set_font(NHW_MAP,iflags.wc_font_map,iflags.wc_fontsiz_map); + return; + } + if( stricmp( pref, "font_status")==0 || + stricmp( pref, "font_size_status")==0 ) { + if( iflags.wc_fontsiz_statusNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_status = NHFONT_DEFAULT_SIZE; + mar_set_font(NHW_STATUS,iflags.wc_font_status,iflags.wc_fontsiz_status); + return; + } + if( stricmp( pref, "font_menu")==0 || + stricmp( pref, "font_size_menu")==0 ) { + if( iflags.wc_fontsiz_menuNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_menu = NHFONT_DEFAULT_SIZE; + mar_set_font(NHW_MENU,iflags.wc_font_menu,iflags.wc_fontsiz_menu); + return; + } + if( stricmp( pref, "font_text")==0 || + stricmp( pref, "font_size_text")==0 ) { + if( iflags.wc_fontsiz_textNHFONT_SIZE_MAX ) + iflags.wc_fontsiz_text = NHFONT_DEFAULT_SIZE; + mar_set_font(NHW_TEXT,iflags.wc_font_text,iflags.wc_fontsiz_text); + return; + } + if( stricmp( pref, "scroll_margin")==0 ) { + mar_set_margin(iflags.wc_scroll_margin); + Gem_cliparound(u.ux, u.uy); + return; + } + if( stricmp( pref, "ascii_map")==0 ) { + mar_set_tile_mode(!iflags.wc_ascii_map); + doredraw(); + return; + } + if( stricmp( pref, "hilite_pet")==0 ){ + /* MAR -- works without doing something here. */ + return; + } + if( stricmp( pref, "align_message")==0){ + mar_set_msg_align(iflags.wc_align_message-ALIGN_BOTTOM); + return; + } + if(stricmp( pref, "align_status")==0 ){ + mar_set_status_align(iflags.wc_align_status-ALIGN_BOTTOM); + return; + } + if( stricmp( pref, "vary_msgcount")==0 ){ + mar_set_msg_visible(iflags.wc_vary_msgcount); + return; + } + } /* * Allocate a copy of the given string. If null, return a string of * zero length. *** nethack-3.3.1/win/gem/wingem1.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gem/wingem1.c Thu Mar 21 07:37:44 2002 *************** *** 1,10 **** ! /* SCCS Id: @(#)wingem1.c 3.3 1999/12/10 */ /* Copyright (c) Christian Bressler 1999 */ /* NetHack may be freely redistributed. See license for details. */ #define __TCC_COMPAT__ #include #include #include #include --- 1,11 ---- ! /* SCCS Id: @(#)wingem1.c 3.4 1999/12/10 */ /* Copyright (c) Christian Bressler 1999 */ /* NetHack may be freely redistributed. See license for details. */ #define __TCC_COMPAT__ #include + #include #include #include #include *************** *** 13,18 **** --- 14,20 ---- #include "gem_rsc.h" #include "load_img.h" + #include "gr_rect.h" #define genericptr_t void * #include "wintype.h" *************** *** 39,51 **** #undef NDECL #undef FDECL ! static char nullstr[]="", md[]="NetHack 3.3.1", strCancel[]="Cancel", strOk[]="Ok", strText[]="Text"; extern winid WIN_MESSAGE, WIN_MAP, WIN_STATUS, WIN_INVEN; #define MAXWIN 20 #define ROWNO 21 #define COLNO 80 #define MAP_GADGETS NAME|MOVER|CLOSER|FULLER|LFARROW|RTARROW|UPARROW|DNARROW|VSLIDE|HSLIDE|SIZER|SMALLER #define DIALOG_MODE AUTO_DIAL|MODAL|NO_ICONIFY --- 41,54 ---- #undef NDECL #undef FDECL ! static char nullstr[]="", md[]="NetHack 3.4.0", strCancel[]="Cancel", strOk[]="Ok", strText[]="Text"; extern winid WIN_MESSAGE, WIN_MAP, WIN_STATUS, WIN_INVEN; #define MAXWIN 20 #define ROWNO 21 #define COLNO 80 + #define MSGLEN 100 #define MAP_GADGETS NAME|MOVER|CLOSER|FULLER|LFARROW|RTARROW|UPARROW|DNARROW|VSLIDE|HSLIDE|SIZER|SMALLER #define DIALOG_MODE AUTO_DIAL|MODAL|NO_ICONIFY *************** *** 116,126 **** extern void Gem_raw_print(const char *); /* from wingem.c */ extern int mar_hp_query(void); /* from wingem.c */ extern int mar_get_msg_history(void); /* from wingem.c */ extern int vdi2dev4[]; /* from load_img.c */ static int no_glyph; /* the int indicating there is no glyph */ IMG_header tile_image, titel_image, rip_image; ! MFDB Tile_bilder, Map_bild, Titel_bild, Rip_bild, Black_bild, Pet_Mark; /* pet_mark Design by Warwick Allison warwick@troll.no */ static int pet_mark_data[]={0x0000,0x3600,0x7F00,0x7F00,0x3E00,0x1C00,0x0800}; static short *normal_palette=NULL; --- 119,137 ---- extern void Gem_raw_print(const char *); /* from wingem.c */ extern int mar_hp_query(void); /* from wingem.c */ extern int mar_get_msg_history(void); /* from wingem.c */ + extern int mar_get_msg_visible(void); /* from wingem.c */ + extern void mar_get_font(int,char **,int *);/* from wingem.c */ extern int vdi2dev4[]; /* from load_img.c */ + void recalc_msg_win(GRECT*); + void recalc_status_win(GRECT*); + void calc_std_winplace(int, GRECT *); + int (*v_mtext)(int,int,int,char*); static int no_glyph; /* the int indicating there is no glyph */ IMG_header tile_image, titel_image, rip_image; ! MFDB Tile_bilder, Map_bild, Titel_bild, Rip_bild, Black_bild, Pet_Mark, FontCol_Bild; ! static int Tile_width=16, Tile_heigth=16, Tiles_per_line=20; ! char *Tilefile=NULL; /* pet_mark Design by Warwick Allison warwick@troll.no */ static int pet_mark_data[]={0x0000,0x3600,0x7F00,0x7F00,0x3E00,0x1C00,0x0800}; static short *normal_palette=NULL; *************** *** 131,149 **** GRECT gw_place; } Gem_nhwindow[MAXWIN]; ! int Fcw, Fch; /*struct gemmapdata {*/ ! GRECT dirty_map_area={COLNO,ROWNO,0,0}; int map_cursx=0, map_cursy=0, curs_col=WHITE; ! int draw_cursor=TRUE, map_cell_width=16; SCROLL scroll_map; char **map_glyphs=NULL; /*};*/ /*struct gemstatusdata{*/ char **status_line; ! int Anz_status_lines, status_w, StFch, StFcw; /*};*/ /*struct gemmessagedata{*/ --- 142,169 ---- GRECT gw_place; } Gem_nhwindow[MAXWIN]; ! typedef struct { ! int id; ! int size; ! int cw, ch; ! int prop; ! } NHGEM_FONT; /*struct gemmapdata {*/ ! GRECT dirty_map_area={COLNO-1,ROWNO,0,0}; int map_cursx=0, map_cursy=0, curs_col=WHITE; ! int draw_cursor=TRUE, scroll_margin=-1; ! NHGEM_FONT map_font; SCROLL scroll_map; char **map_glyphs=NULL; + dirty_rect *dr_map; /*};*/ /*struct gemstatusdata{*/ char **status_line; ! int Anz_status_lines, status_w, status_align=FALSE; ! NHGEM_FONT status_font; ! dirty_rect *dr_stat; /*};*/ /*struct gemmessagedata{*/ *************** *** 152,170 **** int messages_pro_zug=0; char **message_line; int *message_age; ! int msg_pos=0, msg_max=0, msg_anz=0, msg_width=0; /*};*/ /*struct geminvdata {*/ SCROLL scroll_menu; Gem_menu_item *invent_list; int Anz_inv_lines=0, Inv_breite=16; int Inv_how; /*};*/ /*struct gemtextdata{*/ char **text_lines; int Anz_text_lines=0, text_width; /*};*/ static OBJECT *zz_oblist[NHICON+1]; --- 172,196 ---- int messages_pro_zug=0; char **message_line; int *message_age; ! int msg_pos=0, msg_max=0, msg_anz=0, msg_width=0, msg_vis=3, msg_align=TRUE; ! NHGEM_FONT msg_font; ! dirty_rect *dr_msg; /*};*/ /*struct geminvdata {*/ SCROLL scroll_menu; Gem_menu_item *invent_list; int Anz_inv_lines=0, Inv_breite=16; + NHGEM_FONT menu_font; int Inv_how; /*};*/ /*struct gemtextdata{*/ char **text_lines; int Anz_text_lines=0, text_width; + NHGEM_FONT text_font; + int use_rip=FALSE; + extern char** rip_line; /*};*/ static OBJECT *zz_oblist[NHICON+1]; *************** *** 222,227 **** --- 248,282 ---- mar_display_nhwindow(WIN_MESSAGE); } + void clipbrd_save(void *data,int cnt,boolean append,boolean is_inv){ + char path[MAX_PATH],*text,*crlf="\r\n"; + long handle; + int i; + + if (data && cnt>0 && scrp_path(path,"scrap.txt") && (handle = append ? Fopen(path,1) : Fcreate(path,0))>0){ + if (append) + Fseek(0L,(int) handle,SEEK_END); + if(is_inv){ + Gem_menu_item *it=(Gem_menu_item *)data; + + for(;it;it=it->Gmi_next){ + text=it->Gmi_str; + Fwrite((int) handle,strlen(text),text); + Fwrite((int) handle,2L,crlf); + } + }else{ + for(i=0;i2){ msg_pos--; Gem_nhwindow[WIN_MESSAGE].gw_dirty=TRUE; mar_display_nhwindow(WIN_MESSAGE); --- 292,298 ---- void message_handler(int x, int y){ switch(objc_find(zz_oblist[MSGWIN],ROOT,MAX_DEPTH,x,y)){ case UPMSG: ! if(msg_pos>msg_vis-1){ msg_pos--; Gem_nhwindow[WIN_MESSAGE].gw_dirty=TRUE; mar_display_nhwindow(WIN_MESSAGE); *************** *** 281,288 **** --- 336,526 ---- no_glyph=ng; } + void + mar_set_tilefile(name) + char* name; + { + Tilefile=name; + } + void + mar_set_tilex(value) + int value; + { + Min(&value,32); + Max(&value,1); + Tile_width=value; + } + void + mar_set_tiley(value) + int value; + { + Min(&value,32); + Max(&value,1); + Tile_heigth=value; + } /****************************** userdef_draw *************************************/ + void rearrange_windows(void); + void mar_set_status_align(int sa){ + if(status_align!=sa){ + status_align=sa; + rearrange_windows(); + } + } + void mar_set_msg_align(int ma){ + if(msg_align!=ma){ + msg_align=ma; + rearrange_windows(); + } + } + void mar_set_msg_visible(int mv){ + if(mv!=msg_vis){ + Max(&mv,1); + Min(&mv,min(msg_anz,20)); + Min(&mv,desk.g_h/msg_font.ch/2); + msg_vis=mv; + rearrange_windows(); + } + } + /* size<0 cellheight; size>0 points */ + void mar_set_fontbyid(int type, int id, int size){ + int chardim[4]; + if(id<=0) + id=ibm_font_id; + if((size>-3 && size<3) || size<-20 || size>20) + size=-ibm_font; + /* MAR -- 17.Mar 2002 For now allow FNT_PROP only with NHW_TEXT */ + if(type!=NHW_TEXT && (FontInfo(id)->type & (FNT_PROP|FNT_ASCII))) + id=ibm_font_id; + switch(type){ + case NHW_MESSAGE: + if(msg_font.size==-size && msg_font.id==id) + break; + msg_font.size=-size; + msg_font.id=id; + msg_font.prop=FontInfo(id)->type & (FNT_PROP|FNT_ASCII); + v_set_text(msg_font.id,msg_font.size,BLACK,0,0,chardim); + msg_font.ch=chardim[3] ? chardim[3] : 1; + msg_font.cw=chardim[2] ? chardim[2] : 1; + msg_width=min(max_w/msg_font.cw-3,MSGLEN); + rearrange_windows(); + break; + case NHW_MAP: + if(map_font.size!=-size || map_font.id!=id){ + MFDB mtmp; + map_font.size=-size; + map_font.id=id; + map_font.prop=FontInfo(id)->type & (FNT_PROP|FNT_ASCII); + v_set_text(map_font.id,map_font.size,BLACK,0,0,chardim); + map_font.ch=chardim[3] ? chardim[3] : 1; + map_font.cw=chardim[2] ? chardim[2] : 1; + mfdb(&mtmp,NULL,(COLNO-1)*map_font.cw, ROWNO*map_font.ch, 0, planes); + if(mfdb_size(&mtmp)>mfdb_size(&FontCol_Bild) && mfdb_size(&mtmp)>mfdb_size(&Map_bild)){ + FontCol_Bild.fd_addr=Map_bild.fd_addr=(int *)realloc(Map_bild.fd_addr,mfdb_size(&mtmp)); + if(!Map_bild.fd_addr) /* FIXME -- Not really neccessary since the former space is still valid */ + panic("Not enough Space for the map."); + } + mfdb(&FontCol_Bild,FontCol_Bild.fd_addr,(COLNO-1)*map_font.cw, ROWNO*map_font.ch, 0, planes); + rearrange_windows(); + } + break; + case NHW_STATUS: + if(status_font.size==-size && status_font.id==id) + break; + status_font.size=-size; + status_font.id=id; + status_font.prop=FontInfo(id)->type & (FNT_PROP|FNT_ASCII); + v_set_text(status_font.id,status_font.size,BLACK,0,0,chardim); + status_font.ch=chardim[3] ? chardim[3] : 1; + status_font.cw=chardim[2] ? chardim[2] : 1; + rearrange_windows(); + break; + case NHW_MENU: + if(menu_font.size==-size && menu_font.id==id) + break; + menu_font.size=-size; + menu_font.id=id; + menu_font.prop=FontInfo(id)->type & (FNT_PROP|FNT_ASCII); + v_set_text(menu_font.id,menu_font.size,BLACK,0,0,chardim); + menu_font.ch=chardim[3] ? chardim[3] : 1; + menu_font.cw=chardim[2] ? chardim[2] : 1; + break; + case NHW_TEXT: + if(text_font.size==-size && text_font.id==id) + break; + text_font.size=-size; + text_font.id=id; + text_font.prop=FontInfo(id)->type & (FNT_PROP|FNT_ASCII); + v_set_text(text_font.id,text_font.size,BLACK,0,0,chardim); + text_font.ch=chardim[3] ? chardim[3] : 1; + text_font.cw=chardim[2] ? chardim[2] : 1; + break; + default: + break; + } + } + void mar_set_font(int type, const char *font_name, int size){ + int id=0; + /* MAR -- 17.Mar 2002 usual Gem behavior, use the Font-ID */ + if(font_name && *font_name){ + id=atoi(font_name); + if(id<=0){ + int i, tid; + char name[32]; + for(i=fonts_loaded;--i>=0;){ + tid=vqt_name(x_handle,i,name); + if(!stricmp(name,font_name)){ + id=tid; + break; + } + } + } + } + mar_set_fontbyid(type,id,size); + } + void rearrange_windows(void){ + GRECT area; + int todo=TRUE; + if(WIN_MAP != WIN_ERR && Gem_nhwindow[WIN_MAP].gw_window){ + scroll_map.px_hline=mar_set_tile_mode(FAIL)?Tile_width:map_font.cw; + scroll_map.px_vline=mar_set_tile_mode(FAIL)?Tile_heigth:map_font.ch; + if(todo){ + calc_std_winplace(FAIL,&area); + todo=FALSE; + } + calc_std_winplace(NHW_MAP,&area); + Gem_nhwindow[WIN_MAP].gw_window->max.g_w=area.g_w; + Gem_nhwindow[WIN_MAP].gw_window->max.g_h=area.g_h; + Gem_nhwindow[WIN_MAP].gw_window->max.g_w=area.g_w; + window_reinit(Gem_nhwindow[WIN_MAP].gw_window,md,md,NULL,FALSE,FALSE); + { + int buf[8]; + buf[3]=K_CTRL; + buf[4]=C('L'); + AvSendMsg(ap_id,AV_SENDKEY,buf); + } + } + if(WIN_MESSAGE != WIN_ERR && Gem_nhwindow[WIN_MESSAGE].gw_window){ + if(todo){ + calc_std_winplace(FAIL,&area); + todo=FALSE; + } + calc_std_winplace(NHW_MESSAGE,&area); + Gem_nhwindow[WIN_MESSAGE].gw_window->min_h=area.g_h; + window_size(Gem_nhwindow[WIN_MESSAGE].gw_window,&area); + redraw_window(Gem_nhwindow[WIN_MESSAGE].gw_window,NULL); + } + if(WIN_STATUS != WIN_ERR && Gem_nhwindow[WIN_STATUS].gw_window){ + if(todo){ + calc_std_winplace(FAIL,&area); + todo=FALSE; + } + calc_std_winplace(NHW_STATUS,&area); + Gem_nhwindow[WIN_STATUS].gw_window->min_h=area.g_h; + window_size(Gem_nhwindow[WIN_STATUS].gw_window,&area); + redraw_window(Gem_nhwindow[WIN_STATUS].gw_window,NULL); + } + } void my_color_area(GRECT *area, int col){ int pxy[4]; *************** *** 299,339 **** static void win_draw_map(int first, WIN *win, GRECT *area){ int pla[8], w=area->g_w-1, h=area->g_h-1; ! int i, x, y, mode, mch; GRECT back=*area; first=first; - v_set_mode(MD_REPLACE); - mode=S_ONLY; if(!mar_set_tile_mode(FAIL)){ ! v_set_text(ibm_font_id,ibm_font,WHITE,0,0,NULL); v_set_mode(MD_TRANS); - mode=S_OR_D; - mch=Fch-1; ! x=win->work.g_x-scroll_map.px_hpos; ! y=win->work.g_y-scroll_map.px_vpos; ! pla[2]=pla[0]=area->g_x-x; ! pla[3]=pla[1]=0; pla[2]+=w; ! pla[3]+=mch; /* MAR -- was 16 */ pla[6]=pla[4]=area->g_x; /* x_wert to */ pla[7]=pla[5]=y; /* y_wert to */ pla[6]+=w; ! pla[7]+=mch; /* MAR -- was 16 */ ! Vsync(); ! back.g_h=Fch; /* MAR -- was 16 */ ! for(i=0;ig_x-win->work.g_x; pla[3]=pla[1]=scroll_map.px_vpos+area->g_y-win->work.g_y; pla[2]+=w; --- 537,578 ---- static void win_draw_map(int first, WIN *win, GRECT *area){ int pla[8], w=area->g_w-1, h=area->g_h-1; ! int i, x, y; GRECT back=*area; first=first; if(!mar_set_tile_mode(FAIL)){ ! int start=(area->g_x-win->work.g_x)/map_font.cw+scroll_map.hpos; ! int stop=(area->g_x+area->g_w+map_font.cw-1-win->work.g_x)/map_font.cw+scroll_map.hpos; ! int starty=(area->g_y-win->work.g_y)/map_font.ch+scroll_map.vpos; ! int stopy=min((area->g_y+area->g_h+map_font.ch-1-win->work.g_y)/map_font.ch+scroll_map.vpos,ROWNO); ! char tmp; ! v_set_text(map_font.id,map_font.size,WHITE,0,0,NULL); v_set_mode(MD_TRANS); ! x=win->work.g_x-scroll_map.px_hpos+start*map_font.cw; ! y=win->work.g_y-scroll_map.px_vpos+starty*map_font.ch; ! pla[2]=pla[0]=scroll_map.px_hpos+area->g_x-win->work.g_x; ! pla[3]=pla[1]=starty*map_font.ch; pla[2]+=w; ! pla[3]+=map_font.ch-1; pla[6]=pla[4]=area->g_x; /* x_wert to */ pla[7]=pla[5]=y; /* y_wert to */ pla[6]+=w; ! pla[7]+=map_font.ch-1; ! back.g_h=map_font.ch; ! for(i=starty;ig_x-win->work.g_x; pla[3]=pla[1]=scroll_map.px_vpos+area->g_y-win->work.g_y; pla[2]+=w; *************** *** 342,356 **** pla[7]=pla[5]=area->g_y; /* y_wert to */ pla[6]+=w; pla[7]+=h; ! vro_cpyfm(x_handle, mode, pla, &Map_bild, screen); } if(draw_cursor){ v_set_line(curs_col,1,1,0,0); pla[0]=pla[2]=win->work.g_x+scroll_map.px_hline*(map_cursx-scroll_map.hpos); pla[1]=pla[3]=win->work.g_y+scroll_map.px_vline*(map_cursy-scroll_map.vpos); ! pla[2]+=map_cell_width-1; ! pla[3]+=mch; v_rect(pla[0],pla[1],pla[2],pla[3]); } } --- 581,595 ---- pla[7]=pla[5]=area->g_y; /* y_wert to */ pla[6]+=w; pla[7]+=h; ! vro_cpyfm(x_handle, S_ONLY, pla, &Map_bild, screen); } if(draw_cursor){ v_set_line(curs_col,1,1,0,0); pla[0]=pla[2]=win->work.g_x+scroll_map.px_hline*(map_cursx-scroll_map.hpos); pla[1]=pla[3]=win->work.g_y+scroll_map.px_vline*(map_cursy-scroll_map.vpos); ! pla[2]+=scroll_map.px_hline-1; ! pla[3]+=scroll_map.px_vline-1; v_rect(pla[0],pla[1],pla[2],pla[3]); } } *************** *** 379,410 **** if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ char **ptr; ! int x=pb->pb_x,y=pb->pb_y,start_line=(area.g_y-y), chardim[4]; ! v_set_mode(MD_REPLACE); /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ ! v_set_text(ibm_font_id,ibm_font,BLACK,0,0,chardim); ! Fch= chardim[3] ? chardim[3] : 1; ! start_line /= Fch; ! y+=start_line*Fch; x-=scroll_menu.px_hpos; ptr=&text_lines[start_line+=scroll_menu.vpos]; ! start_line = min((area.g_y-y+area.g_h+Fch-1)/Fch,Anz_text_lines-start_line); ! area.g_h=Fch; Vsync(); ! for(;--start_line>=0;y+=Fch){ area.g_y=y; my_clear_area(&area); if(**ptr-1){ v_set_text(FAIL,0,BLUE,0x01,0,NULL); ! v_gtext(x_handle,x,y,(*ptr++)+1); v_set_text(FAIL,0,BLACK,0x00,0,NULL); }else ! v_gtext(x_handle,x,y,(*ptr++)+1); ! } } return(0); } --- 618,695 ---- if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ char **ptr; ! int x=pb->pb_x,y=pb->pb_y,start_line=(area.g_y-y); ! v_set_mode((text_font.cw&7)==0 && text_font.prop==0 ? MD_REPLACE : MD_TRANS); /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ ! v_set_text(text_font.id,text_font.size,BLACK,0,0,NULL); ! start_line /= text_font.ch; ! y+=start_line*text_font.ch; ! x-=(int)scroll_menu.px_hpos; ! ptr=&text_lines[start_line+=scroll_menu.vpos]; ! start_line = min((area.g_y-y+area.g_h+text_font.ch-1)/text_font.ch,Anz_text_lines-start_line); ! area.g_h=text_font.ch; ! Vsync(); ! /* x=(x+7) & ~7;*/ ! for(;--start_line>=0;y+=text_font.ch){ ! area.g_y=y; ! my_clear_area(&area); ! if(**ptr-1){ ! v_set_text(FAIL,0,BLUE,0x01,0,NULL); ! (*v_mtext)(x_handle,x,y,(*ptr++)+1); ! v_set_text(FAIL,0,BLACK,0x00,0,NULL); ! }else ! (*v_mtext)(x_handle,x,y,(*ptr++)+1); ! } ! } ! return(0); ! } ! static int draw_rip(PARMBLK *pb){ ! GRECT area=*(GRECT *) &pb->pb_x; ! if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ ! char **ptr; ! int x=pb->pb_x,y=pb->pb_y,start_line=(area.g_y-y), chardim[4], pla[8],i; ! v_set_mode(MD_REPLACE); ! /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ ! v_set_text(text_font.id,text_font.size,BLACK,0,0,chardim); ! start_line /= text_font.ch; ! y+=start_line*text_font.ch; x-=scroll_menu.px_hpos; ptr=&text_lines[start_line+=scroll_menu.vpos]; ! start_line = min((area.g_y-y+area.g_h+text_font.ch-1)/text_font.ch,Anz_text_lines-start_line); ! area.g_h=text_font.ch; Vsync(); ! x=(x+7) & ~7; ! for(;--start_line>=0;y+=text_font.ch){ area.g_y=y; my_clear_area(&area); if(**ptr-1){ v_set_text(FAIL,0,BLUE,0x01,0,NULL); ! (*v_mtext)(x_handle,x,y,(*ptr++)+1); v_set_text(FAIL,0,BLACK,0x00,0,NULL); }else ! (*v_mtext)(x_handle,x,y,(*ptr++)+1); ! } ! pla[0]=pla[1]=0; ! pla[2]=min(pb->pb_w-1,Rip_bild.fd_w-1); ! pla[3]=min(pb->pb_h-1,Rip_bild.fd_h-1); ! pla[6]=pla[4]=pb->pb_x+(pb->pb_w-Rip_bild.fd_w)/2; /* x_wert to */ ! pla[7]=pla[5]=pb->pb_y; /* y_wert to */ ! pla[6]+=pla[2]; ! pla[7]+=pla[3]; ! vro_cpyfm(x_handle, S_ONLY, pla, &Rip_bild, screen); ! v_set_mode(MD_TRANS); ! vst_alignment(x_handle,1,5,&i,&i); ! pla[5]+=64; ! for(i=0;i<7;i++,pla[5]+=chardim[3]){ ! v_set_text(text_font.id,(i==0 || i==6) ? text_font.size : 12,WHITE,1,0,chardim); ! (*v_mtext)(x_handle,pla[4]+157,pla[5],rip_line[i]); ! v_set_text(text_font.id,(i==0 || i==6) ? text_font.size : 12,BLACK,0,0,chardim); ! (*v_mtext)(x_handle,pla[4]+157,pla[5],rip_line[i]); } + vst_alignment(x_handle,0,5,&i,&i); } return(0); } *************** *** 413,439 **** GRECT area=*(GRECT *) &pb->pb_x; if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ ! int x=pb->pb_x, y=pb->pb_y+2*Fch, foo, i; ! char **ptr=&message_line[msg_pos]; x=(x+7) & ~7; /* Byte alignment speeds output up */ v_set_mode(MD_REPLACE); /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ ! v_set_text(ibm_font_id,ibm_font,FAIL, FAIL,0,NULL); vst_alignment(x_handle,0,5,&foo,&foo); ! foo=min(msg_pos,3); ! /* area.g_h=Fch;*/ ! Vsync(); ! for(i=0;ipb_x; if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ ! int x=pb->pb_x, y=pb->pb_y+(msg_vis-1)*msg_font.ch, foo, i; ! char **ptr=&message_line[msg_pos], tmp; ! int startx, stopx, starty, stopy; x=(x+7) & ~7; /* Byte alignment speeds output up */ v_set_mode(MD_REPLACE); /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ ! v_set_text(msg_font.id,msg_font.size,FAIL, FAIL,0,NULL); vst_alignment(x_handle,0,5,&foo,&foo); ! stopy=min(msg_pos,msg_vis); ! /* Vsync();*/ ! startx=(area.g_x-x)/msg_font.cw-1; /* MAR 06.02.2001 -- because italic covers the next char */ ! Max(&startx,0); ! stopx=(area.g_x+area.g_w+msg_font.cw-x-1)/msg_font.cw; ! x+=startx*msg_font.cw; ! for(i=0;ipb_x; if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ ! char **ptr=status_line; ! int x=pb->pb_x, y=pb->pb_y, chardim[4], h; /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ v_set_mode(MD_REPLACE); ! if(max_w/Fcw>=COLNO-1) ! v_set_text(ibm_font_id,ibm_font,BLACK,0,0,chardim); ! else ! v_set_text(small_font_id,small_font,BLACK,0,0,chardim); ! h=chardim[3] ? chardim[3] : 1; ! x+=2*chardim[2]; ! Vsync(); my_clear_area(&area); ! v_gtext(x_handle,x,y, *(ptr++)); ! v_gtext(x_handle,x,y+h,*ptr); } return(0); } --- 732,765 ---- static int draw_status(PARMBLK *pb){ GRECT area=*(GRECT *) &pb->pb_x; + area.g_x+=2*status_font.cw-2; + area.g_w-=2*status_font.cw-2; if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ ! int x=pb->pb_x, y=pb->pb_y, startx, stopx, starty, stopy, i; ! char tmp; /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ v_set_mode(MD_REPLACE); ! v_set_text(status_font.id,status_font.size,BLACK,0,0,NULL); ! x = (x+2*status_font.cw+6) & ~7; ! startx=(area.g_x-x)/status_font.cw; ! starty=(area.g_y-y)/status_font.ch; ! stopx=(area.g_x+area.g_w+status_font.ch-1-x)/status_font.cw; ! stopy=(area.g_y+area.g_h+status_font.ch-1-y)/status_font.ch; ! Max(&startx,0); /* MAR -- Hmm, area.g_x could end up 1 below x */ ! Max(&stopx,0); ! x+=startx*status_font.cw; ! y+=starty*status_font.ch; ! /* Vsync();*/ ! area.g_h=status_font.ch; ! for(i=starty;i=0 && it; it=it->Gmi_next); ! i = min((area.g_y-y+area.g_h+Fch-1)/Fch,Anz_inv_lines-start_line); Vsync(); ! area.g_h=Fch; ! for(;(--i>=0) && it;it=it->Gmi_next,y+=Fch){ if(it->Gmi_attr) v_set_text(FAIL,FALSE,BLUE,1,FAIL,NULL); /* Bold */ else --- 772,792 ---- Gem_menu_item *it; v_set_mode(MD_REPLACE); ! v_set_text(menu_font.id,menu_font.size,BLACK,0,0,NULL); ! start_line /= menu_font.ch; ! y+=start_line*menu_font.ch; x-=scroll_menu.px_hpos; start_line+=scroll_menu.vpos; for(it=invent_list,i=start_line; --i>=0 && it; it=it->Gmi_next); ! i = min((area.g_y-y+area.g_h+menu_font.ch-1)/menu_font.ch,Anz_inv_lines-start_line); Vsync(); ! area.g_h=menu_font.ch; ! for(;(--i>=0) && it;it=it->Gmi_next,y+=menu_font.ch){ if(it->Gmi_attr) v_set_text(FAIL,FALSE,BLUE,1,FAIL,NULL); /* Bold */ else *************** *** 494,515 **** area.g_y=y; my_clear_area(&area); if((gl=it->Gmi_glyph) != no_glyph){ ! int pla[8], h=min(Fch,16)-1; ! pla[0]=pla[2]=(gl%20)*16; /* x_wert from */ ! pla[1]=pla[3]=(gl/20)*16; /* y_wert from */ pla[4]=pla[6]=x; /* x_wert to */ pla[5]=pla[7]=y; /* y_wert to */ ! pla[2]+=15; pla[3]+=h; ! pla[6]+=15; pla[7]+=h; vro_cpyfm(x_handle,S_ONLY,pla,&Tile_bilder,screen); } if(it->Gmi_identifier) it->Gmi_str[2]=it->Gmi_selected ? (it->Gmi_count == -1L ? '+' : '#') : '-'; ! v_gtext(x_handle,x+16,y,it->Gmi_str); } } return(0); --- 795,816 ---- area.g_y=y; my_clear_area(&area); if((gl=it->Gmi_glyph) != no_glyph){ ! int pla[8], h=min(menu_font.ch,Tile_heigth)-1; ! pla[0]=pla[2]=(gl%Tiles_per_line)*Tile_width; /* x_wert from */ ! pla[1]=pla[3]=(gl/Tiles_per_line)*Tile_heigth; /* y_wert from */ pla[4]=pla[6]=x; /* x_wert to */ pla[5]=pla[7]=y; /* y_wert to */ ! pla[2]+=Tile_width-1; pla[3]+=h; ! pla[6]+=Tile_heigth-1; pla[7]+=h; vro_cpyfm(x_handle,S_ONLY,pla,&Tile_bilder,screen); } if(it->Gmi_identifier) it->Gmi_str[2]=it->Gmi_selected ? (it->Gmi_count == -1L ? '+' : '#') : '-'; ! (*v_mtext)(x_handle,(x+23) & ~7,y,it->Gmi_str); } } return(0); *************** *** 520,542 **** if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ char **ptr=(char **)pb->pb_parm; ! int x=pb->pb_x, y=pb->pb_y, chardim[4], h; /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ v_set_mode(MD_TRANS); ! v_set_text(ibm_font_id,ibm_font,WHITE,0,0,NULL); Vsync(); if(planes<4){ int pxy[4]; - v_set_fill(BLACK,2,4,0); rc_grect_to_array(&area,pxy); v_bar(x_handle,pxy); }else my_color_area(&area,LWHITE); ! v_gtext(x_handle,x,y,*(ptr++)); if(*ptr) ! v_gtext(x_handle,x,y+Fch,*ptr); } return(0); } --- 821,842 ---- if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ char **ptr=(char **)pb->pb_parm; ! int x=pb->pb_x, y=pb->pb_y, chardim[4]; /* void v_set_text(int font,int height,int color,int effect,int rotate,int out[4]) */ v_set_mode(MD_TRANS); ! v_set_text(ibm_font_id,ibm_font,WHITE,0,0,chardim); Vsync(); if(planes<4){ int pxy[4]; v_set_fill(BLACK,2,4,0); rc_grect_to_array(&area,pxy); v_bar(x_handle,pxy); }else my_color_area(&area,LWHITE); ! (*v_mtext)(x_handle,x,y,*(ptr++)); if(*ptr) ! (*v_mtext)(x_handle,x,y+chardim[3],*ptr); } return(0); } *************** *** 606,612 **** if(mi_numpad!=mar_iflags_numpad()){ OBJECT *z_ob=zz_oblist[DIRECTION]; int i; - mi_numpad=mar_iflags_numpad(); ob_set_hotkey(z_ob,DIRDOWN,'>'); ob_set_hotkey(z_ob,DIRUP,'<'); --- 906,911 ---- *************** *** 619,625 **** int mar_gem_init() { ! int i, bild_fehler=FALSE, chardim[4]; static MITEM wish_workaround= {FAIL,key(0,'J'),K_CTRL,W_CYCLE,FAIL}; OBJECT *z_ob; --- 918,925 ---- int mar_gem_init() { ! int i, bild_fehler=FALSE, fsize; ! char *fname; static MITEM wish_workaround= {FAIL,key(0,'J'),K_CTRL,W_CYCLE,FAIL}; OBJECT *z_ob; *************** *** 637,642 **** --- 937,944 ---- } MouseBee(); + /* MAR -- 17.Mar 2002 NVDI 3.0 or better uses v_ftext */ + v_mtext= speedo==3 ? &v_ftext : &v_gtext; for(i=0;i=COLNO-1){ ! status_w=msg_width; ! StFch=Fch; ! StFcw=Fcw; ! }else{ ! v_set_text(small_font_id,small_font,BLACK,0,0,chardim); ! StFch=chardim[3] ? chardim[3] : 1; ! StFcw=chardim[2] ? chardim[2] : 1; ! status_w=min(max_w/StFcw-3,100); ! } if(planes>0 && planes<9) normal_palette=(short *)m_alloc(3*colors*sizeof(short)); get_colors(x_handle,normal_palette, colors); if(planes<4){ ! bild_fehler=depack_img("NH2.IMG",&tile_image); }else{ ! bild_fehler=depack_img("NH16.IMG",&tile_image); if(!bild_fehler) ! img_set_colors(x_handle, tile_image.palette, tile_image.planes); } if(bild_fehler ){ --- 946,984 ---- ob_hide(z_ob,OKABOUT,TRUE); ob_draw_dialog(z_ob,0,0,0,0); ! mar_get_font(NHW_MESSAGE,&fname,&fsize); ! mar_set_font(NHW_MESSAGE,fname,fsize); ! mar_get_font(NHW_MAP,&fname,&fsize); ! mar_set_font(NHW_MAP,fname,fsize); ! mar_get_font(NHW_STATUS,&fname,&fsize); ! mar_set_font(NHW_STATUS,fname,fsize); ! mar_get_font(NHW_MENU,&fname,&fsize); ! mar_set_font(NHW_MENU,fname,fsize); ! mar_get_font(NHW_TEXT,&fname,&fsize); ! mar_set_font(NHW_TEXT,fname,fsize); msg_anz=mar_get_msg_history(); ! mar_set_msg_visible(mar_get_msg_visible()); ! msg_width=min(max_w/msg_font.cw-3,MSGLEN); + if(max_w/status_font.cw0 && planes<9) normal_palette=(short *)m_alloc(3*colors*sizeof(short)); get_colors(x_handle,normal_palette, colors); if(planes<4){ ! bild_fehler=depack_img(Tilefile?Tilefile:"NH2.IMG",&tile_image); }else{ ! bild_fehler=depack_img(Tilefile?Tilefile:"NH16.IMG",&tile_image); if(!bild_fehler) ! if(tile_image.planes>1) ! img_set_colors(x_handle, tile_image.palette, tile_image.planes); ! #if 0 ! else{ ! int mypalette[]={}; ! img_set_colors(x_handle, mypalette, 4); ! } ! #endif } if(bild_fehler ){ *************** *** 682,694 **** mfdb(&Tile_bilder, (int *)tile_image.addr, tile_image.img_w, tile_image.img_h, 1, tile_image.planes); transform_img(&Tile_bilder); ! mfdb(&Map_bild,NULL,COLNO*16, ROWNO*16, 0, planes); ! Map_bild.fd_addr=(int *)m_alloc(mfdb_size(&Map_bild)); mfdb(&Pet_Mark,pet_mark_data,8, 7, 1, 1); vr_trnfm(x_handle,&Pet_Mark,&Pet_Mark); ! mfdb(&Black_bild,NULL,8, 16, 1, 1); Black_bild.fd_addr=(int *)m_alloc(mfdb_size(&Black_bild)); memset(Black_bild.fd_addr,255,mfdb_size(&Black_bild)); vr_trnfm(x_handle,&Black_bild,&Black_bild); --- 992,1006 ---- mfdb(&Tile_bilder, (int *)tile_image.addr, tile_image.img_w, tile_image.img_h, 1, tile_image.planes); transform_img(&Tile_bilder); ! mfdb(&Map_bild,NULL,(COLNO-1)*Tile_width, ROWNO*Tile_heigth, 0, planes); ! mfdb(&FontCol_Bild,NULL,(COLNO-1)*map_font.cw, ROWNO*map_font.ch, 0, planes); ! Map_bild.fd_addr=(int *)m_alloc(mfdb_size(&Map_bild)>mfdb_size(&FontCol_Bild)?mfdb_size(&Map_bild):mfdb_size(&FontCol_Bild)); ! FontCol_Bild.fd_addr=Map_bild.fd_addr; mfdb(&Pet_Mark,pet_mark_data,8, 7, 1, 1); vr_trnfm(x_handle,&Pet_Mark,&Pet_Mark); ! mfdb(&Black_bild,NULL,16, 32, 1, 1); /* MAR -- 17.Mar 2002 that should cover the biggest map-font */ Black_bild.fd_addr=(int *)m_alloc(mfdb_size(&Black_bild)); memset(Black_bild.fd_addr,255,mfdb_size(&Black_bild)); vr_trnfm(x_handle,&Black_bild,&Black_bild); *************** *** 702,721 **** memset(&scroll_menu,0,sizeof(scroll_menu)); scroll_menu.scroll=AUTO_SCROLL; scroll_menu.obj=LINESLIST; ! scroll_menu.px_hline=Fcw; ! scroll_menu.px_vline=Fch; scroll_menu.hscroll= scroll_menu.vscroll=1; ! scroll_menu.tbar_d=2*Fch-2; mar_set_dir_keys(); memset(&scroll_map,0,sizeof(scroll_map)); scroll_map.scroll=AUTO_SCROLL; scroll_map.obj=ROOT; ! scroll_map.px_hline=16; /* width of Cell 8 char or 16 tile */ ! scroll_map.px_vline=16; /* height of Cell always 16 */ ! scroll_map.hsize=COLNO; scroll_map.vsize=ROWNO; scroll_map.hpage=8; scroll_map.vpage=8; --- 1014,1033 ---- memset(&scroll_menu,0,sizeof(scroll_menu)); scroll_menu.scroll=AUTO_SCROLL; scroll_menu.obj=LINESLIST; ! scroll_menu.px_hline=menu_font.cw; ! scroll_menu.px_vline=menu_font.ch; scroll_menu.hscroll= scroll_menu.vscroll=1; ! scroll_menu.tbar_d=2*gr_ch-2; mar_set_dir_keys(); memset(&scroll_map,0,sizeof(scroll_map)); scroll_map.scroll=AUTO_SCROLL; scroll_map.obj=ROOT; ! scroll_map.px_hline=mar_set_tile_mode(FAIL)?Tile_width:map_font.cw; ! scroll_map.px_vline=mar_set_tile_mode(FAIL)?Tile_heigth:map_font.ch; ! scroll_map.hsize=COLNO-1; scroll_map.vsize=ROWNO; scroll_map.hpage=8; scroll_map.vpage=8; *************** *** 760,766 **** mar_destroy_nhwindow(i); if(normal_palette){ ! img_set_colors(x_handle,normal_palette,planes); null_free(normal_palette); } test_free(tile_image.palette); --- 1072,1078 ---- mar_destroy_nhwindow(i); if(normal_palette){ ! img_set_colors(x_handle,normal_palette,tile_image.planes); null_free(normal_palette); } test_free(tile_image.palette); *************** *** 791,799 **** --- 1103,1113 ---- Gem_nhwindow[WIN_MAP].gw_dirty=TRUE; } + void mar_cliparound(void); void mar_map_curs_weiter(void) { mar_curs(map_cursx+1,map_cursy); + mar_cliparound(); } /************************* about *******************************/ *************** *** 921,927 **** dial_colors(7,RED,BLACK,RED,RED,BLACK,BLACK,BLACK,BLACK,WHITE,WHITE,WHITE,WHITE,TRUE,TRUE); if(WIN_MESSAGE!=WIN_ERR && (p_w=Gem_nhwindow[WIN_MESSAGE].gw_window)){ z_ob->ob_x=p_w->work.g_x; ! z_ob->ob_y=p_w->curr.g_y+p_w->curr.g_h+Fch; } xdialog(z_ob,NULL, NULL, NULL, DIA_LASTPOS, FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); --- 1235,1241 ---- dial_colors(7,RED,BLACK,RED,RED,BLACK,BLACK,BLACK,BLACK,WHITE,WHITE,WHITE,WHITE,TRUE,TRUE); if(WIN_MESSAGE!=WIN_ERR && (p_w=Gem_nhwindow[WIN_MESSAGE].gw_window)){ z_ob->ob_x=p_w->work.g_x; ! z_ob->ob_y=p_w->curr.g_y+p_w->curr.g_h+gr_ch; } xdialog(z_ob,NULL, NULL, NULL, DIA_LASTPOS, FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); *************** *** 988,994 **** Gem_menu_item *curr; for(curr=invent_list;curr;curr=curr->Gmi_next){ ! Max(&Inv_breite,Fcw*(strlen(curr->Gmi_str)+1)+16); if(ch && curr->Gmi_accelerator==0 && curr->Gmi_identifier){ curr->Gmi_accelerator=ch; curr->Gmi_str[0]=ch; --- 1302,1311 ---- Gem_menu_item *curr; for(curr=invent_list;curr;curr=curr->Gmi_next){ ! int extent[8]; ! v_set_text(menu_font.id,menu_font.size,BLACK,0,0,NULL); ! vqt_extent(x_handle,curr->Gmi_str,extent); ! Max(&Inv_breite,extent[4]+Tile_width+menu_font.cw); if(ch && curr->Gmi_accelerator==0 && curr->Gmi_identifier){ curr->Gmi_accelerator=ch; curr->Gmi_str[0]=ch; *************** *** 1009,1014 **** --- 1326,1334 ---- void mar_raw_print(const char *); + void mar_set_text_to_rip(winid w){ + use_rip=TRUE; + } void mar_putstr_text(winid window, int attr, const char *str) { *************** *** 1027,1032 **** --- 1347,1353 ---- } if(!text_lines){ mar_raw_print("No room for Text"); + return; } if(str) *************** *** 1047,1070 **** OBJECT *z_ob=zz_oblist[LINES]; int retval=WIN_DIAL|MODAL|NO_ICONIFY; ! scroll_menu.vpage= (desk.g_h-3*Fch)/Fch; if(Anzahl>scroll_menu.vpage){ retval |= WD_VSLIDER; ! if(Breite>max_w-3*Fcw){ retval|=WD_HSLIDER; ! scroll_menu.hpage=(max_w-3*Fcw)/Fcw; scroll_menu.hpos=0; ! scroll_menu.hsize=Breite/Fcw; ! scroll_menu.vpage=(desk.g_h-4*Fch-1)/Fch; } Anzahl=scroll_menu.vpage; }else{ ! if(Breite>max_w-Fcw){ retval|=WD_HSLIDER; ! scroll_menu.hpage=(max_w-Fcw)/Fcw; scroll_menu.hpos=0; ! scroll_menu.hsize=Breite/Fcw; ! scroll_menu.vpage= (desk.g_h-4*Fch-1)/Fch; if(Anzahl>scroll_menu.vpage){ retval |= WD_VSLIDER; Anzahl=scroll_menu.vpage; --- 1368,1392 ---- OBJECT *z_ob=zz_oblist[LINES]; int retval=WIN_DIAL|MODAL|NO_ICONIFY; ! scroll_menu.hsize=0; ! scroll_menu.vpage= (desk.g_h-3*gr_ch)/scroll_menu.px_vline; if(Anzahl>scroll_menu.vpage){ retval |= WD_VSLIDER; ! if(Breite>max_w-3*scroll_menu.px_hline){ retval|=WD_HSLIDER; ! scroll_menu.hpage=(max_w-3*scroll_menu.px_hline)/scroll_menu.px_hline; scroll_menu.hpos=0; ! scroll_menu.hsize=Breite/scroll_menu.px_hline; ! scroll_menu.vpage=(desk.g_h-4*gr_ch-1)/scroll_menu.px_vline; } Anzahl=scroll_menu.vpage; }else{ ! if(Breite>max_w-scroll_menu.px_hline){ retval|=WD_HSLIDER; ! scroll_menu.hpage=(max_w-scroll_menu.px_hline)/scroll_menu.px_hline; scroll_menu.hpos=0; ! scroll_menu.hsize=Breite/scroll_menu.px_hline; ! scroll_menu.vpage= (desk.g_h-4*gr_ch-1)/scroll_menu.px_vline; if(Anzahl>scroll_menu.vpage){ retval |= WD_VSLIDER; Anzahl=scroll_menu.vpage; *************** *** 1077,1090 **** if((scroll_menu.vmax=scroll_menu.vsize-scroll_menu.vpage)<0) scroll_menu.vmax=0; ! /* left/right/up 2 pixel border down 2Fch toolbar */ z_ob[ROOT].ob_width=z_ob[LINESLIST].ob_width=Breite; z_ob[ROOT].ob_height= z_ob[QLINE].ob_y= ! z_ob[LINESLIST].ob_height=Fch*Anzahl; ! z_ob[QLINE].ob_y+=Fch/2; z_ob[ROOT].ob_width+=4; ! z_ob[ROOT].ob_height+=2*Fch+2; return(retval); } --- 1399,1412 ---- if((scroll_menu.vmax=scroll_menu.vsize-scroll_menu.vpage)<0) scroll_menu.vmax=0; ! /* left/right/up 2 pixel border down 2gr_ch toolbar */ z_ob[ROOT].ob_width=z_ob[LINESLIST].ob_width=Breite; z_ob[ROOT].ob_height= z_ob[QLINE].ob_y= ! z_ob[LINESLIST].ob_height=scroll_menu.px_vline*Anzahl; ! z_ob[QLINE].ob_y+=gr_ch/2; z_ob[ROOT].ob_width+=4; ! z_ob[ROOT].ob_height+=2*gr_ch+2; return(retval); } *************** *** 1096,1104 **** { int ccol; - if(WIN_STATUS != WIN_ERR) - Gem_nhwindow[WIN_STATUS].gw_dirty=TRUE; - ccol=mar_hp_query(); if(ccol<2) curs_col=WHITE; /* 50-100% : 0 */ --- 1418,1423 ---- *************** *** 1155,1161 **** rest=strcpy(buf,toplines+pos); }else{ message_age[msg_max]=TRUE; ! strcpy(message_line[msg_max],toplines); rest=0; } --- 1474,1480 ---- rest=strcpy(buf,toplines+pos); }else{ message_age[msg_max]=TRUE; ! strncpy(message_line[msg_max],toplines,msg_width); rest=0; } *************** *** 1176,1183 **** const char *str; int line; { ! strncpy(status_line[line],str,status_w-1); ! status_line[line][status_w-1]='\0'; } /************************* mar_set_menu_title *******************************/ --- 1495,1523 ---- const char *str; int line; { ! int i,last_diff=-1; ! GRECT area={0,line*status_font.ch,status_font.cw,status_font.ch}; ! for(i=0;(i=0){ ! add_dirty_rect(dr_stat,&area); ! last_diff=-1; ! area.g_w=status_font.cw; ! } ! for(;i=0) ! add_dirty_rect(dr_stat,&area); } /************************* mar_set_menu_title *******************************/ *************** *** 1288,1294 **** return(FALSE); } ! #define Text_Init K_Init int Text_Handler(xev) --- 1628,1634 ---- return(FALSE); } ! #define Text_Init KM_Init int Text_Handler(xev) *************** *** 1296,1301 **** --- 1636,1650 ---- { int ev=xev->ev_mwich; + if(ev&MU_MESAG){ + int *buf=xev->ev_mmgpbuf, y_wo, i; + if(*buf==FONT_CHANGED){ + if(buf[3]>=0){ + mar_set_fontbyid(NHW_TEXT,buf[4],buf[5]); + FontAck(buf[1],1); + } + } + } if(ev&MU_KEYBD){ char ch=(char)(xev->ev_mkreturn&0x00FF); *************** *** 1304,1309 **** --- 1653,1661 ---- case '\033': send_return(); /* just closes the textwin */ break; + case C('c'): + clipbrd_save(text_lines,Anz_text_lines,xev->ev_mmokstate&K_SHIFT,FALSE); + break; default: ev &= ~MU_KEYBD; /* unknown key */ break; *************** *** 1314,1319 **** --- 1666,1672 ---- #define Inv_Init KM_Init + static long count=0; int Inv_Handler(xev) XEVENT *xev; *************** *** 1321,1350 **** int ev=xev->ev_mwich; Gem_menu_item *it; GRECT area; - static long count=0; OBJECT *z_ob=zz_oblist[LINES]; ob_pos(z_ob,LINESLIST,&area); - if(ev&MU_MESAG){ int *buf=xev->ev_mmgpbuf, y_wo, i; if(*buf==OBJC_CHANGED && buf[3]==LINESLIST){ ob_undostate(z_ob,LINESLIST,SELECTED); mouse(NULL,&y_wo); ! y_wo=(y_wo-area.g_y)/Fch+scroll_menu.vpos; for(it=invent_list,i=0;iGmi_next,i++); if(it->Gmi_identifier){ it->Gmi_selected=!it->Gmi_selected; it->Gmi_count= count==0L ? -1L : count; count = 0L; ! if(Inv_how!=PICK_ANY) ! my_close_dialog(Inv_dialog,TRUE); ! else{ ! area.g_x+=16+2*Fcw; ! area.g_w=Fcw; ! area.g_h=Fch; ! area.g_y+=(y_wo-scroll_menu.vpos)*Fch; ob_draw_chg(Inv_dialog,LINESLIST,&area,FAIL); } /* how != PICK_ANY */ } /* identifier */ --- 1674,1708 ---- int ev=xev->ev_mwich; Gem_menu_item *it; GRECT area; OBJECT *z_ob=zz_oblist[LINES]; ob_pos(z_ob,LINESLIST,&area); if(ev&MU_MESAG){ int *buf=xev->ev_mmgpbuf, y_wo, i; + if(*buf==FONT_CHANGED){ + if(buf[3]>=0){ + mar_set_fontbyid(NHW_MENU,buf[4],buf[5]); + FontAck(buf[1],1); + } + }else if(*buf==OBJC_CHANGED && buf[3]==LINESLIST){ ob_undostate(z_ob,LINESLIST,SELECTED); mouse(NULL,&y_wo); ! y_wo=(y_wo-area.g_y)/menu_font.ch+scroll_menu.vpos; for(it=invent_list,i=0;iGmi_next,i++); if(it->Gmi_identifier){ it->Gmi_selected=!it->Gmi_selected; it->Gmi_count= count==0L ? -1L : count; count = 0L; ! if(Inv_how!=PICK_ANY){ ! /*my_close_dialog(Inv_dialog,TRUE);*/ ! send_return(); ! }else{ ! area.g_x=(area.g_x+23+2*menu_font.cw) & ~7; ! area.g_w=menu_font.cw; ! area.g_h=menu_font.ch; ! area.g_y+=(y_wo-scroll_menu.vpos)*menu_font.ch; ob_draw_chg(Inv_dialog,LINESLIST,&area,FAIL); } /* how != PICK_ANY */ } /* identifier */ *************** *** 1412,1418 **** case MENU_SEARCH: if(Inv_how!=PICK_NONE){ char buf[BUFSZ]; - Gem_getlin("Search for:",buf); if(!*buf || buf[0]=='\033') break; --- 1770,1775 ---- *************** *** 1427,1450 **** } } break; default: find_acc: if(Inv_how==PICK_NONE) my_close_dialog(Inv_dialog,TRUE); ! for(it=invent_list;it;it=it->Gmi_next){ ! if(it->Gmi_identifier && (it->Gmi_accelerator==ch || it->Gmi_groupacc==ch)){ ! it->Gmi_selected=!it->Gmi_selected; ! it->Gmi_count= count==0L ? -1L : count; ! count = 0L; ! if(Inv_how!=PICK_ANY) ! my_close_dialog(Inv_dialog,TRUE); } - } break; } /* end switch(ch) */ if(Inv_how==PICK_ANY){ ! area.g_x+=16+2*Fcw; ! area.g_w=Fcw; ob_draw_chg(Inv_dialog,LINESLIST,&area,FAIL); } } /* !scroll_Inv_dialog */ --- 1784,1811 ---- } } break; + case C('c'): + clipbrd_save(invent_list,Anz_inv_lines,xev->ev_mmokstate&K_SHIFT,TRUE); + break; default: find_acc: if(Inv_how==PICK_NONE) my_close_dialog(Inv_dialog,TRUE); ! else ! for(it=invent_list;it;it=it->Gmi_next){ ! if(it->Gmi_identifier && (it->Gmi_accelerator==ch || it->Gmi_groupacc==ch)){ ! it->Gmi_selected=!it->Gmi_selected; ! it->Gmi_count= count==0L ? -1L : count; ! count = 0L; ! if(Inv_how!=PICK_ANY) ! my_close_dialog(Inv_dialog,TRUE); ! } } break; } /* end switch(ch) */ if(Inv_how==PICK_ANY){ ! area.g_x=(area.g_x+23+2*menu_font.cw) & ~7; ! area.g_w=menu_font.cw; ob_draw_chg(Inv_dialog,LINESLIST,&area,FAIL); } } /* !scroll_Inv_dialog */ *************** *** 1485,1490 **** --- 1846,1856 ---- /************************* mar_display_nhwindow *******************************/ + void redraw_winwork(WIN *w,GRECT *area){ + area->g_x+=w->work.g_x; + area->g_y+=w->work.g_y; + redraw_window(w,area); + } void mar_menu_set_slider(WIN *p_win){ if(p_win){ SCROLL *sc=p_win->scroll; *************** *** 1513,1557 **** } } void calc_std_winplace(int which, GRECT *place){ static int todo=TRUE; static GRECT me, ma, st; ! if(todo){ OBJECT *z_ob; int map_h_off, foo; /* First the messagewin */ ! z_ob=zz_oblist[MSGWIN]; ! z_ob[MSGLINES].ob_spec.userblk=&ub_msg; ! z_ob[MSGLINES].ob_width= ! z_ob[ROOT].ob_width= (msg_width+3)*Fcw; ! z_ob[MSGLINES].ob_width-=z_ob[UPMSG].ob_width; ! window_border(0,0,0,z_ob->ob_width,z_ob->ob_height, &me); /* Now the map */ ! wind_calc(WC_BORDER,MAP_GADGETS,0,0,16*COLNO,16*ROWNO,&foo,&foo,&foo,&map_h_off); ! map_h_off-=16*ROWNO; ! window_border(MAP_GADGETS,0,0,16*COLNO,16*ROWNO, &ma); ! ma.g_y=desk.g_y+me.g_h; /* Next the statuswin */ ! z_ob=zz_oblist[STATUSLINE]; ! z_ob[ROOT].ob_type=G_USERDEF; ! z_ob[ROOT].ob_spec.userblk=&ub_status; ! z_ob[ROOT].ob_width=(status_w+2)*StFcw; ! z_ob[ROOT].ob_height= ! z_ob[GRABSTATUS].ob_height=2*StFch; ! z_ob[GRABSTATUS].ob_width=2*StFcw-2; ! window_border(0,0,0,z_ob->ob_width,z_ob->ob_height,&st); /* And last but not least a final test */ ! ma.g_h=map_h_off+16*ROWNO; while(me.g_h+ma.g_h+st.g_h>=desk.g_h) ! ma.g_h-=16; ! st.g_y=desk.g_y+me.g_h+ma.g_h; ! todo=FALSE; } switch(which){ case NHW_MESSAGE: --- 1879,1951 ---- } } + void recalc_msg_win(GRECT *area){ + OBJECT *z_ob; + z_ob=zz_oblist[MSGWIN]; + z_ob[MSGLINES].ob_spec.userblk=&ub_msg; + z_ob[MSGLINES].ob_width= + z_ob[ROOT].ob_width= (msg_width+3)*msg_font.cw; + z_ob[MSGLINES].ob_width-=z_ob[UPMSG].ob_width; + z_ob[ROOT].ob_height= + z_ob[GRABMSGWIN].ob_height= + z_ob[MSGLINES].ob_height=msg_vis*msg_font.ch; + z_ob[DNMSG].ob_y=z_ob[GRABMSGWIN].ob_height-z_ob[DNMSG].ob_height; + window_border(0,0,0,z_ob->ob_width,z_ob->ob_height, area); + } + void recalc_status_win(GRECT *area){ + OBJECT *z_ob; + z_ob=zz_oblist[STATUSLINE]; + z_ob[ROOT].ob_type=G_USERDEF; + z_ob[ROOT].ob_spec.userblk=&ub_status; + z_ob[ROOT].ob_width=(status_w+2)*status_font.cw; + z_ob[ROOT].ob_height= + z_ob[GRABSTATUS].ob_height=2*status_font.ch; + z_ob[GRABSTATUS].ob_width=2*status_font.cw-2; + window_border(0,0,0,z_ob->ob_width,z_ob->ob_height,area); + } void calc_std_winplace(int which, GRECT *place){ static int todo=TRUE; static GRECT me, ma, st; ! if(todo || which<0){ OBJECT *z_ob; int map_h_off, foo; /* First the messagewin */ ! recalc_msg_win(&me); /* Now the map */ ! wind_calc(WC_BORDER,MAP_GADGETS,0,0,scroll_map.px_hline*(COLNO-1),scroll_map.px_vline*ROWNO,&foo,&foo,&foo,&map_h_off); ! map_h_off-=scroll_map.px_vline*ROWNO; ! window_border(MAP_GADGETS,0,0,scroll_map.px_hline*(COLNO-1),scroll_map.px_vline*ROWNO, &ma); /* Next the statuswin */ ! recalc_status_win(&st); /* And last but not least a final test */ ! ma.g_h=map_h_off+scroll_map.px_vline*ROWNO; while(me.g_h+ma.g_h+st.g_h>=desk.g_h) ! ma.g_h-=scroll_map.px_vline; ! /* stack the windows */ ! ma.g_y=me.g_y=st.g_y=desk.g_y; ! if(status_align){ ! ma.g_y+=st.g_h; ! if(msg_align){ ! st.g_y+=me.g_h; ! ma.g_y+=me.g_h; ! }else{ ! me.g_y+=st.g_h+ma.g_h; ! } ! }else{ ! if(msg_align){ ! ma.g_y+=me.g_h; ! }else{ ! me.g_y+=ma.g_h; ! } ! st.g_y+=me.g_h+ma.g_h; ! } ! if(which) todo=FALSE; } switch(which){ case NHW_MESSAGE: *************** *** 1589,1602 **** z_ob=zz_oblist[LINES]; scroll_menu.vsize=Anz_text_lines; scroll_menu.vpos=0; z_ob[LINESLIST].ob_spec.userblk=&ub_lines; breite=16; ! for(i=0;idi_win; --- 1983,2010 ---- z_ob=zz_oblist[LINES]; scroll_menu.vsize=Anz_text_lines; scroll_menu.vpos=0; + if(use_rip){ + if(!depack_img(planes<4 ? "RIP2.IMG" : "RIP.IMG", &rip_image)){ + mfdb(&Rip_bild, (int *)rip_image.addr, rip_image.img_w, rip_image.img_h, 1, rip_image.planes); + transform_img(&Rip_bild); + } + ub_lines.ub_code=draw_rip; + }else + ub_lines.ub_code=draw_lines; z_ob[LINESLIST].ob_spec.userblk=&ub_lines; breite=16; ! v_set_text(text_font.id,text_font.size,BLACK,0,0,NULL); ! for(i=0;idi_win; *************** *** 1621,1631 **** scroll_menu.vpos=0; z_ob[LINESLIST].ob_spec.userblk=&ub_inventory; if((Menu_title)&&(wind!=WIN_INVEN)) /* because I sets no Menu_title */ ! Max(&Inv_breite,Fcw*strlen(Menu_title)+16); ! mar_di_mode=mar_set_inv_win(Anz_inv_lines, Inv_breite); tmp_button=ob_get_text(z_ob,QLINE,0); ob_set_text(z_ob,QLINE,Inv_how!=PICK_NONE ? strCancel : strOk ); ! ob_doflag(z_ob,LINESLIST,SELECTABLE); Event_Handler(Inv_Init, Inv_Handler); if((Inv_dialog=open_dialog(z_ob,(wind==WIN_INVEN) ? "Inventory" : (Menu_title ? Menu_title : "Staun"), NULL, NULL, mar_ob_mapcenter(z_ob), FALSE, mar_di_mode, FAIL, NULL, NULL))!=NULL){ WIN *ptr_win=Inv_dialog->di_win; --- 2029,2041 ---- scroll_menu.vpos=0; z_ob[LINESLIST].ob_spec.userblk=&ub_inventory; if((Menu_title)&&(wind!=WIN_INVEN)) /* because I sets no Menu_title */ ! Max(&Inv_breite,gr_cw*strlen(Menu_title)+16); ! scroll_menu.px_vline=menu_font.ch; ! scroll_menu.px_hline=menu_font.cw; ! mar_di_mode=mar_set_inv_win(Anz_inv_lines, Inv_breite, NHW_MENU); tmp_button=ob_get_text(z_ob,QLINE,0); ob_set_text(z_ob,QLINE,Inv_how!=PICK_NONE ? strCancel : strOk ); ! ob_doflag(z_ob,LINESLIST,TOUCHEXIT); Event_Handler(Inv_Init, Inv_Handler); if((Inv_dialog=open_dialog(z_ob,(wind==WIN_INVEN) ? "Inventory" : (Menu_title ? Menu_title : "Staun"), NULL, NULL, mar_ob_mapcenter(z_ob), FALSE, mar_di_mode, FAIL, NULL, NULL))!=NULL){ WIN *ptr_win=Inv_dialog->di_win; *************** *** 1633,1639 **** ptr_win->scroll=&scroll_menu; mar_menu_set_slider(ptr_win); WindowItems(ptr_win,SCROLL_KEYS,scroll_keys); ! if((d_exit=X_Form_Do(NULL))!=W_ABANDON){ my_close_dialog(Inv_dialog,FALSE); if(d_exit!=W_CLOSED) ob_undostate(z_ob,d_exit&NO_CLICK,SELECTED); --- 2043,2085 ---- ptr_win->scroll=&scroll_menu; mar_menu_set_slider(ptr_win); WindowItems(ptr_win,SCROLL_KEYS,scroll_keys); ! do{ ! int y_wo,x_wo,ru_w=1,ru_h=1; ! GRECT oarea; ! Gem_menu_item *it; ! d_exit=X_Form_Do(NULL); ! if((d_exit&NO_CLICK)==LINESLIST){ ! ob_pos(z_ob,LINESLIST,&oarea); ! if(mouse(&x_wo,&y_wo) && Inv_how==PICK_ANY){ ! graf_rt_rubberbox(FALSE,x_wo,y_wo,FAIL,FAIL,&oarea,&ru_w,&ru_h,NULL); ! invert_all_on_page((int)((y_wo-oarea.g_y)/menu_font.ch+scroll_menu.vpos),(ru_h+menu_font.ch-1)/menu_font.ch,0); ! }else{ ! for(it=invent_list,i=0;i<((y_wo-oarea.g_y)/menu_font.ch+scroll_menu.vpos) && it;it=it->Gmi_next,i++); ! if(it && it->Gmi_identifier){ ! it->Gmi_selected=!it->Gmi_selected; ! it->Gmi_count= count==0L ? -1L : count; ! count = 0L; ! if(Inv_how!=PICK_ANY) ! break; ! } /* identifier */ ! } ! oarea.g_x=(oarea.g_x+23+2*menu_font.cw) & ~7; ! oarea.g_y=y_wo-(y_wo-oarea.g_y)%menu_font.ch; ! oarea.g_w=menu_font.cw; ! oarea.g_h=((ru_h+menu_font.ch-1)/menu_font.ch)*menu_font.ch; ! ob_draw_chg(Inv_dialog,LINESLIST,&oarea,FAIL); ! } ! if(Inv_how==PICK_ANY){ ! ob_set_text(Inv_dialog->di_tree,QLINE,strCancel); ! for(it=invent_list;it;it=it->Gmi_next) ! if(it->Gmi_identifier && it->Gmi_selected){ ! ob_set_text(Inv_dialog->di_tree,QLINE,strOk); ! break; ! } ! ob_draw_chg(Inv_dialog,QLINE,NULL,FAIL); ! } ! }while((d_exit&NO_CLICK)==LINESLIST); ! if(d_exit!=W_ABANDON){ my_close_dialog(Inv_dialog,FALSE); if(d_exit!=W_CLOSED) ob_undostate(z_ob,d_exit&NO_CLICK,SELECTED); *************** *** 1645,1651 **** case NHW_MAP: if(p_Gw->gw_window==NULL){ calc_std_winplace(NHW_MAP,&p_Gw->gw_place); ! window_border(MAP_GADGETS,0,0,16*COLNO,16*ROWNO, &g_mapmax); p_Gw->gw_window=open_window(md, md, NULL, zz_oblist[NHICON], MAP_GADGETS, TRUE, 128, 128, &g_mapmax, &p_Gw->gw_place, &scroll_map, win_draw_map, NULL, XM_TOP|XM_BOTTOM|XM_SIZE); WindowItems(p_Gw->gw_window,SCROLL_KEYS-1,scroll_keys); /* ClrHome centers on u */ mar_clear_map(); --- 2091,2097 ---- case NHW_MAP: if(p_Gw->gw_window==NULL){ calc_std_winplace(NHW_MAP,&p_Gw->gw_place); ! window_border(MAP_GADGETS,0,0,Tile_width*(COLNO-1),Tile_heigth*ROWNO, &g_mapmax); p_Gw->gw_window=open_window(md, md, NULL, zz_oblist[NHICON], MAP_GADGETS, TRUE, 128, 128, &g_mapmax, &p_Gw->gw_place, &scroll_map, win_draw_map, NULL, XM_TOP|XM_BOTTOM|XM_SIZE); WindowItems(p_Gw->gw_window,SCROLL_KEYS-1,scroll_keys); /* ClrHome centers on u */ mar_clear_map(); *************** *** 1658,1664 **** redraw_window(p_Gw->gw_window,&area); ! dirty_map_area.g_x=COLNO; dirty_map_area.g_y=ROWNO; dirty_map_area.g_w= dirty_map_area.g_h=0; --- 2104,2110 ---- redraw_window(p_Gw->gw_window,&area); ! dirty_map_area.g_x=COLNO-1; dirty_map_area.g_y=ROWNO; dirty_map_area.g_w= dirty_map_area.g_h=0; *************** *** 1672,1690 **** p_Gw->gw_window=open_window(NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, &p_Gw->gw_place, NULL, mar_draw_window, z_ob, XM_TOP|XM_BOTTOM|XM_SIZE); magx=tmp_magx; window_size(p_Gw->gw_window,&p_Gw->gw_window->curr); } if(p_Gw->gw_dirty){ while(messages_pro_zug>3){ messages_pro_zug-=3; msg_pos+=3; ! redraw_window(p_Gw->gw_window,NULL); mar_more(); } msg_pos+=messages_pro_zug; messages_pro_zug=0; if(msg_pos>msg_max) msg_pos=msg_max; ! redraw_window(p_Gw->gw_window,NULL); mar_message_pause=FALSE; } break; --- 2118,2138 ---- p_Gw->gw_window=open_window(NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, &p_Gw->gw_place, NULL, mar_draw_window, z_ob, XM_TOP|XM_BOTTOM|XM_SIZE); magx=tmp_magx; window_size(p_Gw->gw_window,&p_Gw->gw_window->curr); + p_Gw->gw_dirty=TRUE; } if(p_Gw->gw_dirty){ + ob_pos(zz_oblist[MSGWIN],MSGLINES,&area); while(messages_pro_zug>3){ messages_pro_zug-=3; msg_pos+=3; ! redraw_window(p_Gw->gw_window,&area); mar_more(); } msg_pos+=messages_pro_zug; messages_pro_zug=0; if(msg_pos>msg_max) msg_pos=msg_max; ! redraw_window(p_Gw->gw_window,&area); mar_message_pause=FALSE; } break; *************** *** 1695,1705 **** magx=0; /* MAR -- Fake E_GEM to remove Backdropper */ p_Gw->gw_window=open_window(NULL, NULL, NULL, NULL, 0, FALSE, 0, 0, NULL, &p_Gw->gw_place, NULL, mar_draw_window, z_ob, XM_TOP|XM_BOTTOM|XM_SIZE); magx=tmp_magx; ! /* Because 2*StFch is smaller then e_gem expects the minimum win_height */ p_Gw->gw_window->min_h=z_ob[ROOT].ob_height; window_size(p_Gw->gw_window,&p_Gw->gw_place); } ! /* Fall thru */ default: if(p_Gw->gw_dirty) redraw_window(p_Gw->gw_window,NULL); --- 2143,2159 ---- magx=0; /* MAR -- Fake E_GEM to remove Backdropper */ p_Gw->gw_window=open_window(NULL, NULL, NULL, NULL, 0, FALSE, 0, 0, NULL, &p_Gw->gw_place, NULL, mar_draw_window, z_ob, XM_TOP|XM_BOTTOM|XM_SIZE); magx=tmp_magx; ! /* Because 2*status_font.ch is smaller then e_gem expects the minimum win_height */ p_Gw->gw_window->min_h=z_ob[ROOT].ob_height; window_size(p_Gw->gw_window,&p_Gw->gw_place); + p_Gw->gw_dirty=TRUE; + } + while(get_dirty_rect(dr_stat,&area)){ + area.g_x=(area.g_x+p_Gw->gw_window->work.g_x+2*status_font.cw+6)&~7; + area.g_y+=p_Gw->gw_window->work.g_y; + redraw_window(p_Gw->gw_window,&area); } ! break; default: if(p_Gw->gw_dirty) redraw_window(p_Gw->gw_window,NULL); *************** *** 1732,1754 **** message_age=(int *)m_alloc(msg_anz*sizeof(int)); for(i=0;i= scroll_map.hpos + scroll_map.hpage - breite)){ ! scroll_map.hpos=map_cursx - 2*breite; adjust_needed=TRUE; } - if ((map_cursy < scroll_map.vpos + hoehe) || (map_cursy >= scroll_map.vpos + scroll_map.vpage - hoehe)){ ! scroll_map.vpos=map_cursy - 2*hoehe; adjust_needed=TRUE; } - if(adjust_needed) scroll_window(Gem_nhwindow[WIN_MAP].gw_window,WIN_SCROLL,NULL); } --- 2306,2332 ---- /************************* nh_poskey *******************************/ + void mar_set_margin(int m){ + Max(&m,0); + Min(&m,min(ROWNO,COLNO)); /* MAR 16.Mar 2002 -- the larger the less sense */ + scroll_margin=m; + } void mar_cliparound() { if(WIN_MAP!=WIN_ERR && Gem_nhwindow[WIN_MAP].gw_window){ ! int breite=scroll_margin>0 ? scroll_margin : max(scroll_map.hpage/4,1), ! hoehe=scroll_margin>0 ? scroll_margin : max(scroll_map.vpage/4,1), ! adjust_needed; adjust_needed=FALSE; if ((map_cursx < scroll_map.hpos + breite) || (map_cursx >= scroll_map.hpos + scroll_map.hpage - breite)){ ! scroll_map.hpos=map_cursx - scroll_map.hpage/2; adjust_needed=TRUE; } if ((map_cursy < scroll_map.vpos + hoehe) || (map_cursy >= scroll_map.vpos + scroll_map.vpage - hoehe)){ ! scroll_map.vpos=map_cursy - scroll_map.vpage/2; adjust_needed=TRUE; } if(adjust_needed) scroll_window(Gem_nhwindow[WIN_MAP].gw_window,WIN_SCROLL,NULL); } *************** *** 1874,1879 **** --- 2341,2349 ---- mar_display_nhwindow(WIN_MESSAGE); } + if(WIN_MAP!=WIN_ERR) + mar_cliparound(); + if(WIN_STATUS!=WIN_ERR){ mar_check_hilight_status(); mar_display_nhwindow(WIN_STATUS); *************** *** 1922,1930 **** kpad = mar_iflags_numpad()==1 ? numpad : keypad; if (shift & K_SHIFT) ch = kpad[scan - KEYPADLO].shift; ! else if (shift & K_CTRL) ch = kpad[scan - KEYPADLO].cntrl; ! else ch = kpad[scan - KEYPADLO].normal; } if(scan==SCANHOME) --- 2392,2405 ---- kpad = mar_iflags_numpad()==1 ? numpad : keypad; if (shift & K_SHIFT) ch = kpad[scan - KEYPADLO].shift; ! else if (shift & K_CTRL){ ! if(scan>=0x67 && scan<=0x6f && scan!=0x6b){ ! send_key(kpad[scan - KEYPADLO].normal); ! ch = 'g'; ! }else{ ch = kpad[scan - KEYPADLO].cntrl; ! } ! }else ch = kpad[scan - KEYPADLO].normal; } if(scan==SCANHOME) *************** *** 1938,1943 **** --- 2413,2422 ---- draw_cursor=!draw_cursor; mar_curs(map_cursx,map_cursy); mar_display_nhwindow(WIN_MAP); + }else if(scan == SCANF4){ /* Font-Selector */ + if(!CallFontSelector(0,FAIL,FAIL,FAIL,FAIL)){ + xalert(1,1,X_ICN_ALERT,NULL,SYS_MODAL,BUTTONS_RIGHT,TRUE,"Hello","Fontselector not available!",NULL); + } }else if(!ch && shift&K_CTRL && scan==-57){ /* MAR -- nothing ignore Ctrl-Alt-Clr/Home == MagiC's restore screen */ }else{ *************** *** 1954,1960 **** WIN *akt_win=window_find(ex,ey); if(WIN_MAP != WIN_ERR && akt_win==Gem_nhwindow[WIN_MAP].gw_window){ ! *x=max(min((ex-akt_win->work.g_x)/scroll_map.px_hline+scroll_map.hpos,COLNO),0)+1; *y=max(min((ey-akt_win->work.g_y)/scroll_map.px_vline+scroll_map.vpos,ROWNO),0); *mod=xev.ev_mmobutton; retval=0; --- 2433,2439 ---- WIN *akt_win=window_find(ex,ey); if(WIN_MAP != WIN_ERR && akt_win==Gem_nhwindow[WIN_MAP].gw_window){ ! *x=max(min((ex-akt_win->work.g_x)/scroll_map.px_hline+scroll_map.hpos,COLNO-1),0)+1; *y=max(min((ey-akt_win->work.g_y)/scroll_map.px_vline+scroll_map.vpos,ROWNO),0); *mod=xev.ev_mmobutton; retval=0; *************** *** 1997,2004 **** break; case '3': draw_cursor=!draw_cursor; ! if(WIN_MAP != WIN_ERR && Gem_nhwindow[WIN_MAP].gw_window) ! redraw_window(Gem_nhwindow[WIN_MAP].gw_window,NULL); break; default: } --- 2476,2483 ---- break; case '3': draw_cursor=!draw_cursor; ! mar_curs(map_cursx,map_cursy); ! mar_display_nhwindow(WIN_MAP); break; default: } *************** *** 2011,2016 **** --- 2490,2513 ---- case WM_CLOSED: WindowHandler(W_ICONIFYALL,NULL,NULL); break; + case AP_TERM: + retval='S'; + break; + case FONT_CHANGED: + if(buf[3]>=0){ + if(buf[3]==Gem_nhwindow[WIN_MESSAGE].gw_window->handle){ + mar_set_fontbyid(NHW_MESSAGE,buf[4],buf[5]); + mar_display_nhwindow(WIN_MESSAGE); + }else if(buf[3]==Gem_nhwindow[WIN_MAP].gw_window->handle){ + mar_set_fontbyid(NHW_MAP,buf[4],buf[5]); + mar_display_nhwindow(WIN_MAP); + }else if(buf[3]==Gem_nhwindow[WIN_STATUS].gw_window->handle){ + mar_set_fontbyid(NHW_STATUS,buf[4],buf[5]); + mar_display_nhwindow(WIN_STATUS); + } + FontAck(buf[1],1); + } + break; default: break; } *************** *** 2039,2048 **** int Gem_doprev_message() { ! if(msg_pos>2) msg_pos--; if(WIN_MESSAGE != WIN_ERR) Gem_nhwindow[WIN_MESSAGE].gw_dirty=TRUE; mar_display_nhwindow(WIN_MESSAGE); return(0); } --- 2536,2547 ---- int Gem_doprev_message() { ! if(msg_pos>2){ ! msg_pos--; if(WIN_MESSAGE != WIN_ERR) Gem_nhwindow[WIN_MESSAGE].gw_dirty=TRUE; mar_display_nhwindow(WIN_MESSAGE); + } return(0); } *************** *** 2056,2076 **** { static int tile_mode=TRUE; static GRECT prev; ! WIN *z_w=Gem_nhwindow[WIN_MAP].gw_window; ! if(tiles<0) return(tile_mode); else{ GRECT tmp; - if(tile_mode==tiles || (mar_set_rogue(FAIL) && tiles) || !z_w) - return(FAIL); - tile_mode=tiles; ! map_cell_width= tiles ? 16 : Fcw; ! scroll_map.px_hline=map_cell_width; ! scroll_map.px_vline=tiles ? 16 : Fch; ! window_border(MAP_GADGETS,0,0,map_cell_width*COLNO,16*ROWNO, &tmp); z_w->max.g_w=tmp.g_w; if(tiles) z_w->curr=prev; else --- 2555,2577 ---- { static int tile_mode=TRUE; static GRECT prev; ! WIN *z_w=WIN_MAP!=WIN_ERR ? Gem_nhwindow[WIN_MAP].gw_window : NULL; ! if(tiles<0) ! return(tile_mode); ! else if(!z_w) ! tile_mode=tiles; ! else if(tile_mode==tiles || (mar_set_rogue(FAIL) && tiles)) ! return(FAIL); else{ GRECT tmp; tile_mode=tiles; ! scroll_map.px_hline= tiles ? Tile_width : map_font.cw; ! scroll_map.px_vline= tiles ? Tile_heigth : map_font.ch; ! window_border(MAP_GADGETS,0,0,scroll_map.px_hline*(COLNO-1),scroll_map.px_vline*ROWNO, &tmp); z_w->max.g_w=tmp.g_w; + z_w->max.g_h=tmp.g_h; if(tiles) z_w->curr=prev; else *************** *** 2120,2152 **** winid window; int x, y, gl; { static int pla[8]; ! if(window != WIN_ERR && window==WIN_MAP){ ! Min(&dirty_map_area.g_x,x); ! Min(&dirty_map_area.g_y,y); ! Max(&dirty_map_area.g_w,x); ! Max(&dirty_map_area.g_h,y); ! Gem_nhwindow[window].gw_dirty=TRUE; ! if(mar_set_tile_mode(FAIL)){ ! pla[2]=pla[0]=(gl%20)*16; ! pla[3]=pla[1]=(gl/20)*16; ! pla[2]+=15; ! pla[3]+=15; ! pla[6]=pla[4]=16*x; /* x_wert to */ ! pla[7]=pla[5]=16*y; /* y_wert to */ ! pla[6]+=15; ! pla[7]+=15; vro_cpyfm(x_handle, gl!=-1 ? S_ONLY : ALL_BLACK, pla, &Tile_bilder, &Map_bild); } } - } void mar_print_char(window, x, y, ch, col) winid window; ! int x, y; char ch; int col; { --- 2621,2646 ---- winid window; int x, y, gl; { + if(window != WIN_ERR && window==WIN_MAP){ static int pla[8]; ! pla[2]=pla[0]=(gl%Tiles_per_line)*Tile_width; ! pla[3]=pla[1]=(gl/Tiles_per_line)*Tile_heigth; ! pla[2]+=Tile_width-1; ! pla[3]+=Tile_heigth-1; ! pla[6]=pla[4]=Tile_width*x; /* x_wert to */ ! pla[7]=pla[5]=Tile_heigth*y; /* y_wert to */ ! pla[6]+=Tile_width-1; ! pla[7]+=Tile_heigth-1; vro_cpyfm(x_handle, gl!=-1 ? S_ONLY : ALL_BLACK, pla, &Tile_bilder, &Map_bild); } } void mar_print_char(window, x, y, ch, col) winid window; ! int x, y; char ch; int col; { *************** *** 2158,2172 **** pla[0]= pla[1]=0; ! pla[2]=Fcw-1; ! pla[3]=Fch-1; ! pla[6]=pla[4]=Fcw*x; ! pla[7]=pla[5]=Fch*y; ! pla[6]+=Fcw-1; ! pla[7]+=Fch-1; colindex[0]=gem_color[col]; colindex[1]=WHITE; ! vrt_cpyfm(x_handle,MD_REPLACE,pla,&Black_bild,&Map_bild,colindex); } } --- 2652,2666 ---- pla[0]= pla[1]=0; ! pla[2]=map_font.cw-1; ! pla[3]=map_font.ch-1; ! pla[6]=pla[4]=map_font.cw*x; ! pla[7]=pla[5]=map_font.ch*y; ! pla[6]+=map_font.cw-1; ! pla[7]+=map_font.ch-1; colindex[0]=gem_color[col]; colindex[1]=WHITE; ! vrt_cpyfm(x_handle,MD_REPLACE,pla,&Black_bild,&FontCol_Bild,colindex); } } *************** *** 2186,2194 **** z_ob[LGPROMPT].ob_type=G_USERDEF; z_ob[LGPROMPT].ob_spec.userblk=&ub_prompt; ! z_ob[LGPROMPT].ob_height=2*Fch; ! length=z_ob[LGPROMPT].ob_width/Fcw; if(strlen(ques)>length){ tmp=ques+length; while(*tmp!=' ' && tmp>=ques){ --- 2680,2688 ---- z_ob[LGPROMPT].ob_type=G_USERDEF; z_ob[LGPROMPT].ob_spec.userblk=&ub_prompt; ! z_ob[LGPROMPT].ob_height=2*gr_ch; ! length=z_ob[LGPROMPT].ob_width/gr_cw; if(strlen(ques)>length){ tmp=ques+length; while(*tmp!=' ' && tmp>=ques){ *************** *** 2361,2369 **** if(strstr(query,"irect")) return(mar_ask_direction()); ! len=min(strlen(query),(max_w-8*Fcw)/Fcw); ! z_ob[ROOT].ob_width=(len+8)*Fcw; ! z_ob[YNPROMPT].ob_width=Fcw*len+8; tmp=ob_get_text(z_ob,YNPROMPT,0); ob_set_text(z_ob,YNPROMPT,mar_copy_of(query)); --- 2855,2863 ---- if(strstr(query,"irect")) return(mar_ask_direction()); ! len=min(strlen(query),(max_w-8*gr_cw)/gr_cw); ! z_ob[ROOT].ob_width=(len+8)*gr_cw; ! z_ob[YNPROMPT].ob_width=gr_cw*len+8; tmp=ob_get_text(z_ob,YNPROMPT,0); ob_set_text(z_ob,YNPROMPT,mar_copy_of(query)); *************** *** 2397,2407 **** } z_ob[SOMECHARS].ob_width=z_ob[YN1+i].ob_x+8; ! z_ob[SOMECHARS].ob_height=z_ob[YN1+i].ob_y+Fch+Fch/2; ! Max((int *)&z_ob[ROOT].ob_width,z_ob[SOMECHARS].ob_width+4*Fcw); ! z_ob[ROOT].ob_height=z_ob[SOMECHARS].ob_height+4*Fch; if(strchr(resp,'#')) ! z_ob[ROOT].ob_height=z_ob[YNOK].ob_y+2*Fch; for(i+=YN1;i<(YNN+1);i+=2){ ob_hide(z_ob,i,TRUE); --- 2891,2901 ---- } z_ob[SOMECHARS].ob_width=z_ob[YN1+i].ob_x+8; ! z_ob[SOMECHARS].ob_height=z_ob[YN1+i].ob_y+gr_ch+gr_ch/2; ! Max((int *)&z_ob[ROOT].ob_width,z_ob[SOMECHARS].ob_width+4*gr_cw); ! z_ob[ROOT].ob_height=z_ob[SOMECHARS].ob_height+4*gr_ch; if(strchr(resp,'#')) ! z_ob[ROOT].ob_height=z_ob[YNOK].ob_y+2*gr_ch; for(i+=YN1;i<(YNN+1);i+=2){ ob_hide(z_ob,i,TRUE); *************** *** 2412,2422 **** ob_hide(z_ob,ANYCHAR,FALSE); ob_hide(z_ob,YNOK,TRUE); ob_hide(z_ob,COUNT,TRUE); ! z_ob[ANYCHAR].ob_height=2*Fch; z_ob[CHOSENCH].ob_y= ! z_ob[CHOSENCH+1].ob_y=Fch/2; ! z_ob[ROOT].ob_width=max(z_ob[YNPROMPT].ob_width+z_ob[YNPROMPT].ob_x,z_ob[ANYCHAR].ob_width+z_ob[ANYCHAR].ob_x)+2*Fcw; ! z_ob[ROOT].ob_height=z_ob[ANYCHAR].ob_height+z_ob[ANYCHAR].ob_y+Fch/2; *ob_get_text(z_ob,CHOSENCH,0)='?'; Event_Handler(any_init,any_handler); } --- 2906,2916 ---- ob_hide(z_ob,ANYCHAR,FALSE); ob_hide(z_ob,YNOK,TRUE); ob_hide(z_ob,COUNT,TRUE); ! z_ob[ANYCHAR].ob_height=2*gr_ch; z_ob[CHOSENCH].ob_y= ! z_ob[CHOSENCH+1].ob_y=gr_ch/2; ! z_ob[ROOT].ob_width=max(z_ob[YNPROMPT].ob_width+z_ob[YNPROMPT].ob_x,z_ob[ANYCHAR].ob_width+z_ob[ANYCHAR].ob_x)+2*gr_cw; ! z_ob[ROOT].ob_height=z_ob[ANYCHAR].ob_height+z_ob[ANYCHAR].ob_y+gr_ch/2; *ob_get_text(z_ob,CHOSENCH,0)='?'; Event_Handler(any_init,any_handler); } *** nethack-3.3.1/win/gnome/gnaskstr.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnaskstr.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnaskstr.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnaskstr.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnaskstr.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnaskstr.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnaskstr.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnaskstr.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnbind.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnbind.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnbind.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnbind.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 21,26 **** --- 21,27 ---- /* Interface definition, for windows.c */ struct window_procs Gnome_procs = { "Gnome", + WC_COLOR|WC_HILITE_PET|WC_INVERSE, gnome_init_nhwindows, gnome_player_selection, gnome_askname, *************** *** 69,74 **** --- 70,76 ---- gnome_start_screen, gnome_end_screen, gnome_outrip, + genl_preference_update, }; /* *************** *** 110,158 **** offers a Quit option, it is its responsibility to clean up and terminate the process. You need to fill in pl_character[0]. */ ! void gnome_player_selection() { ! int num_roles, availcount, i, nRole; ! const char** choices; ! /* select a role */ ! for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue; ! choices = (const char **)alloc(sizeof(char *) * (num_roles+1)); ! for (;;) { ! availcount = 0; ! for (i = 0; i < num_roles; i++) { ! choices[i] = 0; ! if (ok_role(i, flags.initrace, ! flags.initgend, flags.initalign)) { ! choices[i] = roles[i].name.m; ! if (flags.initgend >= 0 && flags.female && roles[i].name.f) ! choices[i] = roles[i].name.f; ! ++availcount; ! } } ! if (availcount > 0) break; ! else if (flags.initalign >= 0) flags.initalign = -1; /* reset */ ! else if (flags.initgend >= 0) flags.initgend = -1; ! else if (flags.initrace >= 0) flags.initrace = -1; ! else panic("no available ROLE+race+gender+alignment combinations"); ! } ! choices[num_roles] = (const char *) 0; ! nRole=ghack_player_sel_dialog(choices); ! ! /* Quit */ ! if ( nRole == -1 ) ! { ! clearlocks(); ! gnome_exit_nhwindows(0); } ! /* Random role */ ! if ( nRole == -2) ! { ! nRole = rn2(num_roles); ! pline("This game you will be %s", an(choices[nRole])); } - - flags.initrole = nRole; } --- 112,333 ---- offers a Quit option, it is its responsibility to clean up and terminate the process. You need to fill in pl_character[0]. */ ! void ! gnome_player_selection() { ! int n, i, sel; ! const char** choices; ! int* pickmap; ! ! /* prevent an unnecessary prompt */ ! rigid_role_checks(); ! ! if (!flags.randomall && flags.initrole < 0) { ! ! /* select a role */ ! for (n = 0; roles[n].name.m; n++) continue; ! choices = (const char **)alloc(sizeof(char *) * (n+1)); ! pickmap = (int*)alloc(sizeof(int) * (n+1)); ! for (;;) { ! for (n = 0, i = 0; roles[i].name.m; i++) { ! if (ok_role(i, flags.initrace, ! flags.initgend, flags.initalign)) { ! if (flags.initgend >= 0 && flags.female && roles[i].name.f) ! choices[n] = roles[i].name.f; ! else ! choices[n] = roles[i].name.m; ! pickmap[n++] = i; ! } ! } ! if (n > 0) break; ! else if (flags.initalign >= 0) flags.initalign = -1; /* reset */ ! else if (flags.initgend >= 0) flags.initgend = -1; ! else if (flags.initrace >= 0) flags.initrace = -1; ! else panic("no available ROLE+race+gender+alignment combinations"); ! } ! choices[n] = (const char *) 0; ! if (n > 1) ! sel = ghack_player_sel_dialog(choices, ! _("Player selection"), _("Choose one of the following roles:")); ! else sel = 0; ! if (sel >= 0) sel = pickmap[sel]; ! else if (sel == ROLE_NONE) { /* Quit */ ! clearlocks(); ! gnome_exit_nhwindows(0); ! } ! free(choices); ! free(pickmap); ! } else if (flags.initrole < 0) sel = ROLE_RANDOM; ! else sel = flags.initrole; ! ! if (sel == ROLE_RANDOM) { /* Random role */ ! sel = pick_role(flags.initrace, flags.initgend, ! flags.initalign, PICK_RANDOM); ! if (sel < 0) sel = randrole(); ! } ! flags.initrole = sel; ! ! /* Select a race, if necessary */ ! /* force compatibility with role, try for compatibility with ! * pre-selected gender/alignment */ ! if (flags.initrace < 0 || !validrace(flags.initrole, flags.initrace)) { ! if (flags.initrace == ROLE_RANDOM || flags.randomall) { ! flags.initrace = pick_race(flags.initrole, flags.initgend, ! flags.initalign, PICK_RANDOM); ! if (flags.initrace < 0) flags.initrace = randrace(flags.initrole); ! } else { ! /* Count the number of valid races */ ! n = 0; /* number valid */ ! for (i = 0; races[i].noun; i++) { ! if (ok_race(flags.initrole, i, flags.initgend, flags.initalign)) ! n++; ! } ! if (n == 0) { ! for (i = 0; races[i].noun; i++) { ! if (validrace(flags.initrole, i)) n++; ! } ! } ! ! choices = (const char **)alloc(sizeof(char *) * (n+1)); ! pickmap = (int*)alloc(sizeof(int) * (n + 1)); ! for (n = 0, i = 0; races[i].noun; i++) { ! if (ok_race(flags.initrole, i, flags.initgend, ! flags.initalign)) { ! choices[n] = races[i].noun; ! pickmap[n++] = i; ! } ! } ! choices[n] = (const char *) 0; ! /* Permit the user to pick, if there is more than one */ ! if (n > 1) ! sel = ghack_player_sel_dialog(choices, _("Race selection"), ! _("Choose one of the following races:")); ! else sel = 0; ! if (sel >= 0) sel = pickmap[sel]; ! else if (sel == ROLE_NONE) { /* Quit */ ! clearlocks(); ! gnome_exit_nhwindows(0); ! } ! flags.initrace = sel; ! free(choices); ! free(pickmap); ! } ! if (flags.initrace == ROLE_RANDOM) { /* Random role */ ! sel = pick_race(flags.initrole, flags.initgend, ! flags.initalign, PICK_RANDOM); ! if (sel < 0) sel = randrace(flags.initrole); ! flags.initrace = sel; ! } } ! ! /* Select a gender, if necessary */ ! /* force compatibility with role/race, try for compatibility with ! * pre-selected alignment */ ! if (flags.initgend < 0 || ! !validgend(flags.initrole, flags.initrace, flags.initgend)) { ! if (flags.initgend == ROLE_RANDOM || flags.randomall) { ! flags.initgend = pick_gend(flags.initrole, flags.initrace, ! flags.initalign, PICK_RANDOM); ! if (flags.initgend < 0) ! flags.initgend = randgend(flags.initrole, flags.initrace); ! } else { ! /* Count the number of valid genders */ ! n = 0; /* number valid */ ! for (i = 0; i < ROLE_GENDERS; i++) { ! if (ok_gend(flags.initrole, flags.initrace, i, flags.initalign)) ! n++; ! } ! if (n == 0) { ! for (i = 0; i < ROLE_GENDERS; i++) { ! if (validgend(flags.initrole, flags.initrace, i)) n++; ! } ! } ! ! choices = (const char **)alloc(sizeof(char *) * (n+1)); ! pickmap = (int*)alloc(sizeof(int) * (n + 1)); ! for (n = 0, i = 0; i < ROLE_GENDERS; i++) { ! if (ok_gend(flags.initrole, flags.initrace, i, ! flags.initalign)) { ! choices[n] = genders[i].adj; ! pickmap[n++] = i; ! } ! } ! choices[n] = (const char *) 0; ! /* Permit the user to pick, if there is more than one */ ! if (n > 1) ! sel = ghack_player_sel_dialog(choices, _("Gender selection"), ! _("Choose one of the following genders:")); ! else sel = 0; ! if (sel >= 0) sel = pickmap[sel]; ! else if (sel == ROLE_NONE) { /* Quit */ ! clearlocks(); ! gnome_exit_nhwindows(0); ! } ! flags.initgend = sel; ! free(choices); ! free(pickmap); ! } ! if (flags.initgend == ROLE_RANDOM) { /* Random gender */ ! sel = pick_gend(flags.initrole, flags.initrace, ! flags.initalign, PICK_RANDOM); ! if (sel < 0) sel = randgend(flags.initrole, flags.initrace); ! flags.initgend = sel; ! } } ! ! /* Select an alignment, if necessary */ ! /* force compatibility with role/race/gender */ ! if (flags.initalign < 0 || ! !validalign(flags.initrole, flags.initrace, flags.initalign)) { ! if (flags.initalign == ROLE_RANDOM || flags.randomall) { ! flags.initalign = pick_align(flags.initrole, flags.initrace, ! flags.initgend, PICK_RANDOM); ! if (flags.initalign < 0) ! flags.initalign = randalign(flags.initrole, flags.initrace); ! } else { ! /* Count the number of valid alignments */ ! n = 0; /* number valid */ ! for (i = 0; i < ROLE_ALIGNS; i++) { ! if (ok_align(flags.initrole, flags.initrace, flags.initgend, i)) ! n++; ! } ! if (n == 0) { ! for (i = 0; i < ROLE_ALIGNS; i++) ! if (validalign(flags.initrole, flags.initrace, i)) n++; ! } ! ! choices = (const char **)alloc(sizeof(char *) * (n+1)); ! pickmap = (int*)alloc(sizeof(int) * (n + 1)); ! for (n = 0, i = 0; i < ROLE_ALIGNS; i++) { ! if (ok_align(flags.initrole, ! flags.initrace, flags.initgend, i)) { ! choices[n] = aligns[i].adj; ! pickmap[n++] = i; ! } ! } ! choices[n] = (const char *) 0; ! /* Permit the user to pick, if there is more than one */ ! if (n > 1) ! sel = ghack_player_sel_dialog(choices, _("Alignment selection"), ! _("Choose one of the following alignments:")); ! else sel = 0; ! if (sel >= 0) sel = pickmap[sel]; ! else if (sel == ROLE_NONE) { /* Quit */ ! clearlocks(); ! gnome_exit_nhwindows(0); ! } ! flags.initalign = sel; ! free(choices); ! free(pickmap); ! } ! if (flags.initalign == ROLE_RANDOM) { ! sel = pick_align(flags.initrole, flags.initrace, ! flags.initgend, PICK_RANDOM); ! if (sel < 0) sel = randalign(flags.initrole, flags.initrace); ! flags.initalign = sel; ! } } } *************** *** 973,979 **** Strcat(ripString, buf); /* Put $ on stone */ ! Sprintf(buf, "%ld Au\n", u.ugold); Strcat(ripString, buf); /* Put together death description */ --- 1148,1159 ---- Strcat(ripString, buf); /* Put $ on stone */ ! Sprintf(buf, "%ld Au\n", ! #ifndef GOLDOBJ ! u.ugold); ! #else ! done_money); ! #endif Strcat(ripString, buf); /* Put together death description */ *************** *** 1001,1006 **** ghack_text_window_rip_string( ripString); } - - - --- 1181,1183 ---- *** nethack-3.3.1/win/gnome/gnbind.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnbind.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnbind.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnbind.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnglyph.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnglyph.c Thu Mar 21 07:37:44 2002 *************** *** 1,8 **** ! /* SCCS Id: @(#)gnglyph.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnglyph.h" static GHackGlyphs ghack_glyphs; static GdkImlibImage** ghack_tiles = NULL; --- 1,9 ---- ! /* SCCS Id: @(#)gnglyph.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnglyph.h" + #include "tile2x11.h" static GHackGlyphs ghack_glyphs; static GdkImlibImage** ghack_tiles = NULL; *************** *** 28,35 **** * NOTES: * The glyphs (tiles) must be in the image in a certain way: the * glyphs must be stacked such that the resultant image is ! * TILE_X wide, and TILE_Y * (number of glyphs) high. In this ! * sense, TILE_X == TILE_Y, and can be any reasonable integer-- * say, 16 <= TILE_X <= 64. Because the glyph number is tightly * coupled to the Nethack object it represents, the order of the * glyphs in the image is imporant: Glyph 1 is at the top of the --- 29,37 ---- * NOTES: * The glyphs (tiles) must be in the image in a certain way: the * glyphs must be stacked such that the resultant image is ! * TILE_X * TILES_PER_ROW wide, and ! * TILE_Y * (number of glyphs) / TILES_PER_ROW high (rounded up). ! * In this sense, TILE_X == TILE_Y, and can be any reasonable integer * say, 16 <= TILE_X <= 64. Because the glyph number is tightly * coupled to the Nethack object it represents, the order of the * glyphs in the image is imporant: Glyph 1 is at the top of the *************** *** 55,66 **** gdk_imlib_render(ghack_glyphs.im, ghack_glyphs.im->rgb_width, ghack_glyphs.im->rgb_height); ! ghack_glyphs.count = ghack_glyphs.im->rgb_height / ghack_glyphs.im->rgb_width; ! ghack_glyphs.width = ghack_glyphs.im->rgb_width; ! ghack_glyphs.height = ghack_glyphs.im->rgb_height / ghack_glyphs.count; ! /* Assume the tiles are stacked vertically. * Further, assume that the tiles are SQUARE */ ghack_tiles = g_new0( GdkImlibImage*, ghack_glyphs.count ); --- 57,75 ---- gdk_imlib_render(ghack_glyphs.im, ghack_glyphs.im->rgb_width, ghack_glyphs.im->rgb_height); ! if (ghack_glyphs.im->rgb_width % TILES_PER_ROW) { ! g_error("%s is not a multiple of %d (number of tiles/row) pixels wide", ! xpmFile, TILES_PER_ROW); ! return -1; ! } ! ghack_glyphs.width = ghack_glyphs.im->rgb_width / TILES_PER_ROW; ! ghack_glyphs.height = ghack_glyphs.width; ! ghack_glyphs.count = ! (ghack_glyphs.im->rgb_height * ghack_glyphs.im->rgb_width) / ! (ghack_glyphs.width * ghack_glyphs.height); ! /* Assume the tiles are organized in rows of TILES_PER_ROW * Further, assume that the tiles are SQUARE */ ghack_tiles = g_new0( GdkImlibImage*, ghack_glyphs.count ); *************** *** 186,193 **** (force==TRUE)? "TRUE" : "FALSE"); } ! if (!ghack_tiles[tile] || force) ! { #if 0 fprintf( stderr, "crop_and_clone: glyph=%d, tile=%d, ptr=%p, x=%d, y=%d, w=%d, h=%d\n", glyph, tile, (void*)&(ghack_tiles[tile]), 0, --- 195,202 ---- (force==TRUE)? "TRUE" : "FALSE"); } ! if (!ghack_tiles[tile] || force) { ! int src_x, src_y; #if 0 fprintf( stderr, "crop_and_clone: glyph=%d, tile=%d, ptr=%p, x=%d, y=%d, w=%d, h=%d\n", glyph, tile, (void*)&(ghack_tiles[tile]), 0, *************** *** 197,204 **** #endif if (ghack_glyphs.im->pixmap == NULL) g_warning( "Aiiee! ghack_glyphs.im->pixmap==NULL!!!!\n"); ! ghack_tiles[tile] = gdk_imlib_crop_and_clone_image(ghack_glyphs.im, 0, ! tile * ghack_glyphs.width, ghack_glyphs.height, ghack_glyphs.width); } --- 206,215 ---- #endif if (ghack_glyphs.im->pixmap == NULL) g_warning( "Aiiee! ghack_glyphs.im->pixmap==NULL!!!!\n"); ! src_x = (tile % TILES_PER_ROW) * ghack_glyphs.width; ! src_y = (tile / TILES_PER_ROW) * ghack_glyphs.height; ! ghack_tiles[tile] = gdk_imlib_crop_and_clone_image(ghack_glyphs.im, ! src_x, src_y, ghack_glyphs.height, ghack_glyphs.width); } *************** *** 216,219 **** return ghack_tiles[tile]; } - --- 227,229 ---- *** nethack-3.3.1/win/gnome/gnglyph.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnglyph.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnglyph.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnglyph.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnmain.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmain.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmain.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmain.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 11,16 **** --- 11,17 ---- #include #include #include + #include #include "hack.h" #include "date.h" *************** *** 137,143 **** _("\nSend comments and bug reports to: nethack-bugs@nethack.org\n" "This game is free software. See License for details.")); about = gnome_about_new(_("Nethack"), ! buf1, "(C) 1985-2000 Mike Stephenson", (const char **)authors, buf, NULL); gtk_signal_connect (GTK_OBJECT (about), "destroy", --- 138,145 ---- _("\nSend comments and bug reports to: nethack-bugs@nethack.org\n" "This game is free software. See License for details.")); about = gnome_about_new(_("Nethack"), ! buf1, "Copyright (C) 1985-2002 Mike Stephenson", ! (const char **)authors, buf, NULL); gtk_signal_connect (GTK_OBJECT (about), "destroy", *************** *** 651,659 **** --- 653,707 ---- return; } + /* + * [ALI] Gnome installs its own handler(s) for SIGBUS, SIGFPE and SIGSEGV. + * These handlers will fork and exec a helper program. When that helper + * comes to initialize GTK+, it may fail if setuid/setgid. We solve this + * by dropping privileges before passing the signal along the chain. + * Note: We don't need to either drop or mask the saved ID since this + * will be reset when the child process performs the execve() anyway. + */ + + static struct { + int signum; + void (*handler)(int); + } ghack_chain[] = { + {SIGBUS}, + {SIGFPE}, + {SIGSEGV}, + {SIGILL} /* Not currently handled by Gnome */ + }; + + static void ghack_sig_handler(int signum) + { + int i; + uid_t uid, euid; + gid_t gid, egid; + uid = getuid(); + euid = geteuid(); + gid = getgid(); + egid = getegid(); + if (gid != egid) + setgid(gid); + if (uid != euid) + setuid(uid); + for(i = SIZE(ghack_chain) - 1; i >= 0; i--) + if (ghack_chain[i].signum == signum) { + ghack_chain[i].handler(signum); + break; + } + if (i < 0) + impossible("Unhandled ghack signal"); + if (uid != euid) + setuid(euid); + if (gid != egid) + setgid(egid); + } + /* initialize gnome and fir up the main window */ void ghack_init_main_window( int argc, char** argv) { + int i; struct timeval tv; uid_t uid, euid; *************** *** 672,678 **** --- 720,729 ---- euid = geteuid(); if (uid != euid) setuid(uid); + hide_privileges(TRUE); + /* XXX gnome_init must print nethack options for --help, but does not */ gnome_init ("nethack", VERSION_STRING, argc, argv); + hide_privileges(FALSE); parse_args (argc, argv); /* Initialize the i18n stuff (not that gnomehack supperts it yet...) */ *************** *** 712,717 **** --- 763,771 ---- * has already been shown */ if (uid != euid) setuid(euid); + for(i = 0; i < SIZE(ghack_chain); i++) + ghack_chain[i].handler = + signal(ghack_chain[i].signum, ghack_sig_handler); } void ghack_main_window_add_map_window(GtkWidget* win) *************** *** 769,772 **** { return( GTK_WIDGET(mainWindow) ); } - --- 823,825 ---- *** nethack-3.3.1/win/gnome/gnmain.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmain.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmain.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmain.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnmap.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmap.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmap.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmap.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 180,191 **** /* Tile the map background with a pretty image */ background = gdk_imlib_load_image((char *) "mapbg.xpm"); - gdk_imlib_render( background, background->rgb_width, - background->rgb_height); if (background == NULL) { g_warning("Bummer! Failed to load the map background image (mapbg.xpm)!"); } else { /* Tile the map background */ for (y = 0; y < height+background->rgb_height; y+=background->rgb_height) { --- 180,192 ---- /* Tile the map background with a pretty image */ background = gdk_imlib_load_image((char *) "mapbg.xpm"); if (background == NULL) { g_warning("Bummer! Failed to load the map background image (mapbg.xpm)!"); } else { + gdk_imlib_render(background, background->rgb_width, + background->rgb_height); + /* Tile the map background */ for (y = 0; y < height+background->rgb_height; y+=background->rgb_height) { *************** *** 229,243 **** /* Set up the pet mark image */ petmark = gdk_imlib_create_image_from_xpm_data( pet_mark_xpm); - gdk_imlib_render( petmark, petmark->rgb_width, - petmark->rgb_height); if (petmark == NULL) { g_warning("Bummer! Failed to load the pet_mark image!"); } else { /* ghack_map.overlay is an array of canvas images used to * overlay tile images... ! */ for (i=0, y = 0; y < height; y+=ghack_glyph_height()) { for (x = 0; x < width; x+=ghack_glyph_width()) --- 230,245 ---- /* Set up the pet mark image */ petmark = gdk_imlib_create_image_from_xpm_data( pet_mark_xpm); if (petmark == NULL) { g_warning("Bummer! Failed to load the pet_mark image!"); } else { + gdk_imlib_render(petmark, petmark->rgb_width, + petmark->rgb_height); + /* ghack_map.overlay is an array of canvas images used to * overlay tile images... ! */ for (i=0, y = 0; y < height; y+=ghack_glyph_height()) { for (x = 0; x < width; x+=ghack_glyph_width()) *** nethack-3.3.1/win/gnome/gnmap.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmap.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmap.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmap.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnmenu.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmenu.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmenu.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmenu.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnmenu.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmenu.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmenu.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmenu.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnmesg.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmesg.c Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmesg.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmesg.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnmesg.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnmesg.h Thu Mar 21 07:37:44 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnmesg.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnmesg.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnomeprv.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnomeprv.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnomeprv.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnomeprv.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnopts.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnopts.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnopts.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnopts.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnopts.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/gnome/gnopts.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnopts.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnopts.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnplayer.c Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnplayer.c Thu Mar 21 07:37:45 2002 *************** *** 1,11 **** ! /* SCCS Id: @(#)gnplayer.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ - #include "gnplayer.h" - #include "gnmain.h" #include #include #include "hack.h" static gint role_number; --- 1,11 ---- ! /* SCCS Id: @(#)gnplayer.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include #include + #include "gnplayer.h" + #include "gnmain.h" #include "hack.h" static gint role_number; *************** *** 13,27 **** static void player_sel_key_hit (GtkWidget *widget, GdkEventKey *event, gpointer data) ! { ! const char** roles = data; ! int i; ! for (i = 0; roles[i] != 0; ++i) { ! if (roles[i][0] == toupper(event->keyval)) { ! role_number = i; ! gtk_clist_select_row( GTK_CLIST (clist), i, 0); ! } ! } } static void --- 13,27 ---- static void player_sel_key_hit (GtkWidget *widget, GdkEventKey *event, gpointer data) ! { ! const char** roles = data; ! int i; ! for (i = 0; roles[i] != 0; ++i) { ! if (roles[i][0] == toupper(event->keyval)) { ! role_number = i; ! gtk_clist_select_row( GTK_CLIST (clist), i, 0); ! } ! } } static void *************** *** 31,53 **** } int ! ghack_player_sel_dialog( const char** roles) { int i; static GtkWidget* dialog; static GtkWidget* swin; static GtkWidget* frame1; ! dialog = gnome_dialog_new (_("Player selection"), GNOME_STOCK_BUTTON_OK, ! _("Random role"), GNOME_STOCK_BUTTON_CANCEL, NULL); gnome_dialog_close_hides (GNOME_DIALOG (dialog), FALSE); gtk_signal_connect (GTK_OBJECT (dialog), "key_press_event", ! GTK_SIGNAL_FUNC (player_sel_key_hit), roles ); ! frame1 = gtk_frame_new (_("Choose one of the following roles:")); gtk_object_set_data (GTK_OBJECT (dialog), "frame1", frame1); gtk_widget_show (frame1); gtk_container_border_width (GTK_CONTAINER (frame1), 3); --- 31,55 ---- } int ! ghack_player_sel_dialog(const char** choices, ! const gchar* title, ! const gchar* prompt) { int i; static GtkWidget* dialog; static GtkWidget* swin; static GtkWidget* frame1; ! dialog = gnome_dialog_new(title, GNOME_STOCK_BUTTON_OK, ! _("Random"), GNOME_STOCK_BUTTON_CANCEL, NULL); gnome_dialog_close_hides (GNOME_DIALOG (dialog), FALSE); gtk_signal_connect (GTK_OBJECT (dialog), "key_press_event", ! GTK_SIGNAL_FUNC (player_sel_key_hit), choices ); ! frame1 = gtk_frame_new(prompt); gtk_object_set_data (GTK_OBJECT (dialog), "frame1", frame1); gtk_widget_show (frame1); gtk_container_border_width (GTK_CONTAINER (frame1), 3); *************** *** 67,76 **** gtk_box_pack_start_defaults (GTK_BOX (GNOME_DIALOG (dialog)->vbox), frame1); /* Add the roles into the list here... */ ! for (i=0; roles[i]; i++) { gchar accelBuf[BUFSZ]; ! const char *text[3]={accelBuf, roles[i],NULL}; ! sprintf( accelBuf, "%c ", tolower(roles[i][0])); gtk_clist_insert (GTK_CLIST (clist), i, (char**)text); } --- 69,78 ---- gtk_box_pack_start_defaults (GTK_BOX (GNOME_DIALOG (dialog)->vbox), frame1); /* Add the roles into the list here... */ ! for (i=0; choices[i]; i++) { gchar accelBuf[BUFSZ]; ! const char *text[3]={accelBuf, choices[i],NULL}; ! sprintf( accelBuf, "%c ", tolower(choices[i][0])); gtk_clist_insert (GTK_CLIST (clist), i, (char**)text); } *************** *** 89,99 **** /* Quit on button 2 or error */ if (i < 0 || i > 1) { ! return( -1); } /* Random is button 1*/ if (i == 1 ) { ! return( -2); } return ( role_number); } --- 91,101 ---- /* Quit on button 2 or error */ if (i < 0 || i > 1) { ! return(ROLE_NONE); } /* Random is button 1*/ if (i == 1 ) { ! return(ROLE_RANDOM); } return ( role_number); } *** nethack-3.3.1/win/gnome/gnplayer.h Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnplayer.h Thu Mar 21 07:37:45 2002 *************** *** 1,13 **** ! /* SCCS Id: @(#)gnplayer.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackPlayerSelDialog_h #define GnomeHackPlayerSelDialog_h ! ! int ghack_player_sel_dialog(const char **); ! #endif /* GnomeHackPlayerSelDialog_h */ - --- 1,10 ---- ! /* SCCS Id: @(#)gnplayer.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackPlayerSelDialog_h #define GnomeHackPlayerSelDialog_h ! int ghack_player_sel_dialog(const char **, const gchar*, const gchar*); #endif /* GnomeHackPlayerSelDialog_h */ *** nethack-3.3.1/win/gnome/gnsignal.c Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnsignal.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnsignal.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnsignal.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 248,440 **** void ghack_handle_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { ! int key=0; ! int ctl=GDK_CONTROL_MASK; ! int alt=GDK_MOD1_MASK; ! /* Turn this on to debug key events */ #if 0 ! g_message("I got a \"%s\" key (%d) %s%s", ! gdk_keyval_name (event->keyval), event->keyval, ! (event->state&ctl)? "+CONTROL":"", (event->state&alt)? "+ALT":""); #endif ! switch (event->keyval) { ! /* special keys to do stuff with */ ! /* Set up the direction keys */ ! /* First handle the arrow keys -- these always mean move */ ! case GDK_Right: ! case GDK_rightarrow: ! if (iflags.num_pad) key='6'; else key='l'; break; ! case GDK_Left: ! case GDK_leftarrow: ! if (iflags.num_pad) key='4'; else key='h'; break; ! case GDK_Up: ! case GDK_uparrow: ! if (iflags.num_pad) key='8'; else key='k'; break; ! case GDK_Down: ! case GDK_downarrow: ! if (iflags.num_pad) key='2'; else key='j'; break; ! case GDK_Home: ! if (iflags.num_pad) key='7'; else key='y'; break; ! case GDK_End: ! if (iflags.num_pad) key='1'; else key='b'; break; ! case GDK_Page_Down: ! if (iflags.num_pad) key='3'; else key='n'; break; ! case GDK_Page_Up: ! if (iflags.num_pad) key='9'; else key='u'; break; ! case ' ': key='.'; break; ! ! /* Now, handle the numberpad (move or numbers) */ ! case GDK_KP_Right: ! case GDK_KP_6: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_6; ! else ! key='6'; ! break; ! ! case GDK_KP_Left: ! case GDK_KP_4: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_4; ! else ! key='4'; ! break; ! ! case GDK_KP_Up: ! case GDK_KP_8: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_8; ! else ! key='8'; ! break; ! ! case GDK_KP_Down: ! case GDK_KP_2: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_2; ! else ! key='2'; ! break; ! ! /* Move Top-Left */ ! case GDK_KP_Home: ! case GDK_KP_7: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_7; ! else ! key='7'; ! break; ! ! case GDK_KP_Page_Up: ! case GDK_KP_9: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_9; ! else ! key='9'; ! break; ! ! case GDK_KP_End: ! case GDK_KP_1: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_1; ! else ! key='1'; ! break; ! ! case GDK_KP_Page_Down: ! case GDK_KP_3: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_3; ! else ! key='3'; ! break; ! case GDK_KP_5: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_5; ! else ! key='5'; ! break; ! ! case GDK_KP_Delete: ! case GDK_KP_Decimal: ! key='.'; ! break; ! ! /* We don't bother using the "#" key for extended commands. Instead, ! * we will just use the ALT key.*/ ! case GDK_numbersign: ! break; ! ! /* We will probably want to do something with these later... */ ! case GDK_KP_Begin: ! case GDK_KP_F1: ! case GDK_F1: ! case GDK_KP_F2: ! case GDK_F2: ! case GDK_KP_F3: ! case GDK_F3: ! case GDK_KP_F4: ! case GDK_F4: ! case GDK_F5: ! case GDK_F6: ! case GDK_F7: ! case GDK_F8: ! case GDK_F9: ! case GDK_F10: ! case GDK_F11: ! case GDK_F12: ! break; ! /* various keys to ignore */ ! case GDK_KP_Insert: ! case GDK_Insert: ! case GDK_Delete: ! case GDK_Print: ! case GDK_BackSpace: ! case GDK_Pause: ! case GDK_Scroll_Lock: ! case GDK_Shift_Lock: ! case GDK_Num_Lock: ! case GDK_Caps_Lock: ! case GDK_Control_L: ! case GDK_Control_R: ! case GDK_Shift_L: ! case GDK_Shift_R: ! case GDK_Alt_L: ! case GDK_Alt_R: ! case GDK_Meta_L: ! case GDK_Meta_R: ! case GDK_Mode_switch: ! case GDK_Multi_key: ! return; ! ! default: ! key = event->keyval; ! } ! if (event->state & alt) { key=M(event->keyval); ! } ! else if (event->state & ctl) { key=C(event->keyval); ! } ! /* Ok, here is where we do clever stuff to overide the default ! * game behavior */ ! if (g_askingQuestion==0) { ! ! if (key == 'S' || key == M('S') || key == C('S')) { ! ghack_save_game_cb( NULL, NULL); ! return; ! } ! } g_keyBuffer = g_list_prepend (g_keyBuffer, GINT_TO_POINTER( key)); g_numKeys++; } - - --- 248,441 ---- void ghack_handle_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { ! static int was_pound = 0; ! int key = 0; ! int ctl = GDK_CONTROL_MASK; ! int alt = GDK_MOD1_MASK; ! /* Turn this on to debug key events */ #if 0 ! g_message("I got a \"%s\" key (%d) %s%s", ! gdk_keyval_name (event->keyval), event->keyval, ! (event->state&ctl)? "+CONTROL":"", (event->state&alt)? "+ALT":""); #endif ! switch (event->keyval) { ! /* special keys to do stuff with */ ! /* Set up the direction keys */ ! /* First handle the arrow keys -- these always mean move */ ! case GDK_Right: ! case GDK_rightarrow: ! if (iflags.num_pad) key='6'; else key='l'; break; ! case GDK_Left: ! case GDK_leftarrow: ! if (iflags.num_pad) key='4'; else key='h'; break; ! case GDK_Up: ! case GDK_uparrow: ! if (iflags.num_pad) key='8'; else key='k'; break; ! case GDK_Down: ! case GDK_downarrow: ! if (iflags.num_pad) key='2'; else key='j'; break; ! case GDK_Home: ! if (iflags.num_pad) key='7'; else key='y'; break; ! case GDK_End: ! if (iflags.num_pad) key='1'; else key='b'; break; ! case GDK_Page_Down: ! if (iflags.num_pad) key='3'; else key='n'; break; ! case GDK_Page_Up: ! if (iflags.num_pad) key='9'; else key='u'; break; ! case ' ': key='.'; break; ! ! /* Now, handle the numberpad (move or numbers) */ ! case GDK_KP_Right: ! case GDK_KP_6: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_6; ! else ! key='6'; ! break; ! ! case GDK_KP_Left: ! case GDK_KP_4: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_4; ! else ! key='4'; ! break; ! ! case GDK_KP_Up: ! case GDK_KP_8: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_8; ! else ! key='8'; ! break; ! ! case GDK_KP_Down: ! case GDK_KP_2: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_2; ! else ! key='2'; ! break; ! ! /* Move Top-Left */ ! case GDK_KP_Home: ! case GDK_KP_7: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_7; ! else ! key='7'; ! break; ! ! case GDK_KP_Page_Up: ! case GDK_KP_9: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_9; ! else ! key='9'; ! break; ! ! case GDK_KP_End: ! case GDK_KP_1: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_1; ! else ! key='1'; ! break; ! ! case GDK_KP_Page_Down: ! case GDK_KP_3: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_3; ! else ! key='3'; ! break; ! case GDK_KP_5: ! if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK) && iflags.num_pad) ! key = GDK_KP_5; ! else ! key='5'; ! break; ! ! case GDK_KP_Delete: ! case GDK_KP_Decimal: ! key='.'; ! break; ! ! /* can't just ignore "#", it's a core feature */ ! case GDK_numbersign: ! was_pound = 1; ! return; ! ! /* We will probably want to do something with these later... */ ! case GDK_KP_Begin: ! case GDK_KP_F1: ! case GDK_F1: ! case GDK_KP_F2: ! case GDK_F2: ! case GDK_KP_F3: ! case GDK_F3: ! case GDK_KP_F4: ! case GDK_F4: ! case GDK_F5: ! case GDK_F6: ! case GDK_F7: ! case GDK_F8: ! case GDK_F9: ! case GDK_F10: ! case GDK_F11: ! case GDK_F12: ! break; ! /* various keys to ignore */ ! case GDK_KP_Insert: ! case GDK_Insert: ! case GDK_Delete: ! case GDK_Print: ! case GDK_BackSpace: ! case GDK_Pause: ! case GDK_Scroll_Lock: ! case GDK_Shift_Lock: ! case GDK_Num_Lock: ! case GDK_Caps_Lock: ! case GDK_Control_L: ! case GDK_Control_R: ! case GDK_Shift_L: ! case GDK_Shift_R: ! case GDK_Alt_L: ! case GDK_Alt_R: ! case GDK_Meta_L: ! case GDK_Meta_R: ! case GDK_Mode_switch: ! case GDK_Multi_key: ! return; ! default: ! key = event->keyval; ! } ! ! if ((event->state & alt) || was_pound) { key=M(event->keyval); ! } else if (event->state & ctl) { key=C(event->keyval); ! } ! if (was_pound) { ! was_pound = 0; ! } ! /* Ok, here is where we do clever stuff to overide the default ! * game behavior */ ! if (g_askingQuestion == 0) { ! ! if (key == 'S' || key == M('S') || key == C('S')) { ! ghack_save_game_cb( NULL, NULL); ! return; ! } ! } g_keyBuffer = g_list_prepend (g_keyBuffer, GINT_TO_POINTER( key)); g_numKeys++; } *** nethack-3.3.1/win/gnome/gnsignal.h Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnsignal.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnsignal.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnsignal.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnstatus.c Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnstatus.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnstatus.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnstatus.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 432,437 **** --- 432,440 ---- const char* hung; const char* enc; static int firstTime=TRUE; + #ifdef GOLDOBJ + long umoney; + #endif /* First, fill in the player name and the dungeon level */ strcpy(buf, plname); *************** *** 560,575 **** --- 563,592 ---- gtk_label_set( GTK_LABEL( chaLabel), buf); /* Now do the non-pixmaped stats (gold and such) */ + #ifndef GOLDOBJ sprintf(buf,"Au:%ld", u.ugold); if (lastAu < u.ugold && firstTime==FALSE) { + #else + umoney = money_cnt(invent); + sprintf(buf,"Au:%ld", umouney); + if (lastAu < umoney && firstTime==FALSE) { + #endif /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( goldLabel, normalStyle, greenStyle); } + #ifndef GOLDOBJ else if (lastAu > u.ugold && firstTime==FALSE) { + #else + else if (lastAu > umoney && firstTime==FALSE) { + #endif /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( goldLabel, normalStyle, redStyle); } + #ifndef GOLDOBJ lastAu = u.ugold; + #else + lastAu = umoney; + #endif gtk_label_set( GTK_LABEL( goldLabel), buf); if (u.mtimedone) { *** nethack-3.3.1/win/gnome/gnstatus.h Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnstatus.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnstatus.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnstatus.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gntext.c Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gntext.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gntext.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gntext.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 40,45 **** --- 40,46 ---- void ghack_text_window_destroy() { + TW_window = NULL; } void ghack_text_window_display(GtkWidget *widget, boolean block, *************** *** 50,55 **** --- 51,58 ---- gtk_window_set_title(GTK_WINDOW( TW_window), "Rest In Peace"); } + gtk_signal_connect (GTK_OBJECT (TW_window), "destroy", + (GtkSignalFunc) ghack_text_window_destroy, NULL); if (block) gnome_dialog_run(GNOME_DIALOG(TW_window)); else *** nethack-3.3.1/win/gnome/gntext.h Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gntext.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gntext.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gntext.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnyesno.c Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnyesno.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnyesno.c 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnyesno.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gnyesno.h Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gnyesno.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnyesno.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)gnyesno.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/gnome/gn_xpms.h Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/gnome/gn_xpms.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)gnxpms.h 3.3 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ /* These XPMs are the artwork of Warwick Allison --- 1,4 ---- ! /* SCCS Id: @(#)gnxpms.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ /* These XPMs are the artwork of Warwick Allison *** nethack-3.3.1/win/Qt/Install.Qt Thu Feb 14 07:59:37 2002 --- nethack-3.4.0/win/Qt/Install.Qt Thu Mar 21 07:37:45 2002 *************** *** 2,13 **** --------------------------------------------- This document describes the installation of NetHack with a Qt interface ! on X11. The Qt interface is an alternative to the Athena-widgets interface ! found in ../X11. You can download Qt for UNIX from http://www.troll.no. ! You need Qt 2.0 or later to use this code. ! There are no explicit UNIX dependencies in this code, but we only regularly ! test it under UNIX. If you have Qt for Windows, that should also work. To use this code: --- 2,13 ---- --------------------------------------------- This document describes the installation of NetHack with a Qt interface ! on UNIX/X11 or Mac OS X. This code should also work with Qt/Windows, but ! support for that is not currently official. ! You can download Qt for UNIX and Qt for Windows from http://www.trolltech.com. ! Qt for Mac OS X is currently only available commercially. You need Qt 2.0 or ! later to use this code. To use this code: *************** *** 36,43 **** 4. ../../Makefile (the top-level makefile) ! change the VARDATND setting to contain the files "x11tiles" ! and "rip.xpm". 5. Follow all the instructions in ../../sys/unix/Install.unx for the remainder of the installation process. --- 36,45 ---- 4. ../../Makefile (the top-level makefile) ! change the VARDATND setting to contain the files "x11tiles", ! "rip.xpm", and "nhsplash.xpm": ! ! VARDATND = x11tiles rip.xpm nhsplash.xpm 5. Follow all the instructions in ../../sys/unix/Install.unx for the remainder of the installation process. *************** *** 46,52 **** likely to give the best interface for this window port: OPTIONS=name:player,number_pad,menustyle:partial,!time,showexp ! OPTIONS=hilite_pet,toptenwin,msghistory:200 If you are using KDE, you may want to also try the KDE version. It just --- 48,54 ---- likely to give the best interface for this window port: OPTIONS=name:player,number_pad,menustyle:partial,!time,showexp ! OPTIONS=hilite_pet,toptenwin,msghistory:200,windowtype:Qt If you are using KDE, you may want to also try the KDE version. It just *** nethack-3.3.1/win/Qt/qt_clust.cpp Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/Qt/qt_clust.cpp Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)qt_clust.cpp 3.3 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #include "qt_clust.h" --- 1,4 ---- ! /* SCCS Id: @(#)qt_clust.cpp 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #include "qt_clust.h" *** nethack-3.3.1/win/Qt/qt_win.cpp Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/Qt/qt_win.cpp Thu Mar 21 07:37:45 2002 *************** *** 1,14 **** ! // SCCS Id: @(#)qt_win.cpp 3.3 1999/11/19 // Copyright (c) Warwick Allison, 1999. // NetHack may be freely redistributed. See license for details. ! #define VERSION_QT_MAJOR 2 ! #define VERSION_QT_MINOR 0 ! #define VERSION_QT_PATCH 0 ! ! // Qt Binding for NetHack 3.3 // ! // Copyright (C) 1996,1997 by Warwick W. Allison (warwick@troll.no) // // Contributors: // Michael Hohmuth --- 1,10 ---- ! // SCCS Id: @(#)qt_win.cpp 3.4 1999/11/19 // Copyright (c) Warwick Allison, 1999. // NetHack may be freely redistributed. See license for details. ! // Qt Binding for NetHack 3.4 // ! // Copyright (C) 1996-2001 by Warwick W. Allison (warwick@troll.no) // // Contributors: // Michael Hohmuth *************** *** 51,56 **** --- 47,54 ---- // enough, and we undefine NetHack macros which conflict with Qt // identifiers. + #define alloc hide_alloc // avoid treading on STL symbol + #define lock hide_lock // avoid treading on STL symbol #ifdef _MSC_VER #define NHSTDC #endif *************** *** 58,63 **** --- 56,62 ---- #include "func_tab.h" #include "dlb.h" #include "patchlevel.h" + #include "tile2x11.h" #undef Warning #undef red #undef green *************** *** 68,78 **** --- 67,81 ---- #undef FALSE #undef min #undef max + #undef alloc + #undef lock } #include "qt_win.h" + #include #include + #include #include #include #include *************** *** 80,88 **** --- 83,96 ---- #include #include #include + #include + #include #include #include + #include + #include #include + #include //#include //#include *************** *** 91,105 **** #include "qt_clust.h" #include "qt_xpms.h" ! #include #ifdef _WS_X11_ // For userid control #include #endif #ifdef USER_SOUNDS ! #include #endif --- 99,129 ---- #include "qt_clust.h" #include "qt_xpms.h" ! #include ! #ifdef Q_WS_MACX ! # include ! #else ! # include ! #endif #ifdef _WS_X11_ // For userid control #include #endif + // Some distributors released Qt 2.1.0beta4 + #if QT_VERSION < 220 + # define nh_WX11BypassWM 0x01000000 + #else + # define nh_WX11BypassWM WX11BypassWM + #endif + #ifdef USER_SOUNDS ! # if QT_VERSION < 220 ! # undef USER_SOUNDS ! # else ! # include ! # endif #endif *************** *** 110,127 **** // Warwick prefers it this way... #define QT_CHOOSE_RACE_FIRST static QString aboutMsg() { QString msg; msg.sprintf( ! "Qt NetHack is a version of NetHack built using\n" #ifdef KDE ! "KDE and the Qt GUI toolkit for the user interface.\n" #else ! "the Qt GUI toolkit for the user interface.\n" #endif ! "This is version %d.%d.%d.%d.%d.%d\n\n" "Homepage:\n http://trolls.troll.no/warwick/nethack/\n\n" #ifdef KDE "KDE:\n http://www.kde.org\n" --- 134,154 ---- // Warwick prefers it this way... #define QT_CHOOSE_RACE_FIRST + static const char nh_attribution[] = "
NetHack" + "
by the NetHack DevTeam
"; + static QString aboutMsg() { QString msg; msg.sprintf( ! "Qt NetHack is a version of NetHack built\n" #ifdef KDE ! "using KDE and the Qt GUI toolkit.\n" #else ! "using the Qt GUI toolkit.\n" #endif ! "This is version %d.%d.%d\n\n" "Homepage:\n http://trolls.troll.no/warwick/nethack/\n\n" #ifdef KDE "KDE:\n http://www.kde.org\n" *************** *** 129,138 **** "Qt:\n http://www.troll.no", VERSION_MAJOR, VERSION_MINOR, ! PATCHLEVEL, ! VERSION_QT_MAJOR, ! VERSION_QT_MINOR, ! VERSION_QT_PATCH); return msg; } --- 156,162 ---- "Qt:\n http://www.troll.no", VERSION_MAJOR, VERSION_MINOR, ! PATCHLEVEL); return msg; } *************** *** 140,145 **** --- 164,170 ---- centerOnMain( QWidget* w ) { QWidget* m = qApp->mainWidget(); + if (!m) m = qApp->desktop(); QPoint p = m->mapToGlobal(QPoint(0,0)); w->move( p.x() + m->width()/2 - w->width()/2, p.y() + m->height()/2 - w->height()/2 ); *************** *** 166,171 **** --- 191,197 ---- char *qt_tilewidth=NULL; char *qt_tileheight=NULL; char *qt_fontsize=NULL; + int qt_compact_mode = 0; extern const char *enc_stat[]; /* from botl.c */ extern const char *hu_stat[]; /* from eat.c */ extern const char *killed_by_prefix[]; *************** *** 177,184 **** #define TILEWBASE 16 #define TILEHBASE 16 ! #define TILEWMIN 4 ! #define TILEHMIN 4 /* XPM */ --- 203,210 ---- #define TILEWBASE 16 #define TILEHBASE 16 ! #define TILEWMIN 1 ! #define TILEHMIN 1 /* XPM */ *************** *** 230,235 **** --- 256,594 ---- " ", " ", " "}; + /* XPM */ + static const char * nh_icon_small[] = { + /* width height ncolors chars_per_pixel */ + "16 16 16 1", + /* colors */ + " c #587070", + ". c #D1D5C9", + "X c #8B8C84", + "o c #2A2A28", + "O c #9AABA9", + "+ c #6A8FB2", + "@ c #C4CAC4", + "# c #B6BEB6", + "$ c None", + "% c #54564E", + "& c #476C6C", + "* c #ADB2AB", + "= c #ABABA2", + "- c #5E8295", + "; c #8B988F", + ": c #E8EAE7", + /* pixels */ + "$$$$$$$$$$$$$$$$", + "$$$.$#::.#==*$$$", + "$.*:::::....#*=$", + "$@#:..@#*==#;XX;", + "$@O:+++- &&; X%X", + "$#%.+++- &&;% oX", + "$$o.++-- &&;%%X$", + "$$$:++-- &&;%%$$", + "$$$.O++- &&=o $$", + "$$$=:++- & XoX$$", + "$$*:@O-- ;%Xo$$", + "$*:O#$+--;oOOX $", + "$:+ =o::=oo=-;%X", + "$::.%o$*;X;##@%$", + "$$@# ;$$$$$=*;X$", + "$$$$$$$$$$$$$$$$" + }; + + /* XPM */ + static const char * map_xpm[] = { + "12 13 4 1", + ". c None", + " c #000000000000", + "X c #0000B6DAFFFF", + "o c #69A69248B6DA", + " .", + " XXXXX ooo ", + " XoooX o ", + " XoooX o o ", + " XoooX ooo ", + " XXoXX o ", + " oooooXXX ", + " oo o oooX ", + " o XooX ", + " oooo XooX ", + " o o XXXX ", + " ", + ". "}; + /* XPM */ + static const char * msg_xpm[] = { + "12 13 4 1", + ". c None", + " c #FFFFFFFFFFFF", + "X c #69A69248B6DA", + "o c #000000000000", + " .", + " XXX XXX X o", + " o", + " XXXXX XX o", + " o", + " XX XXXXX o", + " o", + " XXXXXX o", + " o", + " XX XXX XX o", + " o", + " o", + ".ooooooooooo"}; + /* XPM */ + static const char * stat_xpm[] = { + "12 13 5 1", + " c None", + ". c #FFFF00000000", + "X c #000000000000", + "o c #FFFFFFFF0000", + "O c #69A6FFFF0000", + " ", + " ", + "... ", + "...X ", + "...X ... ", + "oooX oooX", + "oooXooo oooX", + "OOOXOOOXOOOX", + "OOOXOOOXOOOX", + "OOOXOOOXOOOX", + "OOOXOOOXOOOX", + "OOOXOOOXOOOX", + " XXXXXXXXXXX"}; + /* XPM */ + static const char * info_xpm[] = { + "12 13 4 1", + " c None", + ". c #00000000FFFF", + "X c #FFFFFFFFFFFF", + "o c #000000000000", + " ... ", + " ....... ", + " ...XXX... ", + " .........o ", + "...XXXX.... ", + "....XXX....o", + "....XXX....o", + "....XXX....o", + " ...XXX...oo", + " ..XXXXX..o ", + " .......oo ", + " o...ooo ", + " ooo "}; + + + /* XPM */ + static const char * again_xpm[] = { + "12 13 2 1", + " c None", + ". c #000000000000", + " .. ", + " .. ", + " ..... ", + " ....... ", + "... .. .. ", + ".. .. .. ", + ".. ..", + ".. ..", + ".. ..", + " .. .. ", + " .......... ", + " ...... ", + " "}; + /* XPM */ + static const char * kick_xpm[] = { + "12 13 3 1", + " c None", + ". c #000000000000", + "X c #FFFF6DB60000", + " ", + " ", + " . . . ", + " ... . . ", + " ... . ", + " ... . ", + " ... ", + "XXX ... ", + "XXX. ... ", + "XXX. ... ", + "XXX. .. ", + " ... ", + " "}; + /* XPM */ + static const char * throw_xpm[] = { + "12 13 3 1", + " c None", + ". c #FFFF6DB60000", + "X c #000000000000", + " ", + " ", + " ", + " ", + ".... X ", + "....X X ", + "....X XXXXXX", + "....X X ", + " XXXX X ", + " ", + " ", + " ", + " "}; + /* XPM */ + static const char * fire_xpm[] = { + "12 13 5 1", + " c None", + ". c #B6DA45140000", + "X c #FFFFB6DA9658", + "o c #000000000000", + "O c #FFFF6DB60000", + " . ", + " X. ", + " X . ", + " X .o ", + " X . o ", + " X .o o ", + "OOOOOOOOoooo", + " X .o o ", + " X . o o ", + " X .o ", + " X. o ", + " . o ", + " o "}; + /* XPM */ + static const char * get_xpm[] = { + "12 13 3 1", + " c None", + ". c #000000000000", + "X c #FFFF6DB60000", + " ", + " . ", + " ... ", + " . . . ", + " . ", + " . ", + " ", + " XXXXX ", + " XXXXX. ", + " XXXXX. ", + " XXXXX. ", + " ..... ", + " "}; + /* XPM */ + static const char * drop_xpm[] = { + "12 13 3 1", + " c None", + ". c #FFFF6DB60000", + "X c #000000000000", + " ", + " ..... ", + " .....X ", + " .....X ", + " .....X ", + " XXXXX ", + " ", + " X ", + " X ", + " X X X ", + " XXX ", + " X ", + " "}; + /* XPM */ + static const char * eat_xpm[] = { + "12 13 4 1", + " c None", + ". c #000000000000", + "X c #FFFFB6DA9658", + "o c #FFFF6DB60000", + " .X. .. ", + " .X. .. ", + " .X. .. ", + " .X. .. ", + " ... .. ", + " .. .. ", + " .. .. ", + " oo oo ", + " oo oo ", + " oo oo ", + " oo oo ", + " oo oo ", + " oo oo "}; + /* XPM */ + static const char * rest_xpm[] = { + "12 13 2 1", + " c None", + ". c #000000000000", + " ..... ", + " . ", + " . ", + " . ....", + " ..... . ", + " . ", + " ....", + " ", + " .... ", + " . ", + " . ", + " .... ", + " "}; + /* XPM */ + static const char * cast_a_xpm[] = { + "12 13 3 1", + " c None", + ". c #FFFF6DB60000", + "X c #000000000000", + " . ", + " . ", + " .. ", + " .. ", + " .. . ", + " .. . ", + " ...... ", + " .. .. XX ", + " .. X X ", + " .. X X ", + " .. XXXX ", + " . X X ", + " . X X "}; + /* XPM */ + static const char * cast_b_xpm[] = { + "12 13 3 1", + " c None", + ". c #FFFF6DB60000", + "X c #000000000000", + " . ", + " . ", + " .. ", + " .. ", + " .. . ", + " .. . ", + " ...... ", + " .. .. XXX ", + " .. X X ", + " .. XXX ", + " .. X X ", + " . X X ", + " . XXX "}; + /* XPM */ + static const char * cast_c_xpm[] = { + "12 13 3 1", + " c None", + ". c #FFFF6DB60000", + "X c #000000000000", + " . ", + " . ", + " .. ", + " .. ", + " .. . ", + " .. . ", + " ...... ", + " .. .. XX ", + " .. X X ", + " .. X ", + " .. X ", + " . X X ", + " . XX "}; NetHackQtSettings::NetHackQtSettings(int w, int h) : tilewidth(TILEWMIN,32,1,this), *************** *** 241,247 **** #ifdef WS_WIN normalfixed("courier new"), #else ! normalfixed("fixed"), #endif large("times"), theglyphs(0) --- 600,606 ---- #ifdef WS_WIN normalfixed("courier new"), #else ! normalfixed("helvetica"), // ################# normally fixed, just testing #endif large("times"), theglyphs(0) *************** *** 249,255 **** { int default_fontsize; ! if (w<=700) { // ~640x480 default_fontsize=3; tilewidth.setValue(8); --- 608,619 ---- { int default_fontsize; ! if (w<=300) { ! // ~240x320 ! default_fontsize=4; ! tilewidth.setValue(8); ! tileheight.setValue(12); ! } else if (w<=700) { // ~640x480 default_fontsize=3; tilewidth.setValue(8); *************** *** 291,296 **** --- 655,661 ---- case 'l': default_fontsize = 1; break; case 'm': default_fontsize = 2; break; case 's': default_fontsize = 3; break; + case 't': default_fontsize = 4; break; } free(qt_fontsize); } *************** *** 305,310 **** --- 670,676 ---- fontsize.insertItem("Large"); fontsize.insertItem("Medium"); fontsize.insertItem("Small"); + fontsize.insertItem("Tiny"); fontsize.setCurrentItem(default_fontsize); connect(&fontsize,SIGNAL(activated(int)),this,SIGNAL(fontChanged())); *************** *** 341,369 **** const QFont& NetHackQtSettings::normalFont() { ! static int size[]={ 18, 14, 12, 10 }; normal.setPointSize(size[fontsize.currentItem()]); return normal; } const QFont& NetHackQtSettings::normalFixedFont() { ! static int size[]={ 18, 14, 13, 10 }; normalfixed.setPointSize(size[fontsize.currentItem()]); return normalfixed; } const QFont& NetHackQtSettings::largeFont() { ! static int size[]={ 24, 18, 14, 12 }; large.setPointSize(size[fontsize.currentItem()]); return large; } bool NetHackQtSettings::ynInMessages() { ! // XXX Two out of two users prefer True. ! return TRUE; } --- 707,734 ---- const QFont& NetHackQtSettings::normalFont() { ! static int size[]={ 18, 14, 12, 10, 8 }; normal.setPointSize(size[fontsize.currentItem()]); return normal; } const QFont& NetHackQtSettings::normalFixedFont() { ! static int size[]={ 18, 14, 13, 10, 8 }; normalfixed.setPointSize(size[fontsize.currentItem()]); return normalfixed; } const QFont& NetHackQtSettings::largeFont() { ! static int size[]={ 24, 18, 14, 12, 10 }; large.setPointSize(size[fontsize.currentItem()]); return large; } bool NetHackQtSettings::ynInMessages() { ! return !qt_compact_mode; } *************** *** 387,395 **** in=(in+1)%maxkey; } void NetHackQtKeyBuffer::Put(const char* str) { ! while (*str) Put(0,*str++,0); } int NetHackQtKeyBuffer::GetKey() --- 752,765 ---- in=(in+1)%maxkey; } + void NetHackQtKeyBuffer::Put(char a) + { + Put(0,a,0); + } + void NetHackQtKeyBuffer::Put(const char* str) { ! while (*str) Put(*str++); } int NetHackQtKeyBuffer::GetKey() *************** *** 559,568 **** int selectedItemNumber() const { int i=0; ! QListViewItem* c=firstChild(); ! while (c && c != selectedItem()) ! i++,c = c->nextSibling(); ! return i; } void setSelectedItemNumber(int i) --- 929,943 ---- int selectedItemNumber() const { int i=0; ! QListViewItem* c = firstChild(); ! while (c) { ! if (c == selectedItem()) { ! return i; ! } ! i++; ! c = c->nextSibling(); ! } ! return -1; } void setSelectedItemNumber(int i) *************** *** 576,582 **** NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks) : QDialog(0,"plsel",TRUE), ! keysource(ks) { /* 0 1 2 --- 951,958 ---- NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks) : QDialog(0,"plsel",TRUE), ! keysource(ks), ! fully_specified_role(TRUE) { /* 0 1 2 *************** *** 614,624 **** race = new NhPSListView(this); role->addColumn("Role"); race->addColumn("Race"); ! QButtonGroup* genderbox = new QButtonGroup(1,Horizontal,"Sex",this); ! QButtonGroup* alignbox = new QButtonGroup(1,Horizontal,"Alignment",this); ! ! QLabel* logo = new QLabel("Qt NetHack" ! "
by Warwick Allison
and the NetHack DevTeam", this); l->addMultiCellWidget( namebox, 0,0,0,2 ); #ifdef QT_CHOOSE_RACE_FIRST --- 990,1004 ---- race = new NhPSListView(this); role->addColumn("Role"); race->addColumn("Race"); ! QButtonGroup* genderbox = new QButtonGroup("Sex",this); ! QButtonGroup* alignbox = new QButtonGroup("Alignment",this); ! QVBoxLayout* vbgb = new QVBoxLayout(genderbox,3,1); ! vbgb->setAutoAdd(TRUE); ! vbgb->addSpacing(fontMetrics().height()*3/4); ! QVBoxLayout* vbab = new QVBoxLayout(alignbox,3,1); ! vbab->setAutoAdd(TRUE); ! vbab->addSpacing(fontMetrics().height()); ! QLabel* logo = new QLabel(nh_attribution, this); l->addMultiCellWidget( namebox, 0,0,0,2 ); #ifdef QT_CHOOSE_RACE_FIRST *************** *** 672,700 **** l->addWidget( cancel, 5, 2 ); connect( cancel, SIGNAL(clicked()), this, SLOT(reject()) ); ! // Randomize ! int ro = rn2(nrole); ! int ra = rn2(nrace); #ifdef QT_CHOOSE_RACE_FIRST ! while (!validrace(ro,ra)) ! ro = rn2(nrole); #else ! while (!validrace(ro,ra)) ! ra = rn2(nrace); #endif ! int g; ! do { g = rn2(ROLE_GENDERS); ! } while (!validgend(ro,ra,g)); gender[g]->setChecked(TRUE); selectGender(g); ! int a; ! do { a = rn2(ROLE_ALIGNS); ! } while (!validalign(ro,ra,a)); alignment[a]->setChecked(TRUE); selectAlignment(g); --- 1052,1111 ---- l->addWidget( cancel, 5, 2 ); connect( cancel, SIGNAL(clicked()), this, SLOT(reject()) ); ! // Randomize race and role, unless specified in config ! int ro = flags.initrole; ! if (ro == -1) { ! ro = rn2(nrole); ! fully_specified_role = FALSE; ! } ! int ra = flags.initrace; ! if (ra == -1) { ! ra = rn2(nrace); ! fully_specified_role = FALSE; ! } + // make sure we have a valid combination, honoring + // the users request if possible. + bool choose_race_first; #ifdef QT_CHOOSE_RACE_FIRST ! choose_race_first = TRUE; ! if (flags.initrole != -1 && flags.initrace == -1) { ! choose_race_first = FALSE; ! } #else ! choose_race_first = FALSE; ! if (flags.initrace != -1 && flags.initrole == -1) { ! choose_race_first = TRUE; ! } #endif + while (!validrace(ro,ra)) { + fully_specified_role = FALSE; + if (choose_race_first) { + ro = rn2(nrole); + } else { + ra = rn2(nrace); + } + } ! int g = flags.initgend; ! if (g == -1) { g = rn2(ROLE_GENDERS); ! fully_specified_role = FALSE; ! } ! while (!validgend(ro,ra,g)) { ! g = rn2(ROLE_GENDERS); ! } gender[g]->setChecked(TRUE); selectGender(g); ! int a = flags.initalign; ! if (a == -1) { ! a = rn2(ROLE_ALIGNS); ! fully_specified_role = FALSE; ! } ! while (!validalign(ro,ra,a)) { a = rn2(ROLE_ALIGNS); ! } alignment[a]->setChecked(TRUE); selectAlignment(g); *************** *** 717,722 **** --- 1128,1137 ---- void NetHackQtPlayerSelector::selectRole() { + int ra = race->selectedItemNumber(); + int ro = role->selectedItemNumber(); + if (ra == -1 || ro == -1) return; + #ifndef QT_CHOOSE_RACE_FIRST selectRace(); #else *************** *** 725,731 **** int j; NhPSListViewItem* item; item = (NhPSListViewItem*)role->firstChild(); - int ra = race->selectedItemNumber(); for (j=0; roles[j].name.m; j++) { bool v = validrace(j,ra); item->setSelectable(TRUE); --- 1140,1145 ---- *************** *** 750,765 **** void NetHackQtPlayerSelector::selectRace() { #ifdef QT_CHOOSE_RACE_FIRST selectRole(); - flags.initrace = race->selectedItemNumber(); #else QListViewItem* i=race->currentItem(); QListViewItem* valid=0; int j; NhPSListViewItem* item; item = (NhPSListViewItem*)race->firstChild(); - int ro = role->selectedItemNumber(); for (j=0; races[j].noun; j++) { bool v = validrace(ro,j); item->setSelectable(TRUE); --- 1164,1181 ---- void NetHackQtPlayerSelector::selectRace() { + int ra = race->selectedItemNumber(); + int ro = role->selectedItemNumber(); + if (ra == -1 || ro == -1) return; + #ifdef QT_CHOOSE_RACE_FIRST selectRole(); #else QListViewItem* i=race->currentItem(); QListViewItem* valid=0; int j; NhPSListViewItem* item; item = (NhPSListViewItem*)race->firstChild(); for (j=0; races[j].noun; j++) { bool v = validrace(ro,j); item->setSelectable(TRUE); *************** *** 851,861 **** bool NetHackQtPlayerSelector::Choose() { ! centerOnMain(this); if ( exec() ) { return TRUE; ! } else return FALSE; } --- 1267,1289 ---- bool NetHackQtPlayerSelector::Choose() { ! if (fully_specified_role) return TRUE; ! ! #if defined(QWS) // probably safe with Qt 3, too (where show!=exec in QDialog). ! if ( qt_compact_mode ) { ! showMaximized(); ! } else ! #endif ! { ! adjustSize(); ! centerOnMain(this); ! } ! if ( exec() ) { return TRUE; ! } else { return FALSE; + } } *************** *** 871,876 **** --- 1299,1305 ---- okay=new QPushButton("Okay",this); connect(okay,SIGNAL(clicked()),this,SLOT(accept())); connect(&input,SIGNAL(returnPressed()),this,SLOT(accept())); + okay->setDefault(TRUE); setFocusPolicy(StrongFocus); } *************** *** 994,1011 **** setBackgroundColor(black); viewport.setBackgroundColor(black); ! pet_annotation = QPixmap(pet_mark_xpm); cursor.setX(0); cursor.setY(0); Clear(); connect(qt_settings,SIGNAL(tilesChanged()),this,SLOT(updateTiles())); updateTiles(); //setFocusPolicy(StrongFocus); } void NetHackQtMapWindow::updateTiles() { NetHackQtGlyphs& glyphs = qt_settings->glyphs(); --- 1423,1467 ---- setBackgroundColor(black); viewport.setBackgroundColor(black); ! pet_annotation = QPixmap(qt_compact_mode ? pet_mark_small_xpm : pet_mark_xpm); cursor.setX(0); cursor.setY(0); Clear(); connect(qt_settings,SIGNAL(tilesChanged()),this,SLOT(updateTiles())); + connect(&viewport, SIGNAL(contentsMoving(int,int)), this, + SLOT(moveMessages(int,int))); updateTiles(); //setFocusPolicy(StrongFocus); } + void NetHackQtMapWindow::moveMessages(int x, int y) + { + QRect u = messages_rect; + messages_rect.moveTopLeft(QPoint(x,y)); + u |= messages_rect; + update(u); + } + + void NetHackQtMapWindow::clearMessages() + { + messages = ""; + update(messages_rect); + messages_rect = QRect(); + } + + void NetHackQtMapWindow::putMessage(int attr, const char* text) + { + if ( !messages.isEmpty() ) + messages += "\n"; + messages += text; + QFontMetrics fm = fontMetrics(); + messages_rect = fm.boundingRect(viewport.contentsX(),viewport.contentsY(),viewport.width(),0, WordBreak|AlignTop|AlignLeft|DontClip, messages); + update(messages_rect); + } + void NetHackQtMapWindow::updateTiles() { NetHackQtGlyphs& glyphs = qt_settings->glyphs(); *************** *** 1016,1025 **** --- 1472,1483 ---- viewport.verticalScrollBar()->setSteps(gh,gh); viewport.horizontalScrollBar()->setSteps(gw,gw); + /* viewport.setMaximumSize( gw*COLNO + viewport.verticalScrollBar()->width(), gh*ROWNO + viewport.horizontalScrollBar()->height() ); + */ viewport.updateScrollBars(); change.clear(); *************** *** 1152,1217 **** for (int i=garea.left(); i<=garea.right(); i++) { unsigned short g=Glyph(i,j); uchar ch; ! ! /* (from wintty, naturally) ! * ! * Map the glyph back to a character. ! * ! * Warning: For speed, this makes an assumption on the order of ! * offsets. The order is set in display.h. ! */ ! - #ifdef TEXTCOLOR - int color; - - #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) painter.setPen( green ); ! #endif ! ! if ((offset = (g - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ ! ch = warnsyms[offset]; ! 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)]; ! 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)]; ! zap_color((offset >> 2)); ! } else if ((offset = (g - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ ! ch = showsyms[offset]; ! cmap_color(offset); ! } else if ((offset = (g - GLYPH_OBJ_OFF)) >= 0) { /* object */ ! ch = oc_syms[(int)objects[offset].oc_class]; ! obj_color(offset); ! } else if ((offset = (g - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ ! ch = oc_syms[(int)objects[CORPSE].oc_class]; ! mon_color(offset); ! } else if ((offset = (g - GLYPH_PET_OFF)) >= 0) { /* a pet */ ! ch = monsyms[(int)mons[offset].mlet]; ! pet_color(offset); ! } else { /* a monster */ ! ch = monsyms[(int)mons[g].mlet]; ! mon_color(g); ! } ! // end of wintty code ! #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); #endif --- 1610,1622 ---- for (int i=garea.left(); i<=garea.right(); i++) { unsigned short g=Glyph(i,j); uchar ch; ! int color, och; ! unsigned special; painter.setPen( green ); ! /* map glyph to character and color */ ! mapglyph(g, &och, &color, &special, i, j); ! ch = (uchar)och; #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); #endif *************** *** 1232,1237 **** --- 1637,1644 ---- } } } + + painter.setFont(font()); } else #endif { *************** *** 1280,1285 **** --- 1687,1701 ---- qt_settings->glyphs().width(),qt_settings->glyphs().height()); } + if (area.intersects(messages_rect)) { + painter.setPen(black); + painter.drawText(viewport.contentsX()+1,viewport.contentsY()+1, + viewport.width(),0, WordBreak|AlignTop|AlignLeft|DontClip, messages); + painter.setPen(white); + painter.drawText(viewport.contentsX(),viewport.contentsY(), + viewport.width(),0, WordBreak|AlignTop|AlignLeft|DontClip, messages); + } + painter.end(); } *************** *** 1485,1490 **** --- 1901,1907 ---- list(new NetHackQtScrollText(::iflags.msg_history)) { ::iflags.window_inited = 1; + map = 0; connect(qt_settings,SIGNAL(fontChanged()),this,SLOT(updateFont())); updateFont(); } *************** *** 1497,1505 **** --- 1914,1930 ---- QWidget* NetHackQtMessageWindow::Widget() { return list; } + void NetHackQtMessageWindow::setMap(NetHackQtMapWindow* m) + { + map = m; + updateFont(); + } + void NetHackQtMessageWindow::updateFont() { list->setFont(qt_settings->normalFont()); + if ( map ) + map->setFont(qt_settings->normalFont()); } void NetHackQtMessageWindow::Scroll(int dx, int dy) *************** *** 1509,1514 **** --- 1934,1941 ---- void NetHackQtMessageWindow::Clear() { + if ( map ) + map->clearMessages(); if (list->uncleared) { list->uncleared=0; changed=TRUE; *************** *** 1536,1541 **** --- 1963,1971 ---- // Force scrollbar to bottom // XXX list->setTopItem(list->count()); + + if ( map ) + map->putMessage(attr, text); } *************** *** 1616,1622 **** } void NetHackQtLabelledIcon::show() { ! if (!isVisible()) highlight(hl_bad); QWidget::show(); } void NetHackQtLabelledIcon::highlightWhenChanging() --- 2046,2057 ---- } void NetHackQtLabelledIcon::show() { ! #if QT_VERSION >= 300 ! if (isHidden()) ! #else ! if (!isVisible()) ! #endif ! highlight(hl_bad); QWidget::show(); } void NetHackQtLabelledIcon::highlightWhenChanging() *************** *** 1965,1971 **** */ void NetHackQtStatusWindow::updateStats() { ! if (!isVisible()) return; char buf[BUFSZ]; --- 2400,2406 ---- */ void NetHackQtStatusWindow::updateStats() { ! if (!parentWidget()) return; char buf[BUFSZ]; *************** *** 2051,2057 **** dlevel.setLabel(buf,(long)depth(&u.uz)); } ! gold.setLabel("Au:",(long)u.ugold); if (u.mtimedone) { // You're a monster! --- 2486,2496 ---- dlevel.setLabel(buf,(long)depth(&u.uz)); } ! #ifndef GOLDOBJ ! gold.setLabel("Au:", u.ugold); ! #else ! gold.setLabel("Au:", money_cnt(invent)); ! #endif if (u.mtimedone) { // You're a monster! *************** *** 2357,2376 **** invert->setEnabled(how==PICK_ANY); search->setEnabled(how!=PICK_NONE); // 20 allows for scrollbar or spacing // 4 for frame borders int mh = QApplication::desktop()->height()*3/5; ! dialog->resize(totalWidth()+20, ! QMIN(totalHeight(), mh)+buth+4+(prompt.text().isNull() ? 0 : buth)); - dialog->SetResult(-1); - centerOnMain(dialog); - dialog->show(); setFocus(); while (dialog->result()<0) { - qApp->enter_loop(); // changed the defaults below to the values in wintype.h 000119 - azy ! if (dialog->result()<0 && !keysource.Empty()) { char k=keysource.GetAscii(); k=map_menu_cmd(k); /* added 000119 - azy */ if (k=='\033') --- 2796,2822 ---- invert->setEnabled(how==PICK_ANY); search->setEnabled(how!=PICK_NONE); + dialog->SetResult(-1); + // 20 allows for scrollbar or spacing // 4 for frame borders int mh = QApplication::desktop()->height()*3/5; ! if ( qt_compact_mode && totalHeight() > mh ) { ! // big, so make it fill ! dialog->showMaximized(); ! } else { ! dialog->resize(totalWidth()+20, ! QMIN(totalHeight(), mh)+buth+4+(prompt.text().isNull() ? 0 : buth)); ! if ( dialog->width() > QApplication::desktop()->width() ) ! dialog->resize(QApplication::desktop()->width(),dialog->height()+16); ! centerOnMain(dialog); ! dialog->show(); ! } setFocus(); while (dialog->result()<0) { // changed the defaults below to the values in wintype.h 000119 - azy ! if (!keysource.Empty()) { char k=keysource.GetAscii(); k=map_menu_cmd(k); /* added 000119 - azy */ if (k=='\033') *************** *** 2392,2397 **** --- 2838,2845 ---- } } } + if (dialog->result()<0) + qApp->enter_loop(); } dialog->hide(); int result=dialog->result(); *************** *** 2516,2522 **** AlignHCenter|AlignVCenter,text); } break; case 1: ! if (i.ch>=0) { char text[2]={i.ch,0}; painter->drawText(0,0,cellWidth(col),cellHeight(), AlignHCenter|AlignVCenter,text); --- 2964,2970 ---- AlignHCenter|AlignVCenter,text); } break; case 1: ! if ((signed char)i.ch >= 0) { char text[2]={i.ch,0}; painter->drawText(0,0,cellWidth(col),cellHeight(), AlignHCenter|AlignVCenter,text); *************** *** 2669,2674 **** --- 3117,3127 ---- riplines=n; } + QSize NetHackQtRIP::sizeHint() const + { + return pixmap->size(); + } + void NetHackQtRIP::paintEvent(QPaintEvent* event) { if ( riplines ) { *************** *** 2704,2711 **** ok.setDefault(TRUE); connect(&ok,SIGNAL(clicked()),this,SLOT(accept())); connect(&search,SIGNAL(clicked()),this,SLOT(Search())); - connect(qt_settings,SIGNAL(fontChanged()),this,SLOT(doUpdate())); } void NetHackQtTextWindow::doUpdate() --- 3157,3170 ---- ok.setDefault(TRUE); connect(&ok,SIGNAL(clicked()),this,SLOT(accept())); connect(&search,SIGNAL(clicked()),this,SLOT(Search())); connect(qt_settings,SIGNAL(fontChanged()),this,SLOT(doUpdate())); + + QVBoxLayout* vb = new QVBoxLayout(this); + vb->addWidget(&rip); + QHBoxLayout* hb = new QHBoxLayout(vb); + hb->addWidget(&ok); + hb->addWidget(&search); + vb->addWidget(lines); } void NetHackQtTextWindow::doUpdate() *************** *** 2756,2762 **** --- 3215,3225 ---- Sprintf(rip_line[NAME_LINE], "%s", plname); /* Put $ on stone */ + #ifndef GOLDOBJ Sprintf(rip_line[GOLD_LINE], "%ld Au", u.ugold); + #else + Sprintf(rip_line[GOLD_LINE], "%ld Au", done_money); + #endif /* Put together death description */ switch (killer_format) { *************** *** 2813,2833 **** { if (str_fixed) { lines->setFont(qt_settings->normalFixedFont()); } ! int h=ok.height()*2; if (use_rip) { h+=rip.height(); rip.show(); } else { rip.hide(); } int mh = QApplication::desktop()->height()*3/5; ! resize(QMAX(use_rip ? rip.width() : 200, ! lines->TotalWidth()+24), ! QMIN(mh, lines->TotalHeight()+h)); ! centerOnMain(this); ! show(); if (block) { setResult(-1); while (result()==-1) { --- 3276,3308 ---- { if (str_fixed) { lines->setFont(qt_settings->normalFixedFont()); + } else { + lines->setFont(qt_settings->normalFont()); } ! int h=0; if (use_rip) { h+=rip.height(); + ok.hide(); + search.hide(); rip.show(); } else { + h+=ok.height()*2; + ok.show(); + search.show(); rip.hide(); } int mh = QApplication::desktop()->height()*3/5; ! if ( qt_compact_mode && lines->TotalHeight() > mh || use_rip ) { ! // big, so make it fill ! showMaximized(); ! } else { ! resize(QMAX(use_rip ? rip.width() : 200, ! lines->TotalWidth()+24), ! QMIN(mh, lines->TotalHeight()+h)); ! centerOnMain(this); ! show(); ! } if (block) { setResult(-1); while (result()==-1) { *************** *** 2857,2879 **** qApp->exit_loop(); } - void NetHackQtTextWindow::resizeEvent(QResizeEvent*) - { - const int margin=8; - const int gutter=8; - const int butw = (width()-margin*2-gutter)/2; - const int buth=fontMetrics().height()*2; - int y=0; - if (use_rip) { - rip.setGeometry(0,0,width(),rip.height()); - y+=rip.height(); - } - y+=margin; - ok.setGeometry(margin, y, butw, buth); - search.setGeometry(margin+butw+gutter, y, butw, buth); - y+=buth+margin; - lines->setGeometry(0,y,width(),height()-y); - } void NetHackQtTextWindow::keyPressEvent(QKeyEvent* e) { if ( e->ascii() != '\r' && e->ascii() != '\n' && e->ascii() != '\033' ) --- 3332,3337 ---- *************** *** 2891,2898 **** int current=lines->currentItem(); for (int i=1; icount(); i++) { int lnum=(i+current)%lines->count(); ! const char* str=lines->text(lnum); ! if (strstr(str,line)) { lines->setCurrentItem(lnum); lines->centerCurrentItem(); return; --- 3349,3356 ---- int current=lines->currentItem(); for (int i=1; icount(); i++) { int lnum=(i+current)%lines->count(); ! QString str=lines->text(lnum); ! if (str.contains(line)) { lines->setCurrentItem(lnum); lines->centerCurrentItem(); return; *************** *** 2982,3113 **** painter.end(); } NetHackQtMainWindow::NetHackQtMainWindow(NetHackQtKeyBuffer& ks) : ! message(0), map(0), status(0), invusage(this), ! #ifdef KDE ! menubar(new KMenuBar(this)), ! #else ! menubar(new QMenuBar(this)), ! #endif keysink(ks) { ! setCaption("Qt NetHack"); ! setIcon(QPixmap(nh_icon)); ! ! setBackgroundColor(black); ! #ifndef KDE ! menubar->setSeparator(QMenuBar::InWindowsStyle); #endif QPopupMenu* game=new QPopupMenu; QPopupMenu* apparel=new QPopupMenu; ! QPopupMenu* action=new QPopupMenu; QPopupMenu* magic=new QPopupMenu; ! QPopupMenu* nonaction=new QPopupMenu; #ifdef KDE ! QPopupMenu *help = kapp->getHelpMenu( TRUE, "" ); help->insertSeparator(); #else ! QPopupMenu* help = new QPopupMenu; #endif struct Macro { QPopupMenu* menu; const char* name; const char* action; } item[] = { ! { game, 0, 0 }, ! { game, "Version\tv", "v" }, ! { game, "Compilation\tAlt-V", "\366" }, ! { game, "History\tShift-V", "V" }, ! { game, "Redraw\tCtrl-R", "\022" }, ! { game, "Options\tShift-O", "O" }, ! { game, "Explore mode\tShift-X", "X" }, ! { game, 0, 0 }, ! { game, "Save\tShift-S", "S" }, ! { game, "Quit\tAlt-Q", "\361" }, ! ! { apparel, "Apparel off\tShift-A", "A" }, ! { apparel, 0, 0 }, ! { apparel, "Wield weapon\tw", "w" }, ! { apparel, "Exchange weapons\tx", "x" }, ! { apparel, "Two weapon combat\t#two", "#tw" }, ! { apparel, 0, 0 }, ! { apparel, "Wear armour\tShift-W", "W" }, ! { apparel, "Take off armour\tShift-T", "T" }, ! { apparel, 0, 0 }, ! { apparel, "Put on non-armour\tShift-P", "P" }, ! { apparel, "Remove non-armour\tShift-R", "R" }, ! ! { action, "Again\tCtrl-A", "\001" }, ! { action, 0, 0 }, ! { action, "Get\t,", "," }, ! { action, "Loot\tAlt-L", "\354" }, ! { action, "Sit\tAlt-S", "\363" }, ! { action, "Force\tAlt-F", "\346" }, ! { action, "Kick\tCtrl-D", "\004" }, ! { action, "Jump\tAlt-J", "\352" }, ! { action, "Wipe face\tAlt-W", "\367" }, ! { action, "Throw\tt", "t" }, ! { action, "Load quiver\tQ", "Q" }, ! { action, "Fire from quiver\tf", "f" }, ! { action, "Fight\tF", "F" }, ! { action, "Open door\to", "o" }, ! { action, "Close door\tc", "c" }, ! { action, "Drop\td?", "d?" }, ! { action, "Drop many\tShift-D", "D" }, ! { action, "Eat\te?", "e?" }, ! { action, "Engrave\tShift-E", "E" }, ! { action, "Apply\ta?", "a?" }, ! { action, 0, 0 }, ! { action, "Ride\t#ri", "#ri" }, ! { action, "Up\t<", "<" }, ! { action, "Down\t>", ">" }, ! { action, "Rest\t.", "." }, ! { action, "Search\ts", "s" }, ! { action, 0, 0 }, ! { action, "Chat\tAlt-C", "\343" }, ! { action, "Pay\tp", "p" }, ! ! { magic, "Quaff potion\tq", "q?" }, ! { magic, "Read scroll/book\tr?", "r?" }, ! { magic, "Zap wand\tz?", "z?" }, ! { magic, "Zap spell\tShift-Z?", "Z?" }, ! { magic, "Dip\tAlt-D", "\344" }, ! { magic, "Rub\tAlt-R", "\362" }, ! { magic, "Invoke\tAlt-I", "\351" }, ! { magic, 0, 0 }, ! { magic, "Offer\tAlt-O", "\357" }, ! { magic, "Pray\tAlt-P", "\360" }, ! { magic, 0, 0 }, ! { magic, "Teleport\tCtrl-T", "\024" }, ! { magic, "Monster action\tAlt-M", "\355" }, ! { magic, "Turn undead\tAlt-T", "\364" }, ! { nonaction, "Inventory\ti", "i" }, #ifdef SLASHEM ! { nonaction, "Angbandish inventory\t*", "*" }, #endif ! { nonaction, "Conduct\t#co", "#co" }, ! { nonaction, "Discoveries\t\\", "\\" }, ! { nonaction, "List/reorder spells\t+", "+" }, ! { nonaction, "Adjust letters\tAlt-A", "\341" }, ! { nonaction, 0, 0 }, ! { nonaction, "Name objects\tAlt-N", "\356" }, ! { nonaction, "Name creature\tShift-C", "C" }, ! { nonaction, 0, 0 }, ! { nonaction, "Qualifications\tAlt-E", "\345" }, ! ! { help, "Help\t?", "?" }, ! { help, 0, 0 }, ! { help, "What is here\t:", ":" }, ! { help, "What is that\t;", ";" }, ! { help, "What is...\t/", "/y" }, ! { 0, 0, 0 } }; int i; --- 3440,3601 ---- painter.end(); } + class SmallToolButton : public QToolButton { + public: + SmallToolButton(const QPixmap & pm, const QString &textLabel, + const QString& grouptext, + QObject * receiver, const char* slot, + QToolBar * parent) : + QToolButton(pm, textLabel, + #if QT_VERSION < 210 + QString::null, + #else + grouptext, + #endif + receiver, slot, parent) + { + } + + QSize sizeHint() const + { + // get just a couple more pixels for the map + return QToolButton::sizeHint()-QSize(0,2); + } + }; NetHackQtMainWindow::NetHackQtMainWindow(NetHackQtKeyBuffer& ks) : ! message(0), map(0), status(0), invusage(0), keysink(ks) { ! QToolBar* toolbar = new QToolBar(this); ! #if QT_VERSION >= 210 ! setToolBarsMovable(FALSE); ! toolbar->setHorizontalStretchable(TRUE); ! toolbar->setVerticalStretchable(TRUE); #endif + addToolBar(toolbar); + menubar = menuBar(); + + setCaption("Qt NetHack"); + if ( qt_compact_mode ) + setIcon(QPixmap(nh_icon_small)); + else + setIcon(QPixmap(nh_icon)); QPopupMenu* game=new QPopupMenu; QPopupMenu* apparel=new QPopupMenu; ! QPopupMenu* act1=new QPopupMenu; ! QPopupMenu* act2 = qt_compact_mode ? new QPopupMenu : act1; QPopupMenu* magic=new QPopupMenu; ! QPopupMenu* info=new QPopupMenu; ! ! QPopupMenu *help; #ifdef KDE ! help = kapp->getHelpMenu( TRUE, "" ); help->insertSeparator(); #else ! help = qt_compact_mode ? info : new QPopupMenu; #endif + enum { OnDesktop=1, OnHandhelds=2 }; struct Macro { QPopupMenu* menu; const char* name; const char* action; + int flags; } item[] = { ! { game, 0, 0, 3}, ! { game, "Version\tv", "v", 3}, ! { game, "Compilation\tAlt+V", "\366", 3}, ! { game, "History\tShift+V", "V", 3}, ! { game, "Redraw\tCtrl+R", "\022", 0}, // useless ! { game, "Options\tShift+O", "O", 3}, ! { game, "Explore mode\tShift+X", "X", 3}, ! { game, 0, 0, 3}, ! { game, "Save\tShift+S", "Sy", 3}, ! { game, "Quit\tAlt+Q", "\361", 3}, ! ! { apparel, "Apparel off\tShift+A", "A", 2}, ! { apparel, "Remove many\tShift+A", "A", 1}, ! { apparel, 0, 0, 3}, ! { apparel, "Wield weapon\tw", "w", 3}, ! { apparel, "Exchange weapons\tx", "x", 3}, ! { apparel, "Two weapon combat\t#two", "#tw", 3}, ! { apparel, "Load quiver\tQ", "Q", 3}, ! { apparel, 0, 0, 3}, ! { apparel, "Wear armour\tShift+W", "W", 3}, ! { apparel, "Take off armour\tShift+T", "T", 3}, ! { apparel, 0, 0, 3}, ! { apparel, "Put on non-armour\tShift+P", "P", 3}, ! { apparel, "Remove non-armour\tShift+R", "R", 3}, ! ! { act1, "Again\tCtrl+A", "\001", 2}, ! { act1, 0, 0, 3}, ! { act1, "Apply\ta?", "a?", 3}, ! { act1, "Chat\tAlt+C", "\343", 3}, ! { act1, "Close door\tc", "c", 3}, ! { act1, "Down\t>", ">", 3}, ! { act1, "Drop many\tShift+D", "D", 2}, ! { act1, "Drop\td?", "d?", 2}, ! { act1, "Eat\te?", "e?", 2}, ! { act1, "Engrave\tShift+E", "E", 3}, ! { act1, "Fight\tF", "F", 3}, ! { act1, "Fire from quiver\tf", "f", 2}, ! { act1, "Force\tAlt+F", "\346", 3}, ! { act1, "Get\t,", ",", 2}, ! { act1, "Jump\tAlt+J", "\352", 3}, ! { act2, "Kick\tCtrl+D", "\004", 2}, ! { act2, "Loot\tAlt+L", "\354", 3}, ! { act2, "Open door\to", "o", 3}, ! { act2, "Pay\tp", "p", 3}, ! { act2, "Rest\t.", ".", 2}, ! { act2, "Ride\t#ri", "#ri", 3}, ! { act2, "Search\ts", "s", 3}, ! { act2, "Sit\tAlt+S", "\363", 3}, ! { act2, "Throw\tt", "t", 2}, ! { act2, "Up\t<", "<", 3}, ! { act2, "Wipe face\tAlt+W", "\367", 3}, ! ! { magic, "Quaff potion\tq", "q?", 3}, ! { magic, "Read scroll/book\tr?", "r?", 3}, ! { magic, "Zap wand\tz?", "z?", 3}, ! { magic, "Zap spell\tShift+Z", "Z", 3}, ! { magic, "Dip\tAlt+D", "\344", 3}, ! { magic, "Rub\tAlt+R", "\362", 3}, ! { magic, "Invoke\tAlt+I", "\351", 3}, ! { magic, 0, 0, 3}, ! { magic, "Offer\tAlt+O", "\357", 3}, ! { magic, "Pray\tAlt+P", "\360", 3}, ! { magic, 0, 0, 3}, ! { magic, "Teleport\tCtrl+T", "\024", 3}, ! { magic, "Monster action\tAlt+M", "\355", 3}, ! { magic, "Turn undead\tAlt+T", "\364", 3}, ! ! { help, "Help\t?", "?", 3}, ! { help, 0, 0, 3}, ! { help, "What is here\t:", ":", 3}, ! { help, "What is there\t;", ";", 3}, ! { help, "What is...\t/", "/y", 2}, ! { help, 0, 0, 1}, ! { info, "Inventory\ti", "i", 3}, #ifdef SLASHEM ! { info, "Angbandish inventory\t*", "*", 3}, #endif ! { info, "Conduct\t#co", "#co", 3}, ! { info, "Discoveries\t\\", "\\", 3}, ! { info, "List/reorder spells\t+", "+", 3}, ! { info, "Adjust letters\tAlt+A", "\341", 2}, ! { info, 0, 0, 3}, ! { info, "Name object\tAlt+N", "\356y?", 3}, ! { info, "Name object type\tAlt+N", "\356n?", 3}, ! { info, "Name creature\tShift+C", "C", 3}, ! { info, 0, 0, 3}, ! { info, "Qualifications\tAlt+E", "\345", 3}, ! { 0, 0, 0, 0 } }; int i; *************** *** 3119,3142 **** game->insertItem("Qt settings...",1000); help->insertItem("About Qt NetHack...",2000); count=0; for (i=0; item[i].menu; i++) { ! if (item[i].name) { ! item[i].menu->insertItem(item[i].name,count); ! macro[count++]=item[i].action; ! } else { ! item[i].menu->insertSeparator(); } } menubar->insertItem("Game",game); ! menubar->insertItem("Apparel",apparel); ! menubar->insertItem("Action",action); ! menubar->insertItem("Magic",magic); ! menubar->insertItem("Non-action",nonaction); ! menubar->insertSeparator(); ! menubar->insertItem("Help",help); connect(menubar,SIGNAL(activated(int)),this,SLOT(doMenuItem(int))); --- 3607,3679 ---- game->insertItem("Qt settings...",1000); help->insertItem("About Qt NetHack...",2000); + //help->insertItem("NetHack Guidebook...",3000); + help->insertSeparator(); count=0; for (i=0; item[i].menu; i++) { ! if ( item[i].flags & (qt_compact_mode ? 1 : 2) ) { ! if (item[i].name) { ! QString name = item[i].name; ! if ( qt_compact_mode ) // accelerators aren't ! name.replace(QRegExp("\t.*"),""); ! item[i].menu->insertItem(name,count); ! macro[count++]=item[i].action; ! } else { ! item[i].menu->insertSeparator(); ! } } } menubar->insertItem("Game",game); ! menubar->insertItem("Gear",apparel); ! ! if ( qt_compact_mode ) { ! menubar->insertItem("A-J",act1); ! menubar->insertItem("K-Z",act2); ! menubar->insertItem("Magic",magic); ! menubar->insertItem(QPixmap(info_xpm),info); ! menubar->insertItem(QPixmap(map_xpm), this, SLOT(raiseMap())); ! menubar->insertItem(QPixmap(msg_xpm), this, SLOT(raiseMessages())); ! menubar->insertItem(QPixmap(stat_xpm), this, SLOT(raiseStatus())); ! } else { ! menubar->insertItem("Action",act1); ! menubar->insertItem("Magic",magic); ! menubar->insertItem("Info",info); ! menubar->insertSeparator(); ! menubar->insertItem("Help",help); ! } ! ! QSignalMapper* sm = new QSignalMapper(this); ! connect(sm, SIGNAL(mapped(const QString&)), this, SLOT(doKeys(const QString&))); ! QToolButton* tb; ! tb = new SmallToolButton( QPixmap(again_xpm),"Again","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "\001" ); ! tb = new SmallToolButton( QPixmap(get_xpm),"Get","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "," ); ! tb = new SmallToolButton( QPixmap(kick_xpm),"Kick","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "\004" ); ! tb = new SmallToolButton( QPixmap(throw_xpm),"Throw","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "t" ); ! tb = new SmallToolButton( QPixmap(fire_xpm),"Fire","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "f" ); ! tb = new SmallToolButton( QPixmap(drop_xpm),"Drop","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "D" ); ! tb = new SmallToolButton( QPixmap(eat_xpm),"Eat","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "e" ); ! tb = new SmallToolButton( QPixmap(rest_xpm),"Rest","Action", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "." ); ! tb = new SmallToolButton( QPixmap(cast_a_xpm),"Cast A","Magic", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "Za" ); ! tb = new SmallToolButton( QPixmap(cast_b_xpm),"Cast B","Magic", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "Zb" ); ! tb = new SmallToolButton( QPixmap(cast_c_xpm),"Cast C","Magic", sm, SLOT(map()), toolbar ); ! sm->setMapping(tb, "Zc" ); ! if ( !qt_compact_mode ) { ! QWidget* filler = new QWidget(toolbar); ! filler->setBackgroundMode(PaletteButton); ! toolbar->setStretchableWidget(filler); ! } connect(menubar,SIGNAL(activated(int)),this,SLOT(doMenuItem(int))); *************** *** 3172,3178 **** --- 3709,3768 ---- } setGeometry(x,y,w,h); + + if ( qt_compact_mode ) { + stack = new QWidgetStack(this); + setCentralWidget(stack); + } else { + setCentralWidget(new QWidget(this)); + invusage = new NetHackQtInvUsageWindow(centralWidget()); + } } + + void NetHackQtMainWindow::raiseMap() + { + stack->raiseWidget(0); + } + + void NetHackQtMainWindow::raiseMessages() + { + stack->raiseWidget(1); + } + + void NetHackQtMainWindow::raiseStatus() + { + stack->raiseWidget(2); + } + + class NetHackMimeSourceFactory : public QMimeSourceFactory { + public: + const QMimeSource* data(const QString& abs_name) const + { + const QMimeSource* r = 0; + if ( (NetHackMimeSourceFactory*)this == QMimeSourceFactory::defaultFactory() ) + r = QMimeSourceFactory::data(abs_name); + else + r = QMimeSourceFactory::defaultFactory()->data(abs_name); + if ( !r ) { + int sl = abs_name.length(); + do { + sl = abs_name.findRev('/',sl-1); + QString name = sl>=0 ? abs_name.mid(sl+1) : abs_name; + int dot = name.findRev('.'); + if ( dot >= 0 ) + name = name.left(dot); + if ( name == "map" ) + r = new QImageDrag(QImage(map_xpm)); + else if ( name == "msg" ) + r = new QImageDrag(QImage(msg_xpm)); + else if ( name == "stat" ) + r = new QImageDrag(QImage(stat_xpm)); + } while (!r && sl>0); + } + return r; + } + }; + void NetHackQtMainWindow::doMenuItem(int id) { switch (id) { *************** *** 3180,3194 **** centerOnMain(qt_settings); qt_settings->show(); break; ! case 2000: { ! QMessageBox::about(this, "About Qt NetHack", aboutMsg()); ! } break; default: ! keysink.Put(macro[id]); ! qApp->exit_loop(); } } void NetHackQtMainWindow::AddMessageWindow(NetHackQtMessageWindow* window) { message=window; --- 3770,3802 ---- centerOnMain(qt_settings); qt_settings->show(); break; ! case 2000: ! QMessageBox::about(this, "About Qt NetHack", aboutMsg()); ! break; ! case 3000: { ! QDialog dlg(this,0,TRUE); ! (new QVBoxLayout(&dlg))->setAutoAdd(TRUE); ! QTextBrowser browser(&dlg); ! NetHackMimeSourceFactory ms; ! browser.setMimeSourceFactory(&ms); ! browser.setSource(QDir::currentDirPath()+"/Guidebook.html"); ! if ( qt_compact_mode ) ! dlg.showMaximized(); ! dlg.exec(); ! } ! break; default: ! if ( id >= 0 ) ! doKeys(macro[id]); } } + void NetHackQtMainWindow::doKeys(const QString& k) + { + keysink.Put(k); + qApp->exit_loop(); + } + void NetHackQtMainWindow::AddMessageWindow(NetHackQtMessageWindow* window) { message=window; *************** *** 3224,3230 **** void NetHackQtMainWindow::updateInventory() { ! invusage.repaint(FALSE); } void NetHackQtMainWindow::fadeHighlighting() --- 3832,3839 ---- void NetHackQtMainWindow::updateInventory() { ! if ( invusage ) ! invusage->repaint(FALSE); } void NetHackQtMainWindow::fadeHighlighting() *************** *** 3236,3256 **** void NetHackQtMainWindow::layout() { if (message && map && status) { QSize maxs=map->Widget()->maximumSize(); int maph=QMIN(height()*2/3,maxs.height()); ! int y=menubar->height(); ! int h=height()-y; int toph=h-maph; int iuw=3*qt_settings->glyphs().width(); ! int topw=(width()-iuw)/2; ! message->Widget()->setGeometry(0,y,topw,toph); ! invusage.setGeometry(topw,y,iuw,toph); ! status->Widget()->setGeometry(topw+iuw,y,topw,toph); ! map->Widget()->setGeometry(QMAX(0,(width()-maxs.width())/2), ! y+toph,width(),maph); } } --- 3845,3867 ---- void NetHackQtMainWindow::layout() { + if ( qt_compact_mode ) + return; if (message && map && status) { QSize maxs=map->Widget()->maximumSize(); int maph=QMIN(height()*2/3,maxs.height()); ! QWidget* c = centralWidget(); ! int h=c->height(); int toph=h-maph; int iuw=3*qt_settings->glyphs().width(); ! int topw=(c->width()-iuw)/2; ! message->Widget()->setGeometry(0,0,topw,toph); ! invusage->setGeometry(topw,0,iuw,toph); ! status->Widget()->setGeometry(topw+iuw,0,topw,toph); ! map->Widget()->setGeometry(QMAX(0,(c->width()-maxs.width())/2), ! toph,c->width(),maph); } } *************** *** 3266,3280 **** { // Global key controls switch (event->key()) { case Key_Up: ! if (map) map->Scroll(0,-1); break; case Key_Down: ! if (map) map->Scroll(0,+1); break; case Key_Left: ! if (map) map->Scroll(-1,0); break; case Key_Right: ! if (map) map->Scroll(+1,0); break; case Key_Prior: if (message) message->Scroll(0,-1); break; case Key_Next: --- 3877,3908 ---- { // Global key controls + // For desktop, arrow keys scroll map, since we don't want players + // to think that's the way to move. For handhelds, the normal way is to + // click-to-travel, so we allow the cursor keys for fine movements. + + const char* d = iflags.num_pad ? ndir : sdir; switch (event->key()) { case Key_Up: ! if (qt_compact_mode) ! keysink.Put(d[2]); ! else ! if (map) map->Scroll(0,-1); break; case Key_Down: ! if (qt_compact_mode) ! keysink.Put(d[6]); ! else ! if (map) map->Scroll(0,+1); break; case Key_Left: ! if (qt_compact_mode) ! keysink.Put(d[0]); ! else ! if (map) map->Scroll(-1,0); break; case Key_Right: ! if (qt_compact_mode) ! keysink.Put(d[4]); ! else ! if (map) map->Scroll(+1,0); break; case Key_Prior: if (message) message->Scroll(0,-1); break; case Key_Next: *************** *** 3289,3308 **** if ( program_state.something_worth_saving ) { switch ( QMessageBox::information( this, "NetHack", "This will end your NetHack session", ! "&Save", "&Quit", "&Cancel", 0, 2 ) ) { case 0: // See dosave() function if (dosave0()) { u.uhp = -1; terminate(EXIT_SUCCESS); } break; case 1: - u.uhp = -1; - terminate(EXIT_SUCCESS); - break; - case 2: break; // ignore the event } } else { --- 3917,3933 ---- if ( program_state.something_worth_saving ) { switch ( QMessageBox::information( this, "NetHack", "This will end your NetHack session", ! "&Save", "&Cancel", 0, 1 ) ) { case 0: // See dosave() function if (dosave0()) { u.uhp = -1; + NetHackQtBind::qt_exit_nhwindows(0); terminate(EXIT_SUCCESS); } break; case 1: break; // ignore the event } } else { *************** *** 3314,3325 **** { if (message && map && status) { QPoint pos(0,0); ! message->Widget()->recreate(this,0,pos); ! map->Widget()->recreate(this,0,pos); ! status->Widget()->recreate(this,0,pos); ! ! layout(); ! show(); } else if (isVisible()) { hide(); } --- 3939,3958 ---- { if (message && map && status) { QPoint pos(0,0); ! QWidget* p = qt_compact_mode ? stack : centralWidget(); ! message->Widget()->recreate(p,0,pos); ! map->Widget()->recreate(p,0,pos); ! status->Widget()->recreate(p,0,pos); ! if ( qt_compact_mode ) { ! message->setMap(map); ! stack->addWidget(map->Widget(), 0); ! stack->addWidget(message->Widget(), 1); ! stack->addWidget(status->Widget(), 2); ! raiseMap(); ! } else { ! layout(); ! } ! showMaximized(); } else if (isVisible()) { hide(); } *************** *** 3336,3347 **** char NetHackQtYnDialog::Exec() { ! if (choices) { ! QButtonGroup group(question, this); ! int nchoices=strlen(choices); ! bool allow_count=strchr(choices,'#')!=0; const int margin=8; const int gutter=8; --- 3969,4050 ---- char NetHackQtYnDialog::Exec() { ! QString ch(choices); ! int ch_per_line=6; ! QString qlabel; ! QString enable; ! if ( qt_compact_mode && !choices ) { ! // expand choices from prompt ! // ##### why isn't choices set properly??? ! const char* c=question; ! while ( *c && *c != '[' ) ! c++; ! qlabel = QString(question).left(c-question); ! if ( *c ) { ! c++; ! if ( *c == '-' ) ! ch.append(*c++); ! char from=0; ! while ( *c && *c != ']' && *c != ' ' ) { ! if ( *c == '-' ) { ! from = c[-1]; ! } else if ( from ) { ! for (char f=from+1; f<=*c; f++) ! ch.append(f); ! from = 0; ! } else { ! ch.append(*c); ! from = 0; ! } ! c++; ! } ! if ( *c == ' ' ) { ! while ( *c && *c != ']' ) { ! if ( *c == '*' || *c == '?' ) ! ch.append(*c); ! c++; ! } ! } ! } ! if ( strstr(question, "what direction") ) { ! // We replace this regardless, since sometimes you get choices. ! const char* d = iflags.num_pad ? ndir : sdir; ! enable=ch; ! ch=""; ! ch.append(d[1]); ! ch.append(d[2]); ! ch.append(d[3]); ! ch.append(d[0]); ! ch.append('.'); ! ch.append(d[4]); ! ch.append(d[7]); ! ch.append(d[6]); ! ch.append(d[5]); ! ch.append(d[8]); ! ch.append(d[9]); ! ch_per_line = 3; ! def = ' '; ! } else { ! // Hmm... they'll have to use a virtual keyboard ! } ! } else { ! qlabel = question; ! } ! if (!ch.isNull()) { ! QVBoxLayout vb(this); ! vb.setAutoAdd(TRUE); ! bool bigq = qlabel.length()>40; ! if ( bigq ) { ! QLabel* q = new QLabel(qlabel,this); ! q->setAlignment(AlignLeft|WordBreak); ! q->setMargin(4); ! } ! QButtonGroup group(ch_per_line, Horizontal, ! bigq ? QString::null : qlabel, this); ! int nchoices=ch.length(); ! bool allow_count=ch.contains('#'); const int margin=8; const int gutter=8; *************** *** 3351,3361 **** int butsize=fontMetrics().height()*2+5; QPushButton* button; ! for (int i=0; isetGeometry(x,y,butsize,butsize); // Square ! if (choices[i]==def) button->setDefault(TRUE); if (i%10==9) { // last in row x=margin; --- 4054,4067 ---- int butsize=fontMetrics().height()*2+5; QPushButton* button; ! for (int i=0; isetEnabled(FALSE); ! } ! button->setFixedSize(butsize,butsize); // Square ! if (ch[i]==def) button->setDefault(TRUE); if (i%10==9) { // last in row x=margin; *************** *** 3365,3411 **** } } ! group.resize(margin*2+(gutter+button->width())*10, ! extra+margin*2+(gutter+button->height())*(nchoices/10+1)); ! connect(&group,SIGNAL(clicked(int)),this,SLOT(done(int))); QLabel* lb=0; QLineEdit* le=0; if (allow_count) { ! lb=new QLabel("Count: ",this); ! le=new QLineEdit(this); ! lb->setGeometry(margin,group.height()+margin,group.width()*1/3,le->height()); ! le->setGeometry(lb->geometry().right()+margin,lb->geometry().top(), ! group.width()*2/3,le->height()); } centerOnMain(this); show(); char choice=0; while (!choice) { ! if (!result()) { ! if (!keysource.Empty()) { ! char k=keysource.GetAscii(); ! char ch_esc=0; ! for (int i=0; choices[i]; i++) { ! if (choices[i]==k) ! choice=k; ! if (choices[i]=='q') ch_esc='q'; ! else if (!ch_esc && choices[i]=='n') ch_esc='n'; ! } ! if (!choice) { ! if (k=='\033' && ch_esc) ! choice=ch_esc; ! else if (k==' ' || k=='\r' || k=='\n') ! choice=def; ! // else choice remains 0 ! } } ! } else { ! choice=choices[result()-1000]; } ! qApp->enter_loop(); } hide(); if (allow_count && !le->text().isEmpty()) { --- 4071,4120 ---- } } ! connect(&group,SIGNAL(clicked(int)),this,SLOT(doneItem(int))); QLabel* lb=0; QLineEdit* le=0; if (allow_count) { ! QHBox *hb = new QHBox(this); ! lb=new QLabel("Count: ",hb); ! le=new QLineEdit(hb); } + adjustSize(); centerOnMain(this); show(); char choice=0; + char ch_esc=0; + for (int i=0; i= 1000 ) { ! choice = ch[result() - 1000].latin1(); } ! if ( !choice ) ! qApp->enter_loop(); } hide(); if (allow_count && !le->text().isEmpty()) { *************** *** 3414,3429 **** } return choice; } else { ! QLabel label(question,this); QPushButton cancel("Dismiss",this); label.setFrameStyle(QFrame::Box|QFrame::Sunken); label.setAlignment(AlignCenter); ! label.resize(fontMetrics().width(question)+60,30+fontMetrics().height()); cancel.move(width()/2-cancel.width()/2,label.geometry().bottom()+8); connect(&cancel,SIGNAL(clicked()),this,SLOT(reject())); centerOnMain(this); show(); ! while (!result() && keysource.Empty()) { qApp->enter_loop(); } hide(); --- 4123,4139 ---- } return choice; } else { ! QLabel label(qlabel,this); QPushButton cancel("Dismiss",this); label.setFrameStyle(QFrame::Box|QFrame::Sunken); label.setAlignment(AlignCenter); ! label.resize(fontMetrics().width(qlabel)+60,30+fontMetrics().height()); cancel.move(width()/2-cancel.width()/2,label.geometry().bottom()+8); connect(&cancel,SIGNAL(clicked()),this,SLOT(reject())); centerOnMain(this); + setResult(-1); show(); ! while (result()<0 && keysource.Empty()) { qApp->enter_loop(); } hide(); *************** *** 3440,3448 **** event->ignore(); } void NetHackQtYnDialog::done(int i) { ! setResult(i+1000); qApp->exit_loop(); } --- 4150,4163 ---- event->ignore(); } + void NetHackQtYnDialog::doneItem(int i) + { + done(i+1000); + } + void NetHackQtYnDialog::done(int i) { ! setResult(i); qApp->exit_loop(); } *************** *** 3464,3473 **** tiles_per_row = 40; } } else { ! tiles_per_row = 1; ! if (img.height()%total_tiles_used) { ! impossible("Tile file \"%s\" has %d lines, not multiple of glyph count (%d)", ! tile_file, img.height(), total_tiles_used); } } int rows = ((total_tiles_used+tiles_per_row-1) / tiles_per_row); --- 4179,4188 ---- tiles_per_row = 40; } } else { ! tiles_per_row = TILES_PER_ROW; ! if (img.width()%tiles_per_row) { ! impossible("Tile file \"%s\" has %d columns, not multiple of row count (%d)", ! tile_file, img.width(), tiles_per_row); } } int rows = ((total_tiles_used+tiles_per_row-1) / tiles_per_row); *************** *** 3604,3615 **** --- 4319,4371 ---- NetHackQtBind::NetHackQtBind(int& argc, char** argv) : #ifdef KDE KApplication(argc,argv) + #elif defined(QWS) // not quite the right condition + QPEApplication(argc,argv) #else QApplication(argc,argv) #endif { + QPixmap pm("nhsplash.xpm"); + if ( !pm.isNull() ) { + QVBox *vb = new QVBox(0,0, + WStyle_Customize | WStyle_NoBorder | nh_WX11BypassWM | WStyle_StaysOnTop ); + splash = vb; + QLabel *lsplash = new QLabel(vb); + lsplash->setAlignment(AlignCenter); + lsplash->setPixmap(pm); + QLabel* capt = new QLabel("Loading...",vb); + capt->setAlignment(AlignCenter); + if ( pm.mask() ) { + lsplash->setFixedSize(pm.size()); + lsplash->setMask(*pm.mask()); + } + splash->move((QApplication::desktop()->width()-pm.width())/2, + (QApplication::desktop()->height()-pm.height())/2); + //splash->setGeometry(0,0,100,100); + if ( qt_compact_mode ) { + splash->showMaximized(); + } else { + vb->setFrameStyle(QFrame::WinPanel|QFrame::Raised); + vb->setMargin(10); + splash->adjustSize(); + splash->show(); + } + + // force content refresh outside event loop + splash->repaint(FALSE); + lsplash->repaint(FALSE); + capt->repaint(FALSE); + qApp->flushX(); + + } else { + splash = 0; + } main = new NetHackQtMainWindow(keybuffer); + #if defined(QWS) // not quite the right condition + showMainWidget(main); + #else setMainWidget(main); + #endif qt_settings=new NetHackQtSettings(main->width(),main->height()); } *************** *** 3656,3684 **** qt_askname(); } void NetHackQtBind::qt_askname() { have_asked = TRUE; // We do it all here, and nothing in askname ! NetHackQtPlayerSelector selector(keybuffer); ! ! if (selector.Choose()) { ! // ... ! } else { ! clearlocks(); ! qt_exit_nhwindows(0); ! terminate(0); } } void NetHackQtBind::qt_get_nh_event() { } void NetHackQtBind::qt_exit_nhwindows(const char *) { } void NetHackQtBind::qt_suspend_nhwindows(const char *) --- 4412,4557 ---- qt_askname(); } + NetHackQtSavedGameSelector::NetHackQtSavedGameSelector(const char** saved) : + QDialog(0,"sgsel",TRUE) + { + QVBoxLayout *vbl = new QVBoxLayout(this,6); + QHBox* hb; + + QLabel* logo = new QLabel(this); vbl->addWidget(logo); + logo->setAlignment(AlignCenter); + logo->setPixmap(QPixmap("nhsplash.xpm")); + QLabel* attr = new QLabel("by the NetHack DevTeam",this); + attr->setAlignment(AlignCenter); + vbl->addWidget(attr); + vbl->addStretch(2); + /* + QLabel* logo = new QLabel(hb); + hb = new QHBox(this); + vbl->addWidget(hb, AlignCenter); + logo->setPixmap(QPixmap(nh_icon)); + logo->setAlignment(AlignRight|AlignVCenter); + new QLabel(nh_attribution,hb); + */ + + hb = new QHBox(this); + vbl->addWidget(hb, AlignCenter); + QPushButton* q = new QPushButton("Quit",hb); + connect(q, SIGNAL(clicked()), this, SLOT(reject())); + QPushButton* c = new QPushButton("New Game",hb); + connect(c, SIGNAL(clicked()), this, SLOT(accept())); + c->setDefault(TRUE); + + QButtonGroup* bg = new QButtonGroup(3, Horizontal, "Saved Characters",this); + vbl->addWidget(bg); + connect(bg, SIGNAL(clicked(int)), this, SLOT(done(int))); + for (int i=0; saved[i]; i++) { + QPushButton* b = new QPushButton(saved[i],bg); + bg->insert(b, i+2); + } + } + + int NetHackQtSavedGameSelector::choose() + { + #if defined(QWS) // probably safe with Qt 3, too (where show!=exec in QDialog). + if ( qt_compact_mode ) + showMaximized(); + #endif + return exec()-2; + } + + static char** get_saved_names() + { + int myuid=getuid(); + struct dirent **namelist; + int n = scandir("save", &namelist, 0, alphasort);; + if ( n > 0 ) { + int i,j=0; + char** result = (char**)malloc((n+1)*sizeof(char*)); /* at most */ + for (i=0; id_name, "%d%s", &uid, name ) == 2 ) { + if ( uid == myuid ) { + char* end = strstr(name,".gz"); + if ( !end ) end = strstr(name,".Z"); + if ( end ) *end = 0; + result[j++] = strdup(name); + } + } + } + result[j++] = 0; + return result; + } else { + return 0; + } + } + + static void free_saved_names(char** saved) + { + if ( saved ) { + int i=0; + while (saved[i]) free(saved[i++]); + free(saved); + } + } + void NetHackQtBind::qt_askname() { have_asked = TRUE; // We do it all here, and nothing in askname ! char** saved = get_saved_names(); ! int ch = -1; ! if ( saved && *saved ) { ! if ( splash ) splash->hide(); ! NetHackQtSavedGameSelector sgsel((const char**)saved); ! ch = sgsel.choose(); ! if ( ch >= 0 ) ! strcpy(plname,saved[ch]); ! } ! free_saved_names(saved); ! ! switch (ch) { ! case -1: ! if ( splash ) splash->hide(); ! if (NetHackQtPlayerSelector(keybuffer).Choose()) ! return; ! case -2: ! break; ! default: ! return; } + + // Quit + clearlocks(); + qt_exit_nhwindows(0); + terminate(0); } void NetHackQtBind::qt_get_nh_event() { } + #if defined(QWS) + // Kludge to access lastWindowClosed() signal. + class TApp : public QApplication { + public: + TApp(int& c, char**v) : QApplication(c,v) {} + void lwc() { emit lastWindowClosed(); } + }; + #endif + void NetHackQtBind::qt_exit_nhwindows(const char *) { + #if defined(QWS) + // Avoids bug in SHARP SL5500 + ((TApp*)qApp)->lwc(); + qApp->quit(); + #endif + + delete instance; // ie. qApp } void NetHackQtBind::qt_suspend_nhwindows(const char *) *************** *** 3722,3727 **** --- 4595,4613 ---- window=new NetHackQtTextWindow(keybuffer); } + // Note: use of isHidden does not work with Qt 2.1 + if ( splash + #if QT_VERSION >= 300 + && !main->isHidden() + #else + && main->isVisible() + #endif + ) + { + delete splash; + splash = 0; + } + id_to_window[id] = window; return id; } *************** *** 3955,3961 **** #ifdef USE_POPUPS // Improve some special-cases (DIRKS 08/02/23) if (strcmp (choices,"ynq") == 0) { ! switch (QMessageBox::information (0,"NetHack",question,"&Yes","&No","&Quit",0,2)) { case 0: return 'y'; case 1: return 'n'; --- 4841,4847 ---- #ifdef USE_POPUPS // Improve some special-cases (DIRKS 08/02/23) if (strcmp (choices,"ynq") == 0) { ! switch (QMessageBox::information (qApp->mainWidget(),"NetHack",question,"&Yes","&No","&Quit",0,2)) { case 0: return 'y'; case 1: return 'n'; *************** *** 3964,3970 **** } if (strcmp (choices,"yn") == 0) { ! switch (QMessageBox::information(0,"NetHack",question,"&Yes", "&No",0,1)) { case 0: return 'y'; case 1: return 'n'; --- 4850,4856 ---- } if (strcmp (choices,"yn") == 0) { ! switch (QMessageBox::information(qApp->mainWidget(),"NetHack",question,"&Yes", "&No",0,1)) { case 0: return 'y'; case 1: return 'n'; *************** *** 4141,4146 **** --- 5027,5037 ---- bool NetHackQtBind::notify(QObject *receiver, QEvent *event) { + // Ignore Alt-key navigation to menubar, it's annoying when you + // use Alt-Direction to move around. + if ( main && event->type()==QEvent::KeyRelease && main==receiver ) + return TRUE; + bool result=QApplication::notify(receiver,event); if (event->type()==QEvent::KeyPress) { QKeyEvent* key_event=(QKeyEvent*)event; *************** *** 4179,4190 **** --- 5070,5083 ---- NetHackQtKeyBuffer NetHackQtBind::keybuffer; NetHackQtClickBuffer NetHackQtBind::clickbuffer; NetHackQtMainWindow* NetHackQtBind::main=0; + QWidget* NetHackQtBind::splash=0; extern "C" struct window_procs Qt_procs; struct window_procs Qt_procs = { "Qt", + WC_COLOR|WC_HILITE_PET, NetHackQtBind::qt_init_nhwindows, NetHackQtBind::qt_player_selection, NetHackQtBind::qt_askname, *************** *** 4238,4254 **** #else genl_outrip, #endif }; extern "C" void play_usersound(const char* filename, int volume) { #ifdef USER_SOUNDS ! // Qt 2.2 has sound ! //QSound::play(filename,volume); #endif } #include "qt_win.moc" #ifndef KDE #include "qt_kde0.moc" #endif --- 5131,5152 ---- #else genl_outrip, #endif + genl_preference_update, }; extern "C" void play_usersound(const char* filename, int volume) { #ifdef USER_SOUNDS ! #ifndef QT_NO_SOUND ! QSound::play(filename); ! #endif #endif } #include "qt_win.moc" #ifndef KDE #include "qt_kde0.moc" + #endif + #if QT_VERSION >= 300 + #include "qttableview.moc" #endif *** nethack-3.3.1/win/Qt/tileedit.cpp Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/Qt/tileedit.cpp Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tileedit.cpp 3.3 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ /* --- 1,4 ---- ! /* SCCS Id: @(#)tileedit.cpp 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ /* *************** *** 180,186 **** { pen = rgb; for (penpixel = 0; ! penpixelpos()); + if ( !img.rect().contains(p) ) + return; uchar& pixel = img.scanLine(p.y())[p.x()]; if ( e->button() == LeftButton ) { pixel = penpixel; *************** *** 226,232 **** emit pick( img.color(pixel) ); } else if ( e->button() == MidButton ) { QPainter painter(this); ! fill(painter,p,pixel); } } --- 228,235 ---- emit pick( img.color(pixel) ); } else if ( e->button() == MidButton ) { QPainter painter(this); ! if ( pixel != penpixel ) ! fill(painter,p,pixel); } } *************** *** 253,258 **** --- 256,263 ---- void TrivialTileEditor::mouseMoveEvent(QMouseEvent* e) { QPoint p = imagePoint(e->pos()); + if ( !img.rect().contains(p) ) + return; uchar& pixel = img.scanLine(p.y())[p.x()]; pixel = penpixel; QPainter painter(this); *** nethack-3.3.1/win/Qt/tileedit.h Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/Qt/tileedit.h Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tileedit.h 3.3 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef QNHTILEEDIT_H --- 1,4 ---- ! /* SCCS Id: @(#)tileedit.h 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef QNHTILEEDIT_H *** nethack-3.3.1/win/share/monsters.txt Thu Feb 14 07:59:39 2002 --- nethack-3.4.0/win/share/monsters.txt Thu Mar 21 07:37:45 2002 *************** *** 2241,2260 **** { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM ! MMMMMMMMMMGGMMMM ! MMMMMMMMMGOGGMMM ! MMMMMMMMMGGGGMMM ! MMMMMGGMMGGGMMMM ! MMMGGMMGGMMMAAAM ! MMMMMGOGGGMAAAAM ! MMMMGOGGMMGAAAAM ! NNNGOGGMGAAAAAMM ! NANGGGGMAGAAMMMM ! NNNGGNNNAAAMAMMM ! MMGGGNANAAMAMAMM ! MGGGANNNAAMMAMMM ! MMGMMAAAAAAMMMMM ! MMMMMMAAMAMMMMMM } # tile 118 (xan) { --- 2241,2260 ---- { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMDMMMMNHCNMMDMM ! MDMDMMNHDNCNDEDM ! DMDMDMNNHCNDMDED ! MDMMMDMNNHDNDMMM ! MDDDMMENNGMDMDEM ! MMDDDDEEEEGDMMDE ! DMMMMMDEHEEMDMMM ! MDMMMMMMMHMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM } # tile 118 (xan) { *************** *** 6930,6950 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 364 (Wizard of Balance) { ! MMMMMMMMMBPMMMMM ! MMMMMMBBBPEMMMMM ! MMMMMBPPPEAMMMMM ! MMMMMBAAAEAMMMMM ! MMMHMPAAAEAMMMMM ! MMMHBPLLLEAMMMMM ! MHHHHHPLLEMMMMMM ! MCMLMCBAAEAMAAAM ! PCPHPCPBBEEAAAAM ! CHCHCHCPPEEEAAMM ! MMMHMEEPPEALAAMM ! MMHHHEPPPEAAAAMM ! MMMMMBPPPEAAMAMM MMMMBPPPPPEAMMMM MMMBPPPPPPPEMMMM MMMMMMMMMMMMMMMM --- 6930,6950 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 364 (Neferet the Green) { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMGGGMMMMMMM ! MMMMMGFFFGMMMMMM ! MMMMGFEFEGMMMMMM ! MMMMGFFFFEGMMMMM ! MNMGPEFFFEEMMMMM ! MIMMBBEAAEAMAAMM ! MIMBBPPBBEEAAAAM ! MIGBPPPPPEEEAAMM ! MIMPPMEPEAAGAAMM ! MIMMMBPPPAAAAAMM ! MNMMMBPPPEAAMAMM MMMMBPPPPPEAMMMM MMMBPPPPPPPEMMMM MMMMMMMMMMMMMMMM *** nethack-3.3.1/win/share/objects.txt Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/share/objects.txt Thu Mar 21 07:37:45 2002 *************** *** 2408,2414 **** MMMMMNNNNNAAMMMM MMMMMMAAAAAMMMMM } ! # tile 126 (tattered cape / cloak of protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2408,2433 ---- MMMMMNNNNNAAMMMM MMMMMMAAAAAMMMMM } ! # tile 126 (leather cloak) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMKJJMJJKMMMMM ! MMMMMKJJJKAAMMMM ! MMMMMMKJKAAMMMMM ! MMMMMKKAKJAMMMMM ! MMMMKKKAKJJAMMMM ! MMMKKKAAKJJJAMMM ! MMKKKKAAKJJJJAMM ! MMKKKAAJJKJJJAMM ! MMKKKAAJJKJJJAMM ! MMMKKAJJJJKJAMMM ! MMMMAAAAAAAAMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 127 (tattered cape / cloak of protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2427,2433 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 127 (opera cloak / cloak of invisibility) { MMMMMMMMMMMMMMMM MMMMMMNNNMMMMMMM --- 2446,2452 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 128 (opera cloak / cloak of invisibility) { MMMMMMMMMMMMMMMM MMMMMMNNNMMMMMMM *************** *** 2446,2452 **** MMAANNNNNNAOOAAM MMMMAAAAAAAAAAMM } ! # tile 128 (ornamental cope / cloak of magic resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2465,2471 ---- MMAANNNNNNAOOAAM MMMMAAAAAAAAAAMM } ! # tile 129 (ornamental cope / cloak of magic resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2465,2471 **** MMAAAAAAAAAAAPMM MMMPPPPPPPPPPPMM } ! # tile 129 (piece of cloth / cloak of displacement) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2484,2490 ---- MMAAAAAAAAAAAPMM MMMPPPPPPPPPPPMM } ! # tile 130 (piece of cloth / cloak of displacement) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2484,2490 **** MMMMMPPPPPAAMMMM MMMMMMMPPAAMMMMM } ! # tile 130 (small shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2503,2509 ---- MMMMMPPPPPAAMMMM MMMMMMMPPAAMMMMM } ! # tile 131 (small shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2503,2509 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 131 (blue and green shield / elven shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2522,2528 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 132 (blue and green shield / elven shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2522,2528 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 132 (white-handed shield / Uruk-hai shield) { MMMMMMMMMMMMMMMM MMMKMKKKJJJMJMMM --- 2541,2547 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 133 (white-handed shield / Uruk-hai shield) { MMMMMMMMMMMMMMMM MMMKMKKKJJJMJMMM *************** *** 2541,2547 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 133 (red-eyed shield / orcish shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2560,2566 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 134 (red-eyed shield / orcish shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2560,2566 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 134 (large shield) { MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM --- 2579,2585 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 135 (large shield) { MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM *************** *** 2579,2585 **** MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 135 (large round shield / dwarvish roundshield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2598,2604 ---- MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 136 (large round shield / dwarvish roundshield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2598,2604 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 136 (polished silver shield / shield of reflection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2617,2623 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 137 (polished silver shield / shield of reflection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2617,2623 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 137 (old gloves / leather gloves) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2636,2642 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 138 (old gloves / leather gloves) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2636,2642 **** MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 138 (padded gloves / gauntlets of fumbling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2655,2661 ---- MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 139 (padded gloves / gauntlets of fumbling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2655,2661 **** MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 139 (riding gloves / gauntlets of power) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2674,2680 ---- MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 140 (riding gloves / gauntlets of power) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2674,2680 **** MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 140 (fencing gloves / gauntlets of dexterity) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2693,2699 ---- MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 141 (fencing gloves / gauntlets of dexterity) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2693,2699 **** MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 141 (walking shoes / low boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2712,2718 ---- MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 142 (walking shoes / low boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2712,2718 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 142 (hard shoes / iron shoes) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2731,2737 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 143 (hard shoes / iron shoes) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2731,2737 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 143 (jackboots / high boots) { MMMMMMMCCKKKKMMM MMMMMMCKAAAAJJMM --- 2750,2756 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 144 (jackboots / high boots) { MMMMMMMCCKKKKMMM MMMMMMCKAAAAJJMM *************** *** 2750,2756 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 144 (combat boots / speed boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2769,2775 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 145 (combat boots / speed boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2769,2775 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 145 (jungle boots / water walking boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2788,2794 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 146 (jungle boots / water walking boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2788,2794 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 146 (hiking boots / jumping boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2807,2813 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 147 (hiking boots / jumping boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2807,2813 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 147 (mud boots / elven boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2826,2832 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 148 (mud boots / elven boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2826,2832 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 148 (buckled boots / kicking boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2845,2851 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 149 (buckled boots / kicking boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2845,2851 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 149 (riding boots / fumble boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2864,2870 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 150 (riding boots / fumble boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2864,2870 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 150 (snow boots / levitation boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2883,2889 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 151 (snow boots / levitation boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2883,2889 **** MMMAMAMAMAMAMAMM MMMMMMMMMMMMMMMM } ! # tile 151 (wooden / adornment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2902,2908 ---- MMMAMAMAMAMAMAMM MMMMMMMMMMMMMMMM } ! # tile 152 (wooden / adornment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2902,2908 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 152 (granite / gain strength) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2921,2927 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 153 (granite / gain strength) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2921,2927 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 153 (opal / gain constitution) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2940,2946 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 154 (opal / gain constitution) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2940,2946 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 154 (clay / increase accuracy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2959,2965 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 155 (clay / increase accuracy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2959,2965 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 155 (coral / increase damage) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2978,2984 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 156 (coral / increase damage) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2978,2984 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 156 (black onyx / protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2997,3003 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 157 (black onyx / protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2997,3003 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 157 (moonstone / regeneration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3016,3022 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 158 (moonstone / regeneration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3016,3022 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 158 (tiger eye / searching) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3035,3041 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 159 (tiger eye / searching) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3035,3041 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 159 (jade / stealth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3054,3060 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 160 (jade / stealth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3054,3060 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 160 (bronze / sustain ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3073,3079 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 161 (bronze / sustain ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3073,3079 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 161 (agate / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3092,3098 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 162 (agate / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3092,3098 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 162 (topaz / hunger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3111,3117 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 163 (topaz / hunger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3111,3117 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 163 (sapphire / aggravate monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3130,3136 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 164 (sapphire / aggravate monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3130,3136 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 164 (ruby / conflict) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3149,3155 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 165 (ruby / conflict) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3149,3155 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 165 (diamond / warning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3168,3174 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 166 (diamond / warning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3168,3174 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 166 (pearl / poison resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3187,3193 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 167 (pearl / poison resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3187,3193 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 167 (iron / fire resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3206,3212 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 168 (iron / fire resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3206,3212 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 168 (brass / cold resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3225,3231 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 169 (brass / cold resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3225,3231 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 169 (copper / shock resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3244,3250 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 170 (copper / shock resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3244,3250 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 170 (twisted / free action) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3263,3269 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 171 (twisted / free action) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3263,3269 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 171 (steel / slow digestion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3282,3288 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 172 (steel / slow digestion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3282,3288 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 172 (silver / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3301,3307 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 173 (silver / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3301,3307 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 173 (gold / teleport control) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3320,3326 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 174 (gold / teleport control) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3320,3326 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 174 (ivory / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3339,3345 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 175 (ivory / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3339,3345 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 175 (emerald / polymorph control) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3358,3364 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 176 (emerald / polymorph control) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3358,3364 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 176 (wire / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3377,3383 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 177 (wire / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3377,3383 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 177 (engagement / see invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3396,3402 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 178 (engagement / see invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3396,3402 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 178 (shiny / protection from shape changers) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3415,3421 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 179 (shiny / protection from shape changers) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3415,3421 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 179 (circular / amulet of ESP) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3434,3440 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 180 (circular / amulet of ESP) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3434,3440 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 180 (spherical / amulet of life saving) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3453,3459 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 181 (spherical / amulet of life saving) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3453,3459 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 181 (oval / amulet of strangulation) { MMMMMMMMMMMMMMMM MMMMMMLLLLLLAAMM --- 3472,3478 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 182 (oval / amulet of strangulation) { MMMMMMMMMMMMMMMM MMMMMMLLLLLLAAMM *************** *** 3472,3478 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 182 (triangular / amulet of restful sleep) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3491,3497 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 183 (triangular / amulet of restful sleep) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3491,3497 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 183 (pyramidal / amulet versus poison) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3510,3516 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 184 (pyramidal / amulet versus poison) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3510,3516 **** MMMMKJJJJJJJJAMM MMMMMMMAAAAAAAMM } ! # tile 184 (square / amulet of change) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3529,3535 ---- MMMMKJJJJJJJJAMM MMMMMMMAAAAAAAMM } ! # tile 185 (square / amulet of change) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3529,3535 **** MMMMMMMAAAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 185 (concave / amulet of unchanging) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3548,3554 ---- MMMMMMMAAAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 186 (concave / amulet of unchanging) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3548,3554 **** MMMMMMMKCCAAMMMM MMMMMMMMAAAMMMMM } ! # tile 186 (hexagonal / amulet of reflection) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3567,3573 ---- MMMMMMMKCCAAMMMM MMMMMMMMAAAMMMMM } ! # tile 187 (hexagonal / amulet of reflection) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3567,3573 **** MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 187 (octagonal / amulet of magical breathing) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM --- 3586,3592 ---- MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 188 (octagonal / amulet of magical breathing) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM *************** *** 3586,3592 **** MMMMMMMKKKAAMMMM MMMMMMMMAAAMMMMM } ! # tile 188 (Amulet of Yendor / cheap plastic imitation of the Amulet of Yendor) { MMMMMMMMMMMMMMMM MMMMMMHHHHHAAMMM --- 3605,3611 ---- MMMMMMMKKKAAMMMM MMMMMMMMAAAMMMMM } ! # tile 189 (Amulet of Yendor / cheap plastic imitation of the Amulet of Yendor) { MMMMMMMMMMMMMMMM MMMMMMHHHHHAAMMM *************** *** 3605,3611 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 189 (Amulet of Yendor / Amulet of Yendor) { MMMMMMMMMMMMMMMM MMMMMMHHHHHAAMMM --- 3624,3630 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 190 (Amulet of Yendor / Amulet of Yendor) { MMMMMMMMMMMMMMMM MMMMMMHHHHHAAMMM *************** *** 3624,3630 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 190 (large box) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3643,3649 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 191 (large box) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3643,3649 **** CKKKKKKKKKKJAAMM MAAAAAAAAAAAAMMM } ! # tile 191 (chest) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3662,3668 ---- CKKKKKKKKKKJAAMM MAAAAAAAAAAAAMMM } ! # tile 192 (chest) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3662,3668 **** CKKKKKKKKKKJAAMM MAAAAAAAAAAAAMMM } ! # tile 192 (ice box) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3681,3687 ---- CKKKKKKKKKKJAAMM MAAAAAAAAAAAAMMM } ! # tile 193 (ice box) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3681,3687 **** NBBBBBBBBBBPAAMM MAAAAAAAAAAAAMMM } ! # tile 193 (bag / sack) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3700,3706 ---- NBBBBBBBBBBPAAMM MAAAAAAAAAAAAMMM } ! # tile 194 (bag / sack) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3700,3706 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 194 (bag / oilskin sack) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3719,3725 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 195 (bag / oilskin sack) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3719,3725 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 195 (bag / bag of holding) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3738,3744 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 196 (bag / bag of holding) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3738,3744 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 196 (bag / bag of tricks) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3757,3763 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 197 (bag / bag of tricks) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3757,3763 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 197 (key / skeleton key) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3776,3782 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 198 (key / skeleton key) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3776,3782 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 198 (lock pick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3795,3801 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 199 (lock pick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3795,3801 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 199 (credit card) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3814,3820 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 200 (credit card) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3814,3820 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 200 (candle / tallow candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3833,3839 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 201 (candle / tallow candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3833,3839 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 201 (candle / wax candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3852,3858 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 202 (candle / wax candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3852,3858 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 202 (brass lantern) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3871,3877 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 203 (brass lantern) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3871,3877 **** MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 203 (lamp / oil lamp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3890,3896 ---- MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM } ! # tile 204 (lamp / oil lamp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3890,3896 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 204 (lamp / magic lamp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3909,3915 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 205 (lamp / magic lamp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3909,3915 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 205 (expensive camera) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3928,3934 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 206 (expensive camera) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3928,3934 **** MMMPPPPPPPPPPPPM MMMMMMMMMMMMMMMM } ! # tile 206 (looking glass / mirror) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3947,3953 ---- MMMPPPPPPPPPPPPM MMMMMMMMMMMMMMMM } ! # tile 207 (looking glass / mirror) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3947,3953 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 207 (glass orb / crystal ball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3966,3972 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 208 (glass orb / crystal ball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3966,3972 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 208 (lenses) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3985,3991 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 209 (lenses) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 3985,3991 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 209 (blindfold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4004,4010 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 210 (blindfold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4004,4010 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 210 (towel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4023,4029 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 211 (towel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4023,4029 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 211 (saddle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4042,4048 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 212 (saddle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4042,4048 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 212 (leash) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4061,4067 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 213 (leash) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4061,4067 **** MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 213 (stethoscope) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4080,4086 ---- MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 214 (stethoscope) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4080,4086 **** MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 214 (tinning kit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4099,4105 ---- MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 215 (tinning kit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4099,4105 **** MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 215 (tin opener) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4118,4124 ---- MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 216 (tin opener) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4118,4124 **** MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 216 (can of grease) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4137,4143 ---- MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 217 (can of grease) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4137,4143 **** MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 217 (figurine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4156,4162 ---- MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 218 (figurine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4156,4162 **** MMMMMJJJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 218 (magic marker) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4175,4181 ---- MMMMMJJJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 219 (magic marker) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4175,4181 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 219 (land mine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4194,4200 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 220 (land mine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4194,4200 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 220 (beartrap) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4213,4219 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 221 (beartrap) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4213,4219 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 221 (whistle / tin whistle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4232,4238 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 222 (whistle / tin whistle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4232,4238 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 222 (whistle / magic whistle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4251,4257 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 223 (whistle / magic whistle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4251,4257 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 223 (flute / wooden flute) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4270,4276 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 224 (flute / wooden flute) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4270,4276 **** MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 224 (flute / magic flute) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4289,4295 ---- MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 225 (flute / magic flute) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4289,4295 **** MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 225 (horn / tooled horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4308,4314 ---- MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 226 (horn / tooled horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4308,4314 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 226 (horn / frost horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4327,4333 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 227 (horn / frost horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4327,4333 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 227 (horn / fire horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4346,4352 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 228 (horn / fire horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4346,4352 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 228 (horn / horn of plenty) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4365,4371 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 229 (horn / horn of plenty) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4365,4371 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 229 (harp / wooden harp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4384,4390 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 230 (harp / wooden harp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4384,4390 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 230 (harp / magic harp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4403,4409 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 231 (harp / magic harp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4403,4409 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 231 (bell) { MMMMMMMMMMMMMMMM MMMMMMMKAMMMMMMM --- 4422,4428 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 232 (bell) { MMMMMMMMMMMMMMMM MMMMMMMKAMMMMMMM *************** *** 4422,4428 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 232 (bugle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4441,4447 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 233 (bugle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4441,4447 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 233 (drum / leather drum) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4460,4466 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 234 (drum / leather drum) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4460,4466 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 234 (drum / drum of earthquake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4479,4485 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 235 (drum / drum of earthquake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4479,4485 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 235 (pick-axe) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4498,4504 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 236 (pick-axe) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4498,4504 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 236 (iron hook / grappling hook) { MMMMMMMMMMMMMNMM MMMMMMMMMMMMMMPM --- 4517,4523 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 237 (iron hook / grappling hook) { MMMMMMMMMMMMMNMM MMMMMMMMMMMMMMPM *************** *** 4517,4523 **** MMOOAMMOOOAMMMMM MMMMOOOAAMMMMMMM } ! # tile 237 (unicorn horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4536,4542 ---- MMOOAMMOOOAMMMMM MMMMOOOAAMMMMMMM } ! # tile 238 (unicorn horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4536,4542 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 238 (candelabrum / Candelabrum of Invocation) { MMMMMMMNMMMMMMMM MMMMMMMDMMMMMMMM --- 4555,4561 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 239 (candelabrum / Candelabrum of Invocation) { MMMMMMMNMMMMMMMM MMMMMMMDMMMMMMMM *************** *** 4555,4561 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 239 (silver bell / Bell of Opening) { MMMMMMMMMMMMMMMM MMMMMMMOAMMMMMMM --- 4574,4580 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 240 (silver bell / Bell of Opening) { MMMMMMMMMMMMMMMM MMMMMMMOAMMMMMMM *************** *** 4574,4580 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 240 (tripe ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4593,4599 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 241 (tripe ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4593,4599 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 241 (corpse) { MMMMMMMMMMMMMMMM MMMMMDMDPLNMMMMM --- 4612,4618 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 242 (corpse) { MMMMMMMMMMMMMMMM MMMMMDMDPLNMMMMM *************** *** 4612,4618 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 242 (egg) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4631,4637 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 243 (egg) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4631,4637 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 243 (meatball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4650,4656 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 244 (meatball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4650,4656 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 244 (meat stick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4669,4675 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 245 (meat stick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4669,4675 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 245 (huge chunk of meat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4688,4694 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 246 (huge chunk of meat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4688,4694 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 246 (meat ring) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4707,4713 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 247 (meat ring) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4707,4713 **** MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 247 (kelp frond) { MMMMFAMMMMMMMMMM MMMMFFAMMMMMMMMM --- 4726,4732 ---- MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 248 (kelp frond) { MMMMFAMMMMMMMMMM MMMMFFAMMMMMMMMM *************** *** 4726,4732 **** MMMMMFFFFAMMMMMM MMMMMMFFFFAMMMMM } ! # tile 248 (eucalyptus leaf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4745,4751 ---- MMMMMFFFFAMMMMMM MMMMMMFFFFAMMMMM } ! # tile 249 (eucalyptus leaf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4745,4751 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 249 (apple) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4764,4770 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 250 (apple) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4764,4770 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 250 (orange) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4783,4789 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 251 (orange) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4783,4789 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 251 (pear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4802,4808 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 252 (pear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4802,4808 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 252 (melon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4821,4827 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 253 (melon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4821,4827 **** MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 253 (banana) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4840,4846 ---- MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 254 (banana) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4840,4846 **** MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 254 (carrot) { MMMMMMMMMMMMMMMM MMMMMMMMMMFMMFMM --- 4859,4865 ---- MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 255 (carrot) { MMMMMMMMMMMMMMMM MMMMMMMMMMFMMFMM *************** *** 4859,4865 **** MMMAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 255 (sprig of wolfsbane) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4878,4884 ---- MMMAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 256 (sprig of wolfsbane) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4878,4884 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 256 (clove of garlic) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4897,4903 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 257 (clove of garlic) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4897,4903 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 257 (slime mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4916,4922 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 258 (slime mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4916,4922 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 258 (lump of royal jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4935,4941 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 259 (lump of royal jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4935,4941 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 259 (cream pie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4954,4960 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 260 (cream pie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4954,4960 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 260 (candy bar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4973,4979 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 261 (candy bar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4973,4979 **** MMMMAMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 261 (fortune cookie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 4992,4998 ---- MMMMAMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 262 (fortune cookie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 4992,4998 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 262 (pancake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5011,5017 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 263 (pancake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5011,5017 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 263 (lembas wafer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5030,5036 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 264 (lembas wafer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5030,5036 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 264 (cram ration) { MMMMMMMMMMMMMMMM MMMJKAMMMMMMMMMM --- 5049,5055 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 265 (cram ration) { MMMMMMMMMMMMMMMM MMMJKAMMMMMMMMMM *************** *** 5049,5055 **** MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 265 (food ration) { MMMJJAMMMMMMMMMM MMMBPAMMMMMMMMMM --- 5068,5074 ---- MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 266 (food ration) { MMMJJAMMMMMMMMMM MMMBPAMMMMMMMMMM *************** *** 5068,5074 **** MMMMKKKKKKKKKAMM MMMMMAAAAAAAAMMM } ! # tile 266 (K-ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5087,5093 ---- MMMMKKKKKKKKKAMM MMMMMAAAAAAAAMMM } ! # tile 267 (K-ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5087,5093 **** MMMMKKKKKKKKKAMM MMMMMAAAAAAAAMMM } ! # tile 267 (C-ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5106,5112 ---- MMMMKKKKKKKKKAMM MMMMMAAAAAAAAMMM } ! # tile 268 (C-ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5106,5112 **** MMMMKKKKKKKKKAMM MMMMMAAAAAAAAMMM } ! # tile 268 (tin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5125,5131 ---- MMMMKKKKKKKKKAMM MMMMMAAAAAAAAMMM } ! # tile 269 (tin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5125,5131 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 269 (ruby / gain ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5144,5150 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 270 (ruby / gain ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5144,5150 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 270 (pink / restore ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5163,5169 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 271 (pink / restore ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5163,5169 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 271 (orange / confusion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5182,5188 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 272 (orange / confusion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5182,5188 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 272 (yellow / blindness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5201,5207 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 273 (yellow / blindness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5201,5207 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 273 (emerald / paralysis) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5220,5226 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 274 (emerald / paralysis) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5220,5226 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 274 (dark green / speed) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5239,5245 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 275 (dark green / speed) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5239,5245 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 275 (cyan / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5258,5264 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 276 (cyan / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5258,5264 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 276 (sky blue / hallucination) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5277,5283 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 277 (sky blue / hallucination) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5277,5283 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 277 (brilliant blue / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5296,5302 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 278 (brilliant blue / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5296,5302 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 278 (magenta / see invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5315,5321 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 279 (magenta / see invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5315,5321 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 279 (purple-red / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5334,5340 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 280 (purple-red / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5334,5340 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 280 (puce / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5353,5359 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 281 (puce / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5353,5359 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 281 (milky / gain level) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5372,5378 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 282 (milky / gain level) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5372,5378 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 282 (swirly / enlightenment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5391,5397 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 283 (swirly / enlightenment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5391,5397 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 283 (bubbly / monster detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5410,5416 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 284 (bubbly / monster detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5410,5416 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 284 (smoky / object detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5429,5435 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 285 (smoky / object detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5429,5435 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 285 (cloudy / gain energy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5448,5454 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 286 (cloudy / gain energy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5448,5454 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 286 (effervescent / sleeping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5467,5473 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 287 (effervescent / sleeping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5467,5473 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 287 (black / full healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5486,5492 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 288 (black / full healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5486,5492 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 288 (golden / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5505,5511 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 289 (golden / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5505,5511 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 289 (brown / booze) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5524,5530 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 290 (brown / booze) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5524,5530 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 290 (fizzy / sickness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5543,5549 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 291 (fizzy / sickness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5543,5549 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 291 (dark / fruit juice) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5562,5568 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 292 (dark / fruit juice) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5562,5568 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 292 (white / acid) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5581,5587 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 293 (white / acid) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5581,5587 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 293 (murky / oil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5600,5606 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 294 (murky / oil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5600,5606 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 294 (clear / water) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5619,5625 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 295 (clear / water) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5619,5625 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 295 (ZELGO MER / enchant armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5638,5644 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 296 (ZELGO MER / enchant armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5638,5644 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 296 (JUYED AWK YACC / destroy armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5657,5663 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 297 (JUYED AWK YACC / destroy armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5657,5663 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 297 (NR 9 / confuse monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5676,5682 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 298 (NR 9 / confuse monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5676,5682 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 298 (XIXAXA XOXAXA XUXAXA / scare monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5695,5701 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 299 (XIXAXA XOXAXA XUXAXA / scare monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5695,5701 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 299 (PRATYAVAYAH / remove curse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5714,5720 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 300 (PRATYAVAYAH / remove curse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5714,5720 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 300 (DAIYEN FOOELS / enchant weapon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5733,5739 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 301 (DAIYEN FOOELS / enchant weapon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5733,5739 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 301 (LEP GEX VEN ZEA / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5752,5758 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 302 (LEP GEX VEN ZEA / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5752,5758 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 302 (PRIRUTSENIE / taming) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5771,5777 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 303 (PRIRUTSENIE / taming) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5771,5777 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 303 (ELBIB YLOH / genocide) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5790,5796 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 304 (ELBIB YLOH / genocide) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5790,5796 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 304 (VERR YED HORRE / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5809,5815 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 305 (VERR YED HORRE / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5809,5815 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 305 (VENZAR BORGAVVE / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5828,5834 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 306 (VENZAR BORGAVVE / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5828,5834 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 306 (THARR / gold detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5847,5853 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 307 (THARR / gold detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5847,5853 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 307 (YUM YUM / food detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5866,5872 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 308 (YUM YUM / food detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5866,5872 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 308 (KERNOD WEL / identify) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5885,5891 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 309 (KERNOD WEL / identify) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5885,5891 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 309 (ELAM EBOW / magic mapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5904,5910 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 310 (ELAM EBOW / magic mapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5904,5910 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 310 (DUAM XNAHT / amnesia) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5923,5929 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 311 (DUAM XNAHT / amnesia) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5923,5929 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 311 (ANDOVA BEGARIN / fire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5942,5948 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 312 (ANDOVA BEGARIN / fire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5942,5948 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 312 (KIRJE / earth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5961,5967 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 313 (KIRJE / earth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5961,5967 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 313 (VE FORBRYDERNE / punishment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5980,5986 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 314 (VE FORBRYDERNE / punishment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5980,5986 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 314 (HACKEM MUCHE / charging) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 5999,6005 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 315 (HACKEM MUCHE / charging) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 5999,6005 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 315 (VELOX NEB / stinking cloud) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6018,6024 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 316 (VELOX NEB / stinking cloud) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6018,6024 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 316 (FOOBIE BLETCH) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6037,6043 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 317 (FOOBIE BLETCH) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6037,6043 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 317 (TEMOV) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6056,6062 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 318 (TEMOV) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6056,6062 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 318 (GARVEN DEH) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6075,6081 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 319 (GARVEN DEH) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6075,6081 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 319 (READ ME) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6094,6100 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 320 (READ ME) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6094,6100 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 320 (stamped / mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6113,6119 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 321 (stamped / mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6113,6119 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 321 (unlabeled / blank paper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6132,6138 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 322 (unlabeled / blank paper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6132,6138 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 322 (parchment / dig) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6151,6157 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 323 (parchment / dig) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6151,6157 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 323 (vellum / magic missile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6170,6176 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 324 (vellum / magic missile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6170,6176 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 324 (ragged / fireball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6189,6195 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 325 (ragged / fireball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6189,6195 **** MMMMMMOOJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 325 (dog eared / cone of cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6208,6214 ---- MMMMMMOOJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 326 (dog eared / cone of cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6208,6214 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 326 (mottled / sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6227,6233 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 327 (mottled / sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6227,6233 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 327 (stained / finger of death) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6246,6252 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 328 (stained / finger of death) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6246,6252 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 328 (cloth / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6265,6271 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 329 (cloth / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6265,6271 **** MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 329 (leather / detect monsters) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6284,6290 ---- MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 330 (leather / detect monsters) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6284,6290 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 330 (white / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6303,6309 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 331 (white / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6303,6309 **** MMMMMMMPNNAAMMMM MMMMMMMMMMMMMMMM } ! # tile 331 (pink / knock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6322,6328 ---- MMMMMMMPNNAAMMMM MMMMMMMMMMMMMMMM } ! # tile 332 (pink / knock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6322,6328 **** MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 332 (red / force bolt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6341,6347 ---- MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 333 (red / force bolt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6341,6347 **** MMMMMMMDDDAAMMMM MMMMMMMMMMMMMMMM } ! # tile 333 (orange / confuse monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6360,6366 ---- MMMMMMMDDDAAMMMM MMMMMMMMMMMMMMMM } ! # tile 334 (orange / confuse monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6360,6366 **** MMMMMMMCCCAAMMMM MMMMMMMMMMMMMMMM } ! # tile 334 (yellow / cure blindness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6379,6385 ---- MMMMMMMCCCAAMMMM MMMMMMMMMMMMMMMM } ! # tile 335 (yellow / cure blindness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6379,6385 **** MMMMMMMHHHAAMMMM MMMMMMMMMMMMMMMM } ! # tile 335 (velvet / drain life) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6398,6404 ---- MMMMMMMHHHAAMMMM MMMMMMMMMMMMMMMM } ! # tile 336 (velvet / drain life) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6398,6404 **** MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } ! # tile 336 (light green / slow monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6417,6423 ---- MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } ! # tile 337 (light green / slow monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6417,6423 **** MMMMMMMGGGAAMMMM MMMMMMMMMMMMMMMM } ! # tile 337 (dark green / wizard lock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6436,6442 ---- MMMMMMMGGGAAMMMM MMMMMMMMMMMMMMMM } ! # tile 338 (dark green / wizard lock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6436,6442 **** MMMMMMMFFFAAMMMM MMMMMMMMMMMMMMMM } ! # tile 338 (turquoise / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6455,6461 ---- MMMMMMMFFFAAMMMM MMMMMMMMMMMMMMMM } ! # tile 339 (turquoise / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6455,6461 **** MMMMMMMFBBAAMMMM MMMMMMMMMMMMMMMM } ! # tile 339 (cyan / detect food) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6474,6480 ---- MMMMMMMFBBAAMMMM MMMMMMMMMMMMMMMM } ! # tile 340 (cyan / detect food) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6474,6480 **** MMMMMMMBBBAAMMMM MMMMMMMMMMMMMMMM } ! # tile 340 (light blue / cause fear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6493,6499 ---- MMMMMMMBBBAAMMMM MMMMMMMMMMMMMMMM } ! # tile 341 (light blue / cause fear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6493,6499 **** MMMMMMMBBBAAMMMM MMMMMMMMMMMMMMMM } ! # tile 341 (dark blue / clairvoyance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6512,6518 ---- MMMMMMMBBBAAMMMM MMMMMMMMMMMMMMMM } ! # tile 342 (dark blue / clairvoyance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6512,6518 **** MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } ! # tile 342 (indigo / cure sickness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6531,6537 ---- MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } ! # tile 343 (indigo / cure sickness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6531,6537 **** MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } ! # tile 343 (magenta / charm monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6550,6556 ---- MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } ! # tile 344 (magenta / charm monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6550,6556 **** MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 344 (purple / haste self) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6569,6575 ---- MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 345 (purple / haste self) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6569,6575 **** MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 345 (violet / detect unseen) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6588,6594 ---- MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 346 (violet / detect unseen) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6588,6594 **** MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 346 (tan / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6607,6613 ---- MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } ! # tile 347 (tan / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6607,6613 **** MMMMMMMKKKAAMMMM MMMMMMMMMMMMMMMM } ! # tile 347 (plaid / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6626,6632 ---- MMMMMMMKKKAAMMMM MMMMMMMMMMMMMMMM } ! # tile 348 (plaid / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6626,6632 **** MMMMMMMEFDAAMMMM MMMMMMMMMMMMMMMM } ! # tile 348 (light brown / restore ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6645,6651 ---- MMMMMMMEFDAAMMMM MMMMMMMMMMMMMMMM } ! # tile 349 (light brown / restore ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6645,6651 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 349 (dark brown / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6664,6670 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 350 (dark brown / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6664,6670 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 350 (gray / detect treasure) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6683,6689 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 351 (gray / detect treasure) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6683,6689 **** MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 351 (wrinkled / remove curse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6702,6708 ---- MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 352 (wrinkled / remove curse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6702,6708 **** MMMMMMJJKKAAMMMM MMMMMMMMMMMMMMMM } ! # tile 352 (dusty / magic mapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6721,6727 ---- MMMMMMJJKKAAMMMM MMMMMMMMMMMMMMMM } ! # tile 353 (dusty / magic mapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6721,6727 **** MKAKAMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 353 (bronze / identify) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6740,6746 ---- MKAKAMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 354 (bronze / identify) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6740,6746 **** MMMMMMMCCCAAMMMM MMMMMMMMMMMMMMMM } ! # tile 354 (copper / turn undead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6759,6765 ---- MMMMMMMCCCAAMMMM MMMMMMMMMMMMMMMM } ! # tile 355 (copper / turn undead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6759,6765 **** MMMMMMMJCJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 355 (silver / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6778,6784 ---- MMMMMMMJCJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 356 (silver / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6778,6784 **** MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 356 (gold / teleport away) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6797,6803 ---- MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 357 (gold / teleport away) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6797,6803 **** MMMMMMMHHHAAMMMM MMMMMMMMMMMMMMMM } ! # tile 357 (glittering / create familiar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6816,6822 ---- MMMMMMMHHHAAMMMM MMMMMMMMMMMMMMMM } ! # tile 358 (glittering / create familiar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6816,6822 **** MMMMMMMPPPANMMMM MMMMMMMNMMMMMMMM } ! # tile 358 (shining / cancellation) { MMMMNMMMMMMMMMMM MMMMMMMNMMMMMMMM --- 6835,6841 ---- MMMMMMMPPPANMMMM MMMMMMMNMMMMMMMM } ! # tile 359 (shining / cancellation) { MMMMNMMMMMMMMMMM MMMMMMMNMMMMMMMM *************** *** 6835,6841 **** MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 359 (dull / protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6854,6860 ---- MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } ! # tile 360 (dull / protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6854,6860 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 360 (thin / jumping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6873,6879 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 361 (thin / jumping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6873,6879 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 361 (thick / stone to flesh) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6892,6898 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 362 (thick / stone to flesh) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6892,6898 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 362 (plain / blank paper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6911,6917 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 363 (plain / blank paper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6911,6917 **** MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 363 (papyrus / Book of the Dead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6930,6936 ---- MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } ! # tile 364 (papyrus / Book of the Dead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6930,6936 **** MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 364 (glass / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6949,6955 ---- MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM } ! # tile 365 (glass / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6949,6955 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 365 (balsa / secret door detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6968,6974 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 366 (balsa / secret door detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6968,6974 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 366 (crystal / enlightenment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 6987,6993 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 367 (crystal / enlightenment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 6987,6993 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 367 (maple / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7006,7012 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 368 (maple / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7006,7012 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 368 (pine / wishing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7025,7031 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 369 (pine / wishing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7025,7031 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 369 (oak / nothing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7044,7050 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 370 (oak / nothing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7044,7050 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 370 (ebony / striking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7063,7069 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 371 (ebony / striking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7063,7069 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 371 (marble / make invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7082,7088 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 372 (marble / make invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7082,7088 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 372 (tin / slow monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7101,7107 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 373 (tin / slow monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7101,7107 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 373 (brass / speed monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7120,7126 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 374 (brass / speed monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7120,7126 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 374 (copper / undead turning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7139,7145 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 375 (copper / undead turning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7139,7145 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 375 (silver / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7158,7164 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 376 (silver / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7158,7164 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 376 (platinum / cancellation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7177,7183 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 377 (platinum / cancellation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7177,7183 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 377 (iridium / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7196,7202 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 378 (iridium / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7196,7202 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 378 (zinc / opening) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7215,7221 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 379 (zinc / opening) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7215,7221 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 379 (aluminum / locking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7234,7240 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 380 (aluminum / locking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7234,7240 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 380 (uranium / probing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7253,7259 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 381 (uranium / probing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7253,7259 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 381 (iron / digging) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7272,7278 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 382 (iron / digging) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7272,7278 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 382 (steel / magic missile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7291,7297 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 383 (steel / magic missile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7291,7297 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 383 (hexagonal / fire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7310,7316 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 384 (hexagonal / fire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7310,7316 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 384 (short / cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7329,7335 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 385 (short / cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7329,7335 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 385 (runed / sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7348,7354 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 386 (runed / sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7348,7354 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 386 (long / death) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMNOM --- 7367,7373 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 387 (long / death) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMNOM *************** *** 7367,7373 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 387 (curved / lightning) { MMMMMMMMMMMMMMMM MMMMMMMNOMMMMMMM --- 7386,7392 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 388 (curved / lightning) { MMMMMMMMMMMMMMMM MMMMMMMNOMMMMMMM *************** *** 7386,7392 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 388 (forked) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7405,7411 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 389 (forked) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7405,7411 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 389 (spiked) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7424,7430 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 390 (spiked) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7424,7430 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 390 (jeweled) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7443,7449 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 391 (jeweled) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7443,7449 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 391 (gold piece) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7462,7468 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 392 (gold piece) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7462,7468 **** MMMMMMMMMHAMMMMM MMMMMMMMMMMHAMMM } ! # tile 392 (white / dilithium crystal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7481,7487 ---- MMMMMMMMMHAMMMMM MMMMMMMMMMMHAMMM } ! # tile 393 (white / dilithium crystal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7481,7487 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 393 (white / diamond) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7500,7506 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 394 (white / diamond) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7500,7506 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 394 (red / ruby) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7519,7525 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 395 (red / ruby) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7519,7525 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 395 (orange / jacinth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7538,7544 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 396 (orange / jacinth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7538,7544 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 396 (blue / sapphire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7557,7563 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 397 (blue / sapphire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7557,7563 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 397 (black / black opal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7576,7582 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 398 (black / black opal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7576,7582 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 398 (green / emerald) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7595,7601 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 399 (green / emerald) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7595,7601 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 399 (green / turquoise) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7614,7620 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 400 (green / turquoise) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7614,7620 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 400 (yellow / citrine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7633,7639 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 401 (yellow / citrine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7633,7639 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 401 (green / aquamarine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7652,7658 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 402 (green / aquamarine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7652,7658 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 402 (yellowish brown / amber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7671,7677 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 403 (yellowish brown / amber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7671,7677 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 403 (yellowish brown / topaz) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7690,7696 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 404 (yellowish brown / topaz) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7690,7696 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 404 (black / jet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7709,7715 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 405 (black / jet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7709,7715 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 405 (white / opal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7728,7734 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 406 (white / opal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7728,7734 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 406 (yellow / chrysoberyl) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7747,7753 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 407 (yellow / chrysoberyl) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7747,7753 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 407 (red / garnet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7766,7772 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 408 (red / garnet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7766,7772 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 408 (violet / amethyst) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7785,7791 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 409 (violet / amethyst) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7785,7791 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 409 (red / jasper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7804,7810 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 410 (red / jasper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7804,7810 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 410 (violet / fluorite) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7823,7829 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 411 (violet / fluorite) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7823,7829 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 411 (black / obsidian) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7842,7848 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 412 (black / obsidian) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7842,7848 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 412 (orange / agate) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7861,7867 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 413 (orange / agate) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7861,7867 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 413 (green / jade) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7880,7886 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 414 (green / jade) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7880,7886 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 414 (white / worthless piece of white glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7899,7905 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 415 (white / worthless piece of white glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7899,7905 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 415 (blue / worthless piece of blue glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7918,7924 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 416 (blue / worthless piece of blue glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7918,7924 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 416 (red / worthless piece of red glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7937,7943 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 417 (red / worthless piece of red glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7937,7943 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 417 (yellowish brown / worthless piece of yellowish brown glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7956,7962 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 418 (yellowish brown / worthless piece of yellowish brown glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7956,7962 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 418 (orange / worthless piece of orange glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7975,7981 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 419 (orange / worthless piece of orange glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7975,7981 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 419 (yellow / worthless piece of yellow glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 7994,8000 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 420 (yellow / worthless piece of yellow glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 7994,8000 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 420 (black / worthless piece of black glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8013,8019 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 421 (black / worthless piece of black glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8013,8019 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 421 (green / worthless piece of green glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8032,8038 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 422 (green / worthless piece of green glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8032,8038 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 422 (violet / worthless piece of violet glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8051,8057 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 423 (violet / worthless piece of violet glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8051,8057 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 423 (gray / luckstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8070,8095 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 424 (gray / luckstone) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMPPPPPMMMMMM ! MMMMPNPPPPPMMMMM ! MMMPNPPPPPPPAMMM ! MMPPPPPPPPPPPAAM ! MMPPPPPPPPPPPAAA ! MMMPPPPPPPPPAAAM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 425 (gray / loadstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8070,8076 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 424 (gray / loadstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8108,8114 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 426 (gray / touchstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8089,8095 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 425 (gray / flint) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8127,8133 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 427 (gray / flint) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8108,8114 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 426 (rock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8146,8152 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 428 (rock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8127,8133 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 427 (boulder) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8165,8171 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 429 (boulder) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8146,8152 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 428 (statue) { MMMMMMMMMMMMMMMM MMMMMMMMJJMMMMMM --- 8184,8190 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 430 (statue) { MMMMMMMMMMMMMMMM MMMMMMMMJJMMMMMM *************** *** 8165,8171 **** MMMMMJJJJJJAAMMM MMMMMMMMMMMMMMMM } ! # tile 429 (heavy iron ball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8203,8209 ---- MMMMMJJJJJJAAMMM MMMMMMMMMMMMMMMM } ! # tile 431 (heavy iron ball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8184,8190 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 430 (iron chain) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8222,8228 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 432 (iron chain) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8203,8209 **** MMMMMMMMMMMPPMPA MMMMMMMMMMMMAAMM } ! # tile 431 (splash of venom / blinding venom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8241,8247 ---- MMMMMMMMMMMPPMPA MMMMMMMMMMMMAAMM } ! # tile 433 (splash of venom / blinding venom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 8222,8228 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 432 (splash of venom / acid venom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 8260,8266 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 434 (splash of venom / acid venom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *** nethack-3.3.1/win/share/other.txt Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/share/other.txt Thu Mar 21 07:37:45 2002 *************** *** 1173,1179 **** MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 61 (anti-magic trap field) { MMMMMMMMMMMMMMMM MMMMMMDDDDDMMMMM --- 1173,1179 ---- MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } ! # tile 61 (anti-magic field) { MMMMMMMMMMMMMMMM MMMMMMDDDDDMMMMM *************** *** 1591,1597 **** DDAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } ! # tile 83 (cmap 83) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 1591,2452 ---- DDAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } ! # tile 83 (explosion dark 0) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMAAA ! MMMMMMAMMMAAAAAA ! MMMMMMMMMAAAAAAA ! MMMMMMMMMAAAAAAM ! MMMMMMMMAAAAMMMA ! MMMAAAMAAAAMMMAA ! MAMMMAAAAAAMAAAA ! MMMMMAAAAAAMAAAA ! MMMMAAAAAAAMAAAA ! MMMMMMMMAAMMAAMM ! MMMMAAAAAAAAAAMM ! MMMAAAAMMAAAMMMM ! MMAAAAMMAAAAMMMM ! MMAAAMMAAAAAMMMM ! } ! # tile 84 (explosion dark 1) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! AMMMMMMMMAAAAAAM ! AAAAAAMAAAAAAAAM ! AAAAAAMMMMMAAAAA ! MMMAAAMAAAAAAAAA ! AAAAAAMAAAAAAAAA ! AAAAAAMAAAAAAAAM ! AAMMMMMMMMMMMAMM ! MMAAAMAMMMMMAAAA ! MAMAMAMMMAMMMAAA ! MPPAMMMAAMMMMMAA ! MAMMMMMAMMMMAAAA ! MMMMMAMMAMMMPAAA ! MMMMMMMMAMAMAPAA ! MPAMMMAPAAAAAAAA ! } ! # tile 85 (explosion dark 2) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMAMMMAMMM ! AAAAAMMMMMMMMMMM ! AAAAAAMMMAMMAMMM ! AAAAAAAMMMMMMMMM ! MMMMMMAAAAMMMMMM ! AAAAAMMAAAAMMMMM ! MMAAAAAAAAAAMMMM ! AAMAAMMMMAAAMMMM ! AAMAAAAAMAAAMMMM ! AAPAAMAAAAAAMAMM ! AAAMMMMMAAAAMMMM ! AAMAMMAMAAAAMMMM ! AMAAMMAMAAAAAMMM ! } ! # tile 86 (explosion dark 3) ! { ! MMAAAMAMAAAMMMMM ! MMAAAMAAAAAMAPMM ! MMMAAMAAMMMMMMMA ! MMMAAAAAAMMMMPPM ! MMAAAMAAMMAMMPAP ! MAAAMMMAMMMMPMAP ! MAAAMAAAMAMMPMMP ! MAAAMAAAMMMAAAAP ! MAAAMAAAMMMMPAAA ! MAAAMMAAMMMMPPAA ! MMAAAMMAAMMMPAAP ! MMMAAAMMMAPMPPPP ! MMMMAAAMMMPMMPMA ! MMMMMAAMMMMMAAAM ! MMAMAMMMAAPMMMPA ! MMMMAMMMMMMMMMPA ! } ! # tile 87 (explosion dark 4) ! { ! APAAAMMPPAPAAAAA ! MAPAMMAMAAAPAAAM ! AAPMPAAMMAAAAAAM ! PAPPPAAAMMAAPAMM ! AAAPPAAAAPAAPMMA ! AAPPMPPPAAAAAMMA ! AAPAAAAAAAAAAAMM ! APPAAAAAAAAAAAMM ! AAAAAAAAAAAAPAAA ! AAAAAAAAAAAAAAAA ! AAAAAAAAAAAAAAAA ! AAAAAAAAAAAAAAAA ! AAAAAAAAAAAAAAAA ! AAAAAAAAAAAAAAAA ! AAAAAAAAAAAAAMAA ! AAAAAAAAAAAMHHMM ! } ! # tile 88 (explosion dark 5) ! { ! MMAAAMAMAMAAAAMM ! MMAAAAAMAMAAAAMM ! MMAAAAAMAMAAAAMM ! PMAAAAAMMMAAAAMM ! PMAAPAPAAMAAAAMM ! PMMMPMMAMMAAAMMM ! MMMAPMMAAAAAAMMM ! MPAAPAAAAAAAAMMM ! AAPMMMPAAAAAMMMM ! MMAAMPPAAMAMMMAM ! AMMMPPMMMMMMMMMM ! MAAAAPPAAMMMAMMM ! MMAAMPPMAAAMMMMM ! AMMMMMMAAAAAMMMM ! AAAMMMAAAAAAAMMM ! MMMMPPAAAAAAAAMM ! } ! # tile 89 (explosion dark 6) ! { ! MMMMAMMMMMMMAMMP ! MMMMAMMMMMMMAAMM ! MAMMAAMMMPMMAMAM ! MMMAAAMAMMPMMAAP ! MMMAAAAMMAAPMMAM ! MMMAAAAMMMMPMMMA ! MMMAAAAMMAMMAMMA ! MMMAAAAAMAAAMMMM ! MMMAAAAAMMAAMMMM ! MMMMAAAAAAAAAMMM ! MMMMMAAAAAAAAAAA ! MMMAMMAAAAAAAAAA ! MMMMMMMMAAMAAAAA ! MMMAMMMMMMMMAAAA ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 90 (explosion dark 7) ! { ! PPPAAAAAPAAAMAMM ! AAPPAAPPPPAMAMMM ! PPPPPPPPPPAMMAPP ! MPPAAMAAMAPAAMMM ! MMAAAAMAMMAAAPAA ! APPAPAPMAMAMPAAM ! AMMPPAAAMMMMMMMP ! AAMMMMMMMAMMMMMM ! PAPAMAAAAAAAAAAP ! AAMAPAAAAMMMMMMA ! AAAMAMPPMMMAAAAA ! AAAAAAMAMMAAAAAA ! AAAAAAAAAAAAAAAA ! AAAAMMMMMMMMMMAA ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 91 (explosion dark 8) ! { ! MMMMPMMAAAAAAAMM ! MMAMMAMAAMAMAAMM ! PPMMAMMAAMAMAAMM ! MMMAAAMAAMAMAAMM ! MAAAAAMAAAMMAAMM ! MMPAAMMAAAMAAAMM ! MAAAMMAAAMMAAAMM ! MAMAAMAAAAAAAAMM ! AAMAAAAAAMAAAAMM ! MMMAAAAAAAAAAAMM ! MAAAAAAAAMAAAMMM ! AAAAAAAAMMMMMMMM ! AAAAAAMMMMAMMMMM ! AAAMMMAMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 92 (explosion noxious 0) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMFFF ! MMMMMMFMMMFFFFFF ! MMMMMMMMMFFFFFFF ! MMMMMMMMMFFFFFFM ! MMMMMMMMFFFFMMMF ! MMMFFFMFFFFMMMFF ! MFMMMFFFFFFMFFFF ! MMMMMFFFFFFMFFFF ! MMMMFFFFFFFMFFFF ! MMMMMMMMFFMMFFMM ! MMMMFFFFFFFFFFMM ! MMMFFFFMMFFFMMMM ! MMFFFFMMFFFFMMMM ! MMFFFMMFFFFFMMMM ! } ! # tile 93 (explosion noxious 1) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! FMMMMMMMMFFFFFFM ! FFFFFFMFFFFFFFFM ! FFFFFFMMMMMFFFFF ! MMMFFFMFFFFFFFFF ! FFFFFFMFFFFFFFFF ! FFFFFFMFFFFFFFFM ! FFMMMMMMMMMMMFMM ! MMFFFMFMMMMMFFFF ! MHMFMFMMMFMMMFFF ! MGGFMMMFFMMMMMFF ! MHMMMMMFMMMMFFFF ! MMMMMFMMFMMMGFFF ! MMMMMMMMFMFMFGFF ! MGHMMMHGHHFFFFFF ! } ! # tile 94 (explosion noxious 2) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMFMMMFMMM ! FFFFFMMMMMMMMMMM ! FFFFFFMMMFMMFMMM ! FFFFFFFMMMMMMMMM ! MMMMMMFFFFMMMMMM ! FFFFFMMFFFFMMMMM ! MMFFFFFFFFFFMMMM ! FFMFFMMMMFFFMMMM ! FFMFFFFFMFFFMMMM ! FFGFFMFFFFFFMFMM ! FFFMMMMMFFFFMMMM ! FFMFMMFMFFFFMMMM ! FMFFMMFMFFFFFMMM ! } ! # tile 95 (explosion noxious 3) ! { ! MMFFFMFMFFFMMMMM ! MMFFFMFFFFFMFGMM ! MMMFFMFFMMMMMMMF ! MMMFFFFFFMMMMGGM ! MMFFFMFFMMFMMGFG ! MFFFMMMFMMMMGMFG ! MFFFMFFFMHMMGMMG ! MFFFMFFFMMMFFFFG ! MFFFMFFFMMMMGFHH ! MFFFMMFFMMMMGGHH ! MMFFFMMFFMMMGHHG ! MMMFFFMMMFGMGGGG ! MMMMFFFMMMGMMGMH ! MMMMMFFMMMMMHHFM ! MMFMFMMMFHGMMMGH ! MMMMFMMMMMMMMMGH ! } ! # tile 96 (explosion noxious 4) ! { ! FGHFFMMGGFGHFFFF ! MHGHMMFMFFHGFHFM ! HFGMGHFMMHHHFFHM ! GFGGGHHHMMHHGFMM ! HHHGGHHHHGHHGMMF ! HHGGMGGGHHHHFMMF ! HHGHHHHHHHHHHFMM ! HGGHHHHHHHHHHHMM ! HHHHHHNNNNHHGHNH ! GHHHHHHHNHHHHHNH ! GHHGHGNNNNHHHHGF ! GGNHNHNNNNHHHGGF ! HHHHNHNNNHHHGGGG ! HGGNGHNNNHHHGGGF ! HHHHNHNHNMGGGMGF ! GGGGNHHHGGGMHHMM ! } ! # tile 97 (explosion noxious 5) ! { ! MMFFFMFMFMFFFFMM ! MMFFFFFMFMFFFFMM ! MMFFFFFMFMFFFFMM ! GMFFFFFMMMFFFFMM ! GMFFGFGFFMFFFFMM ! GMMMGMGFMMFFFMMM ! MMMFGMMFFFFFFMMM ! MGFFFFFFFFFFFMMM ! FFGMMMGFFFFFMMMM ! MMFFMGGFFMFMMMFM ! FMMMGGMMMMMMMMMM ! MFFFFGGFFMMMFMMM ! MMHFMGGMFFFMMMMM ! HMMMMMMFFFFFMMMM ! HFHMMMFFFFFFFMMM ! MMMMGGFFFFFFFFMM ! } ! # tile 98 (explosion noxious 6) ! { ! MMMMFMMMMMMMHMMG ! MMMMFMMMMMMMFHMM ! MFMMFFMMMGMMFMHM ! MMMFFFMFMMGMMFFG ! MMMFFFFMMFFGMMFM ! MMMFFFFMMMMGMMMF ! MMMFFFFMMFMMHMMF ! MMMFFFFFMFFFMMMM ! MMMFFFFFMMFFMMMM ! MMMMFFFFFFFFFMMM ! MMMMMFFFHFFFFFFF ! MMMFMMFFFFFFFFFF ! MMMMMMMMFFMFFFFF ! MMMFMMMMMMMMFFFF ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 99 (explosion noxious 7) ! { ! GGGHHHHHGHHHMHMM ! HHGGHHGGGGHMFMMM ! GGGGGGGGGGFMMFGG ! MGGHFMFFMHGFFMMM ! MMHHHHMFMMFFHGHF ! HGGFGFGMHMHMGFFM ! FMMGGFFHMMMMMMMG ! HFMMMMMMMFMMMMMM ! GHGFMFFFFFFFFFFG ! HFMHGHFFFMMMMMMF ! FFFMFMGGMMMFFFFF ! FFFFFFMFMMFFFFFF ! FFFFFFFFFFFFFFFF ! FFFFMMMMMMMMMMFF ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 100 (explosion noxious 8) ! { ! MMMMGMMFFFFFFFMM ! MMFMMFMFFMFMFFMM ! GGMMFMMFFMFMFFMM ! MMMFFFMFFMFMFFMM ! MFFFFFMFFFMMFFMM ! MMGFFMMFFFMFFFMM ! MFFFMMFFFMMFFFMM ! MFMFFMFFFFFFFFMM ! FFMFFFFFFMFFFFMM ! MMMFFFFFFFFFFFMM ! MFFFFFFFFMFFFMMM ! FFFFFFFFMMMMMMMM ! FFFFFFMMMMFMMMMM ! FFFMMMFMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 101 (explosion muddy 0) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMJJJ ! MMMMMMJMMMJJJJJJ ! MMMMMMMMMJJJJJJJ ! MMMMMMMMMJJJJJJK ! MMMMMMMMJJJJKKKJ ! MMMJJJMJJJJKKKJJ ! MJMMMJJJJJJKJJJJ ! MMMMMJJJJJJKJJJJ ! MMMMJJJJJJJKJJJJ ! MMMMMMMKJJKKJJKK ! MMMMJJJJJJJJJJKK ! MMMJJJJKKJJJKKKK ! MMJJJJKKJJJJKKKK ! MMJJJKKJJJJJKKKK ! } ! # tile 102 (explosion muddy 1) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! JMMMMMMMMJJJJJJM ! JJJJJJKJJJJJJJJM ! JJJJJJKKKKKJJJJJ ! KKKJJJKJJJJJJJJJ ! JJJJJJKJJJJJJJJJ ! JJJJJJKJJJJJJJJK ! JJKKKKKKKKKKKJKK ! KKJJJKJKKKKKJJJJ ! KLKJKJKKKJKKKJJJ ! KCCJKKKJJKKKKKJJ ! KLKKKKKJKKKKJJJJ ! KKKKKJKKJKKKCJJJ ! KKKKKKKKJKJKJCJJ ! KCLKKKLCLLJJJJJJ ! } ! # tile 103 (explosion muddy 2) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMJMMMJMMM ! JJJJJMMMMMMMMMMM ! JJJJJJMMMJMMJMMM ! JJJJJJJMMMMMMMMM ! KKKKKKJJJJMMMMMM ! JJJJJKKJJJJMMMMM ! KKJJJJJJJJJJMMMM ! JJKJJKKKKJJJMMMM ! JJKJJJJJKJJJMMMM ! JJCJJKJJJJJJMJMM ! JJJKKKKKJJJJMMMM ! JJKJKKJKJJJJMMMM ! JKJJKKJKJJJJJMMM ! } ! # tile 104 (explosion muddy 3) ! { ! MMJJJKJKJJJKKKKK ! MMJJJKJJJJJKJCKK ! MMMJJKJJKKKKKKKJ ! MMMJJJJJJKKKKCCK ! MMJJJKJJKKJKKCJC ! MJJJKKKJKKKKCKJC ! MJJJKJJJKLKKCKKC ! MJJJKJJJKKKJJJJC ! MJJJKJJJKKKKCJLL ! MJJJKKJJKKKKCCLL ! MMJJJKKJJKKKCLLC ! MMMJJJKKKJCKCCCC ! MMMMJJJKKKCKKCKL ! MMMMMJJKKKKKLLJK ! MMJMJKKKJLCKKKCL ! MMMMJKKKKKKKKKCL ! } ! # tile 105 (explosion muddy 4) ! { ! JCLJJKKCCJCLJJJJ ! KLCLKKJKJJLCJLJK ! LJCKCLJKKLLLJJLK ! CJCCCLLLKKLLCJKK ! LLLCCLLLLCLLCKKJ ! LLCCKCCCLLLLJKKJ ! LLCLLLLLLLLLLJKK ! LCCLLLLLLLLLLLKK ! LLLLLLCCCCLLCLCL ! CLLLLLLLCLLLLLCL ! CLLCLCCCCCLLLLCJ ! CCCLCLCCCCLLLCCJ ! LLLLCLCCCLLLCCCC ! LCCCCLCCCLLLCCCJ ! LLLLCLCLCKCCCKCJ ! CCCCCLLLCCCKLLKK ! } ! # tile 106 (explosion muddy 5) ! { ! KKJJJKJKJKJJJJMM ! KKJJJJJKJKJJJJMM ! KKJJJJJKJKJJJJMM ! CKJJJJJKKKJJJJMM ! CKJJCJCJJKJJJJMM ! CKKKCKKJKKJJJMMM ! KKKJCKKJJJJJJMMM ! KCJJCJJJJJJJJMMM ! JJCKKKCJJJJJMMMM ! KKJJKCCJJKJMMMJM ! JKKKCCKKKKMMMMMM ! KJJJJCCJJKMMJMMM ! KKLJKCCKJJJMMMMM ! LKKKKKKJJJJJMMMM ! LJLKKKJJJJJJJMMM ! KKKKCCJJJJJJJJMM ! } ! # tile 107 (explosion muddy 6) ! { ! MMMMJKKKKKKKLKKC ! MMMMJKKKKKKKJLKK ! MJMMJJKKKCKKJKLK ! MMMJJJKJKKCKKJJC ! MMMJJJJKKJJCKKJK ! MMMJJJJKKKKCKKKJ ! MMMJJJJKKJKKLKKJ ! MMMJJJJJKJJJKKKK ! MMMJJJJJKKJJKKKK ! MMMMJJJJJJJJJKKK ! MMMMMJJJLJJJJJJJ ! MMMJMMJJJJJJJJJJ ! MMMMMMMMJJMJJJJJ ! MMMJMMMMMMMMJJJJ ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 108 (explosion muddy 7) ! { ! CCCLLLLLCLLLKLKK ! LLCCLLCCCCLKJKKK ! CCCCCCCCCCJKKJCC ! KCCLJKJJKLCJJKKK ! KKLLLLKJKKJJLCLJ ! LCCJCJCKLKLKCJJK ! JKKCCJJLKKKKKKKC ! LJKKKKKKKJKKKKKK ! CLCJKJJJJJJJJJJC ! LJKLCLJJJKKKKKKJ ! JJJKJKCCKKKJJJJJ ! JJJJJJKJKKJJJJJJ ! JJJJJJJJJJJJJJJJ ! JJJJMMMMMMMMMMJJ ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 109 (explosion muddy 8) ! { ! KKKKCKKJJJJJJJMM ! KKJKKJKJJKJKJJMM ! CCKKJKKJJKJKJJMM ! KKKJJJKJJKJKJJMM ! KJJJJJKJJJKKJJMM ! KKCJJKKJJJKJJJMM ! KJJJKKJJJKKJJJMM ! KJKJJKJJJJJJJJMM ! JJKJJJJJJKJJJJMM ! KKKJJJJJJJJJJJMM ! KJJJJJJJJMJJJMMM ! JJJJJJJJMMMMMMMM ! JJJJJJMMMMJMMMMM ! JJJMMMJMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 110 (explosion wet 0) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMEEE ! MMMMMMEMMMEEEEEE ! MMMMMMMMMEEEEEEE ! MMMMMMMMMEEEEEEP ! MMMMMMMMEEEEPPPE ! MMMEEEMEEEEPPPEE ! MEMMMEEEEEEPEEEE ! MMMMMEEEEEEPEEEE ! MMMMEEEEEEEPEEEE ! MMMMMMMPEEPPEEPP ! MMMMEEEEEEEEEEPP ! MMMEEEEPPEEEPPPP ! MMEEEEPPEEEEPPPP ! MMEEEPPEEEEEPPPP ! } ! # tile 111 (explosion wet 1) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! EMMMMMMMMEEEEEEM ! EEEEEEPEEEEEEEEM ! EEEEEEPPPPPEEEEE ! PPPEEEPEEEEEEEEE ! EEEEEEPEEEEEEEEE ! EEEEEEPEEEEEEEEP ! EEPPPPPPPPPPPEPP ! PPEEEPEPPPPPEEEE ! PNPEPEPPPEPPPEEE ! PBBEPPPEEPPPPPEE ! PNPPPPPEPPPPEEEE ! PPPPPEPPEPPPBEEE ! PPPPPPPPEPEPEBEE ! PBNPPPNBEEEEEEEE ! } ! # tile 112 (explosion wet 2) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMEMMMEMMM ! EEEEEMMMMMMMMMMM ! EEEEEEMMMEMMEMMM ! EEEEEEEMMMMMMMMM ! PPPPPPEEEEMMMMMM ! EEEEEPPEEEEMMMMM ! PPEEEEEEEEEEMMMM ! EEPEEPPPPEEEMMMM ! EEPEEEEEPEEEMMMM ! EEBEEPEEEEEEMEMM ! EEEPPPPPEEEEMMMM ! EEPEPPEPEEEEMMMM ! EPEEPPEPEEEEEMMM ! } ! # tile 113 (explosion wet 3) ! { ! MMEEEPEPEEEPPPPP ! MMEEEPEEEEEPEBPP ! MMMEEPEEPPPPPPPE ! MMMEEEEEEPPPPBBP ! MMEEEPEEPPEPPBEB ! MEEEPPPEPPPPBPEB ! MEEEPEEEPNPPBPPB ! MEEEPEEEPPPEEEEB ! MEEEPEEEPPPPBEEE ! MEEEPPEEPPPPBBEE ! MMEEEPPEEPPPBEEB ! MMMEEEPPPEBPBBBB ! MMMMEEEPPPBPPBPN ! MMMMMEEPPPPPNNEP ! MMEMEPPPENBPPPBE ! MMMMEPPPPPPPPPBE ! } ! # tile 114 (explosion wet 4) ! { ! EBNEEPPBBEBNEEEE ! PNBNPPEPEEEBENEP ! NEBPBEEPPEEEEENP ! BEBBBEEEPPEEBEPP ! EEEBBEEEEBEEBPPE ! EEBBPBBBEEEEEPPE ! EEBEEEEEEEEEEEPP ! EBBEEEEEEEEEEEPP ! EEEEEEEEEEEEBEEE ! BEEEEEEEEEEEEEEE ! BEEBEBEEEEEEEEBE ! BBEEEEEEEEEEEBBE ! EEEEEEEEEEEEBBBB ! EBBEBEEEEEEEBBBE ! EEEEEEEEEPBBBPBE ! BBBBEEEEBBBPNNPP ! } ! # tile 115 (explosion wet 5) ! { ! PPEEEPEPEPEEEEMM ! PPEEEEEPEPEEEEMM ! PPEEEEEPEPEEEEMM ! BPEEEEEPPPEEEEMM ! BPEEBEBEEPEEEEMM ! BPPPBPPEPPEEEMMM ! PPPEBPPEEEEEEMMM ! PBEEBEEEEEEEEMMM ! EEBPPPBEEEEEMMMM ! PPEEPBBEEPEMMMEM ! EPPPBBPPPPMMMMMM ! PEEEEBBEEPMMEMMM ! PPNEPBBPEEEMMMMM ! NPPPPPPEEEEEMMMM ! NENPPPEEEEEEEMMM ! PPPPBBEEEEEEEEMM ! } ! # tile 116 (explosion wet 6) ! { ! MMMMEPPPPPPPNPPB ! MMMMEPPPPPPPENPP ! MEMMEEPPPBPPEPNP ! MMMEEEPEPPBPPEEB ! MMMEEEEPPEEBPPEP ! MMMEEEEPPPPBPPPE ! MMMEEEEPPEPPNPPE ! MMMEEEEEPEEEPPPP ! MMMEEEEEPPEEPPPP ! MMMMEEEEEEEEEPPP ! MMMMMEEENEEEEEEE ! MMMEMMEEEEEEEEEE ! MMMMMMMMEEMEEEEE ! MMMEMMMMMMMMEEEE ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 117 (explosion wet 7) ! { ! BBBEEEEEBEEEPEPP ! EEBBEEBBBBEPEPPP ! BBBBBBBBBBEPPEBB ! PBBEEPEEPNBEEPPP ! PPEEEEPEPPEENBNE ! NBBEBEBPNPNPBEEP ! EPPBBEENPPPPPPPB ! NEPPPPPPPEPPPPPP ! BNBEPEEEEEEEEEEB ! NEPNBNEEEPPPPPPE ! EEEPEPBBPPPEEEEE ! EEEEEEPEPPEEEEEE ! EEEEEEEEEEEEEEEE ! EEEEMMMMMMMMMMEE ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 118 (explosion wet 8) ! { ! PPPPBPPEEEEEEEMM ! PPEPPEPEEPEPEEMM ! BBPPEPPEEPEPEEMM ! PPPEEEPEEPEPEEMM ! PEEEEEPEEEPPEEMM ! PPBEEPPEEEPEEEMM ! PEEEPPEEEPPEEEMM ! PEPEEPEEEEEEEEMM ! EEPEEEEEEPEEEEMM ! PPPEEEEEEEEEEEMM ! PEEEEEEEEMEEEMMM ! EEEEEEEEMMMMMMMM ! EEEEEEMMMMEMMMMM ! EEEMMMEMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 119 (explosion magical 0) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMEEE ! MMMMMMEMMMEEEEEE ! MMMMMMMMMEEEEEEE ! MMMMMMMMMEEEEEEC ! MMMMMMMMEEEEIIIE ! MMMEEEMEEEEIIIEE ! MEMMMEEEEEEIEEEE ! MMMMMEEEEEEIEEEE ! MMMMEEEEEEEIEEEE ! MMMMMMMIEEIIEEII ! MMMMEEEEEEEEEEII ! MMMEEEEIIEEEIIII ! MMEEEEIIEEEEIIII ! MMEEEIIEEEEEIIII ! } ! # tile 120 (explosion magical 1) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! EMMMMMMMMEEEEEEM ! EEEEEEIEEEEEEEEM ! EEEEEEIIIIIEEEEE ! IIIEEEIEEEEEEEEE ! EEEEEEIEEEEEEEEE ! EEEEEEIEEEEEEEEI ! EEIIIIIIIIIIIEII ! IIEEEIEIIIIIEEEE ! IHIEIEIIIEIIIEEE ! ILLEIIIEEIIIIIEE ! IHIIIIIEIIIIEEEE ! IIIIIEIIEIIILEEE ! IIIIIIIIEIEIELEE ! ILHIIIHLHHEEEEEE ! } ! # tile 121 (explosion magical 2) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMEMMMEMMM ! EEEEEMMMMMMMMMMM ! EEEEEEMMMEMMEMMM ! EEEEEEEMMMMMMMMM ! IIIIIIEEEEMMMMMM ! EEEEEIIEEEEMMMMM ! IIEEEEEEEEEEMMMM ! EEIEEIIIIEEEMMMM ! EEIEEEEEIEEEMMMM ! EELEEIEEEEEEMEMM ! EEEIIIIIEEEEMMMM ! EEIEIIEIEEEEMMMM ! EIEEIIEIEEEEEMMM ! } ! # tile 122 (explosion magical 3) ! { ! MMEEEIEIEEEIIIII ! MMEEEIEEEEEIEIII ! MMMEEIEEIIIIIIIE ! MMMEEEEEEIIIIIII ! MMEEEIEEIIEIIIEI ! MEEEIIIEIIIIIIEI ! MEEEIEEEINIIIIII ! MEEEIEEEIIIEEEEI ! MEEEIEEEIIIIIENN ! MEEEIIEEIIIIIINN ! MMEEEIIEEIIIINNI ! MMMEEEIIIEIIIIII ! MMMMEEEIIIIIIIIN ! MMMMMEEIIIIINNEI ! MMEMEIIIENIIIIIN ! MMMMEIIIIIIIIIIN ! } ! # tile 123 (explosion magical 4) ! { ! EINEEIIIIEINEEEE ! ININIIEIEENIENEI ! NEIIINEIINNNEENI ! IEIIINNNIINNIEII ! NNNIINNNNINNIIIE ! NNIIIIIINNNNEIIE ! NNINNNNNNNNNNEII ! NIINNNNNNNNNNNII ! NNNNNNNNNNNNINNN ! INNNNNNNNNNNNNNN ! INNININNNNNNNNIE ! IINNNNNNNNNNNIIE ! NNNNNNNNNNNNIIII ! NIININNNNNNNIIIE ! NNNNNNNNNIIIIIIE ! IIIINNNNIIIINNII ! } ! # tile 124 (explosion magical 5) ! { ! IIEEEIEIEIEEEEMM ! IIEEEEEIEIEEEEMM ! IIEEEEEIEIEEEEMM ! IIEEEEEIIIEEEEMM ! IIEEIEIEEIEEEEMM ! IIIIIIIEIIEEEMMM ! IIIEIIIEEEEEEMMM ! IIEEIEEEEEEEEMMM ! EEIIIIIEEEEEMMMM ! IIEEIIIEEIEMMMEM ! EIIIIIIIIIMMMMMM ! IEEEEIIEEIMMEMMM ! IINEIIIIEEEMMMMM ! NIIIIIIEEEEEMMMM ! NENIIIEEEEEEEMMM ! IIIIIIEEEEEEEEMM ! } ! # tile 125 (explosion magical 6) ! { ! MMMMEIIIIIIIHIII ! MMMMEIIIIIIIEHII ! MEMMEEIIIIIIEIHI ! MMMEEEIEIIIIIEEI ! MMMEEEEIIEEIIIEI ! MMMEEEEIIIIIIIIE ! MMMEEEEIIEIIHIIE ! MMMEEEEEIEEEIIII ! MMMEEEEEIIEEIIII ! MMMMEEEEEEEEEIII ! MMMMMEEEHEEEEEEE ! MMMEMMEEEEEEEEEE ! MMMMMMMMEEMEEEEE ! MMMEMMMMMMMMEEEE ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 126 (explosion magical 7) ! { ! IIINNNNNINNNINII ! NNIINNIIIINIEIII ! IIIIIIIIIIEIIEII ! IIINEIEEINIEEIII ! IINNNNIEIIEENINE ! NIIEIEIININIIEEI ! EIIIIEENIIIIIIII ! NEIIIIIIIEIIIIII ! INIEIEEEEEEEEEEI ! NEININEEEIIIIIIE ! EEEIEIIIIIIEEEEE ! EEEEEEIEIIEEEEEE ! EEEEEEEEEEEEEEEE ! EEEEMMMMMMMMMMEE ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 127 (explosion magical 8) ! { ! IIIIIIIEEEEEEEMM ! IIEIIEIEEIEIEEMM ! IIIIEIIEEIEIEEMM ! IIIEEEIEEIEIEEMM ! IEEEEEIEEEIIEEMM ! IIIEEIIEEEIEEEMM ! IEEEIIEEEIIEEEMM ! IEIEEIEEEEEEEEMM ! EEIEEEEEEIEEEEMM ! IIIEEEEEEEEEEEMM ! IEEEEEEEEMEEEMMM ! EEEEEEEEMMMMMMMM ! EEEEEEMMMMEMMMMM ! EEEMMMEMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 128 (explosion fiery 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 1610,1616 **** MMDDDDCCDDDDCCCC MMDDDCCDDDDDCCCC } ! # tile 84 (cmap 84) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2465,2471 ---- MMDDDDCCDDDDCCCC MMDDDCCDDDDDCCCC } ! # tile 129 (explosion fiery 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 1629,1635 **** CCCCCCCCDCDCDLDD CLHCCCHLHHDDDDDD } ! # tile 85 (cmap 85) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2484,2490 ---- CCCCCCCCDCDCDLDD CLHCCCHLHHDDDDDD } ! # tile 130 (explosion fiery 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 1648,1654 **** DDCDCCDCDDDDMMMM DCDDCCDCDDDDDMMM } ! # tile 86 (cmap 86) { MMDDDCDCDDDCCCCC MMDDDCDDDDDCDLCC --- 2503,2509 ---- DDCDCCDCDDDDMMMM DCDDCCDCDDDDDMMM } ! # tile 131 (explosion fiery 3) { MMDDDCDCDDDCCCCC MMDDDCDDDDDCDLCC *************** *** 1667,1673 **** MMDMDCCCDHLCCCLH MMMMDCCCCCCCCCLH } ! # tile 87 (cmap 87) { DLHDDCCLLDLHDDDD CHLHCCDCDDHLDHDC --- 2522,2528 ---- MMDMDCCCDHLCCCLH MMMMDCCCCCCCCCLH } ! # tile 132 (explosion fiery 4) { DLHDDCCLLDLHDDDD CHLHCCDCDDHLDHDC *************** *** 1686,1692 **** HHHHNHNHNCLLLCLD LLLLNHHHLLLCHHCC } ! # tile 88 (cmap 88) { CCDDDCDCDCDDDDMM CCDDDDDCDCDDDDMM --- 2541,2547 ---- HHHHNHNHNCLLLCLD LLLLNHHHLLLCHHCC } ! # tile 133 (explosion fiery 5) { CCDDDCDCDCDDDDMM CCDDDDDCDCDDDDMM *************** *** 1705,1711 **** HDHCCCDDDDDDDMMM CCCCLLDDDDDDDDMM } ! # tile 89 (cmap 89) { MMMMDCCCCCCCHCCL MMMMDCCCCCCCDHCC --- 2560,2566 ---- HDHCCCDDDDDDDMMM CCCCLLDDDDDDDDMM } ! # tile 134 (explosion fiery 6) { MMMMDCCCCCCCHCCL MMMMDCCCCCCCDHCC *************** *** 1724,1730 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 90 (cmap 90) { LLLHHHHHLHHHCHCC HHLLHHLLLLHCDCCC --- 2579,2585 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 135 (explosion fiery 7) { LLLHHHHHLHHHCHCC HHLLHHLLLLHCDCCC *************** *** 1743,1749 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 91 (cmap 91) { CCCCLCCDDDDDDDMM CCDCCDCDDCDCDDMM --- 2598,2604 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 136 (explosion fiery 8) { CCCCLCCDDDDDDDMM CCDCCDCDDCDCDDMM *************** *** 1762,1768 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 92 (zap 0 0) { MMMMMMMIIMMMMMMM MMMMMMIIIIMMMMMM --- 2617,2794 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 137 (explosion frosty 0) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMEEE ! MMMMMNEMMMEEEEEE ! MMNMMMNMMENBEEEE ! MNMNMNMMMEEEEEEP ! MMMMNMMMEEEEPPPE ! MMMNENMNEEEPPPEE ! MENMMENEEEEPNBEE ! MMMNMEEEEEEPEEEE ! MMMMEENBEEEPEEEE ! MMMMMMMPEEPPEEPP ! MMMMEEEEEEEEEEPP ! MMMEEEEPPEEEPPPP ! MMEEEEPPNBEEPPPP ! MMEEEPPEEEEEPPPP ! } ! # tile 138 (explosion frosty 1) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! EMMMMMMMMEEEEEEM ! ENBEENPEEEENBEEM ! EEEEEENPNPNEEEEE ! PPBEEEPENEEEEEEE ! EEEEEENNNNNEEEEE ! EEEEEEPENEEENBEP ! EEPPPPNPNPNPPPPP ! PPEEENEPPPPNEEEE ! PNPEPEPPPEPPPEEE ! PBBEPPPEEPPNBPEE ! PNPPPPPEPPPPEEEE ! PPPPPEPPEPPPBEEE ! PPPPPPPPEPEPEBEE ! PBNPPPNBNNEEEEEE ! } ! # tile 139 (explosion frosty 2) ! { ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! MMMMMMMMEMMMEMMM ! EEEEEMMMMMMMMMMM ! EEEEEEMMMEMMNMMM ! EEEEEEENMMNNMMMM ! PPPPPPENENMMMMMM ! EEEEEPPENENMNMMM ! PPEEEEEEEEENMNMM ! EEPEEPPPPNNEMNMM ! EEPEEEEENEEEMMMM ! EEBEEPEEEEEEMEMM ! EEEPPPPPEEEEMMMM ! EEPEPPEPEEEEMMMM ! EPEEPPEPEEEEEMMM ! } ! # tile 140 (explosion frosty 3) ! { ! MMEEEPEPEEEPPPPP ! MMEEEPEEEEEPEBPP ! MMMEEPEEPPPPPPPE ! MMMENENEEPPPPBBP ! MMEEENEEPPEPPBEB ! MEEENENEPPPPBPEB ! MEEEPEEEPNPPBPPB ! MEEEPEEEPPPEEEEB ! MEEEPEEEPPPPBENN ! MEEEPPEEPPPPBBNN ! MMEEEPNEEPPPBNNB ! MMMEENNNPEBPBBBB ! MMMMEENPPPBPPBPN ! MMMMMEEPPPPPNNEP ! MMEMEPPPENBPPPBN ! MMMMEPPPPPPPPPBN ! } ! # tile 141 (explosion frosty 4) ! { ! EBNEEPPBBEBNEEEE ! PNBNPPEPEENBENEP ! NEBPBNEPPNNNEENP ! BEBBBNNNPPNNBEPP ! NNNBBNNNNBNNBPPE ! NNBBPBBBNNNNEPPE ! NNBNNNNNNNNNNEPP ! NBBNNNNNNNNNNNPP ! NNNNNNNNNNNNBNNN ! BNNNNNNNNNNNNNNN ! BNNBNBNNNNNNNNBE ! BBNNNNNNNNNNNBBE ! NNNNNNNNNNNNBBBB ! NBBNBNNNNNNNBBBE ! NNNNNNNNNPBBBPBE ! BBBBNNNNBBBPNNPP ! } ! # tile 142 (explosion frosty 5) ! { ! PPEEEPEPEPEEEEMM ! PPEEEEEPEPEEEEMM ! PPEEEEEPEPEEEEMM ! BPEEEEEPPPEEEEMM ! BPEEBEBEEPEEEEMM ! BPPPBPPEPPEEEMMM ! PPPEBPPENEEENMMM ! PBEEBEEEENENEMMM ! EEBPPPBNNNNNNNMM ! PPEEPBBEENENMMEM ! EPPPBBPPNPMMNMMM ! PEEEEBBEEPMMEMMM ! PPNEPBBPEEEMMMMM ! NPPPPPPEEEEEMMMM ! NENPPPEEEEEEEMMM ! PPPPBBEEEEEEEEMM ! } ! # tile 143 (explosion frosty 6) ! { ! MMMMEPPPPPPPNPPB ! MMMMEPPPPPPPENPP ! MEMMEEPPPBPPEPNP ! MMMEEEPEPPBPPEEB ! MMMEENEPPEEBPPEP ! MMMNEEENPPPBPPPE ! MMNENPNPNEPPNPPE ! MMMNNENNPEEEPPPP ! MNMPEEEPPNEEPPPP ! MMMNNENNEEEEEPPP ! MMNMNPNENEEEEEEE ! MMMNMMENEEEEEEEE ! MMMMMNMMEEMEEEEE ! MMMEMMMMMMMMEEEE ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 144 (explosion frosty 7) ! { ! BBBNNNNNBNNNPNPP ! NNBBNNBBBBNPEPPP ! BBBBBBBBBBEPPEBB ! PBBNEPEEPNBEEPPP ! PPNNNNPEPPEENBNE ! NBBEBEBPNPNPBEEP ! EPPBBEENPPPPPPPB ! NEPPPPPPPEPPPPPP ! BNBEPEEEEEEEEEEB ! NEPNBNEEEPNENPPE ! EEEPEPBBPPPNEEEE ! EEEEEEPEPNNNNNEE ! EEEEEEEEEEENEEEE ! EEEEMMMMMMNMNMEE ! MMMMMMMMMMMMMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 145 (explosion frosty 8) ! { ! PPPPBPPEEEEEEEMM ! PPEPPEPEEPEPEEMM ! BBPPEPPEEPEPNENM ! PPPEEEPEEPEPENMM ! PEEEEEPEEEPPNENM ! PPBEEPNENEPEEEMM ! PEEEPPENEPPEEEMM ! PEPEENNNNNEEEEMM ! EEPEEEENEPEEEEMM ! PPPEEENENEEEEEMM ! PEEEEEEEEMEEEMMM ! EEEEEEEEMMMMMMMM ! EEEEEEMMMMENMMMM ! EEEMMMEMMMNMNMMM ! MMMMMMMMMMMNMMMM ! MMMMMMMMMMMMMMMM ! } ! # tile 146 (zap 0 0) { MMMMMMMIIMMMMMMM MMMMMMIIIIMMMMMM *************** *** 1781,1787 **** MMMMMMIIIIMMMMMM MMMMMMMIIMMMMMMM } ! # tile 93 (zap 0 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2807,2813 ---- MMMMMMIIIIMMMMMM MMMMMMMIIMMMMMMM } ! # tile 147 (zap 0 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 1800,1806 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 94 (zap 0 2) { IIIMMMMMMMMMMMMM IIIIMMMMMMMMMMMM --- 2826,2832 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 148 (zap 0 2) { IIIMMMMMMMMMMMMM IIIIMMMMMMMMMMMM *************** *** 1819,1825 **** MMMMMMMMMMMMIIII MMMMMMMMMMMMMIII } ! # tile 95 (zap 0 3) { MMMMMMMMMMMMMIII MMMMMMMMMMMMIIII --- 2845,2851 ---- MMMMMMMMMMMMIIII MMMMMMMMMMMMMIII } ! # tile 149 (zap 0 3) { MMMMMMMMMMMMMIII MMMMMMMMMMMMIIII *************** *** 1838,1844 **** IIIIMMMMMMMMMMMM IIIMMMMMMMMMMMMM } ! # tile 96 (zap 1 0) { MMMMMMMCCMMMMMMM MMMMMMCCCCMMMMMM --- 2864,2870 ---- IIIIMMMMMMMMMMMM IIIMMMMMMMMMMMMM } ! # tile 150 (zap 1 0) { MMMMMMMCCMMMMMMM MMMMMMCCCCMMMMMM *************** *** 1857,1863 **** MMMMMMCCCCMMMMMM MMMMMMMCCMMMMMMM } ! # tile 97 (zap 1 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2883,2889 ---- MMMMMMCCCCMMMMMM MMMMMMMCCMMMMMMM } ! # tile 151 (zap 1 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 1876,1882 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 98 (zap 1 2) { CCCMMMMMMMMMMMMM CCCCMMMMMMMMMMMM --- 2902,2908 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 152 (zap 1 2) { CCCMMMMMMMMMMMMM CCCCMMMMMMMMMMMM *************** *** 1895,1901 **** MMMMMMMMMMMMCCCC MMMMMMMMMMMMMCCC } ! # tile 99 (zap 1 3) { MMMMMMMMMMMMMCCC MMMMMMMMMMMMCCCC --- 2921,2927 ---- MMMMMMMMMMMMCCCC MMMMMMMMMMMMMCCC } ! # tile 153 (zap 1 3) { MMMMMMMMMMMMMCCC MMMMMMMMMMMMCCCC *************** *** 1914,1920 **** CCCCMMMMMMMMMMMM CCCMMMMMMMMMMMMM } ! # tile 100 (zap 2 0) { MMMMMMMNNMMMMMMM MMMMMMNNNNMMMMMM --- 2940,2946 ---- CCCCMMMMMMMMMMMM CCCMMMMMMMMMMMMM } ! # tile 154 (zap 2 0) { MMMMMMMNNMMMMMMM MMMMMMNNNNMMMMMM *************** *** 1933,1939 **** MMMMMMNNNNMMMMMM MMMMMMMNNMMMMMMM } ! # tile 101 (zap 2 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 2959,2965 ---- MMMMMMNNNNMMMMMM MMMMMMMNNMMMMMMM } ! # tile 155 (zap 2 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 1952,1958 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 102 (zap 2 2) { NNNMMMMMMMMMMMMM NNNNMMMMMMMMMMMM --- 2978,2984 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 156 (zap 2 2) { NNNMMMMMMMMMMMMM NNNNMMMMMMMMMMMM *************** *** 1971,1977 **** MMMMMMMMMMMMNNNN MMMMMMMMMMMMMNNN } ! # tile 103 (zap 2 3) { MMMMMMMMMMMMMNNN MMMMMMMMMMMMNNNN --- 2997,3003 ---- MMMMMMMMMMMMNNNN MMMMMMMMMMMMMNNN } ! # tile 157 (zap 2 3) { MMMMMMMMMMMMMNNN MMMMMMMMMMMMNNNN *************** *** 1990,1996 **** NNNNMMMMMMMMMMMM NNNMMMMMMMMMMMMM } ! # tile 104 (zap 3 0) { MMMMMMMBBMMMMMMM MMMMMMBBBBMMMMMM --- 3016,3022 ---- NNNNMMMMMMMMMMMM NNNMMMMMMMMMMMMM } ! # tile 158 (zap 3 0) { MMMMMMMBBMMMMMMM MMMMMMBBBBMMMMMM *************** *** 2009,2015 **** MMMMMMBBBBMMMMMM MMMMMMMBBMMMMMMM } ! # tile 105 (zap 3 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3035,3041 ---- MMMMMMBBBBMMMMMM MMMMMMMBBMMMMMMM } ! # tile 159 (zap 3 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2028,2034 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 106 (zap 3 2) { BBBMMMMMMMMMMMMM BBBBMMMMMMMMMMMM --- 3054,3060 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 160 (zap 3 2) { BBBMMMMMMMMMMMMM BBBBMMMMMMMMMMMM *************** *** 2047,2053 **** MMMMMMMMMMMMBBBB MMMMMMMMMMMMMBBB } ! # tile 107 (zap 3 3) { MMMMMMMMMMMMMBBB MMMMMMMMMMMMBBBB --- 3073,3079 ---- MMMMMMMMMMMMBBBB MMMMMMMMMMMMMBBB } ! # tile 161 (zap 3 3) { MMMMMMMMMMMMMBBB MMMMMMMMMMMMBBBB *************** *** 2066,2072 **** BBBBMMMMMMMMMMMM BBBMMMMMMMMMMMMM } ! # tile 108 (zap 4 0) { MMMMMMMAAMMMMMMM MMMMMMAAAAMMMMMM --- 3092,3098 ---- BBBBMMMMMMMMMMMM BBBMMMMMMMMMMMMM } ! # tile 162 (zap 4 0) { MMMMMMMAAMMMMMMM MMMMMMAAAAMMMMMM *************** *** 2085,2091 **** MMMMMMAAAAMMMMMM MMMMMMMAAMMMMMMM } ! # tile 109 (zap 4 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3111,3117 ---- MMMMMMAAAAMMMMMM MMMMMMMAAMMMMMMM } ! # tile 163 (zap 4 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2104,2110 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 110 (zap 4 2) { AAAMMMMMMMMMMMMM AAAAMMMMMMMMMMMM --- 3130,3136 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 164 (zap 4 2) { AAAMMMMMMMMMMMMM AAAAMMMMMMMMMMMM *************** *** 2123,2129 **** MMMMMMMMMMMMAAAA MMMMMMMMMMMMMAAA } ! # tile 111 (zap 4 3) { MMMMMMMMMMMMMAAA MMMMMMMMMMMMAAAA --- 3149,3155 ---- MMMMMMMMMMMMAAAA MMMMMMMMMMMMMAAA } ! # tile 165 (zap 4 3) { MMMMMMMMMMMMMAAA MMMMMMMMMMMMAAAA *************** *** 2142,2148 **** AAAAMMMMMMMMMMMM AAAMMMMMMMMMMMMM } ! # tile 112 (zap 5 0) { MMMMMMMNNMMMMMMM MMMMMMNNNNMMMMMM --- 3168,3174 ---- AAAAMMMMMMMMMMMM AAAMMMMMMMMMMMMM } ! # tile 166 (zap 5 0) { MMMMMMMNNMMMMMMM MMMMMMNNNNMMMMMM *************** *** 2161,2167 **** MMMMMMNNNNMMMMMM MMMMMMMNNMMMMMMM } ! # tile 113 (zap 5 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3187,3193 ---- MMMMMMNNNNMMMMMM MMMMMMMNNMMMMMMM } ! # tile 167 (zap 5 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2180,2186 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 114 (zap 5 2) { NNNMMMMMMMMMMMMM NNNNMMMMMMMMMMMM --- 3206,3212 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 168 (zap 5 2) { NNNMMMMMMMMMMMMM NNNNMMMMMMMMMMMM *************** *** 2199,2205 **** MMMMMMMMMMMMNNNN MMMMMMMMMMMMMNNN } ! # tile 115 (zap 5 3) { MMMMMMMMMMMMMNNN MMMMMMMMMMMMNNNN --- 3225,3231 ---- MMMMMMMMMMMMNNNN MMMMMMMMMMMMMNNN } ! # tile 169 (zap 5 3) { MMMMMMMMMMMMMNNN MMMMMMMMMMMMNNNN *************** *** 2218,2224 **** NNNNMMMMMMMMMMMM NNNMMMMMMMMMMMMM } ! # tile 116 (zap 6 0) { MMMMMMMFFMMMMMMM MMMMMMFFFFMMMMMM --- 3244,3250 ---- NNNNMMMMMMMMMMMM NNNMMMMMMMMMMMMM } ! # tile 170 (zap 6 0) { MMMMMMMFFMMMMMMM MMMMMMFFFFMMMMMM *************** *** 2237,2243 **** MMMMMMFFFFMMMMMM MMMMMMMFFMMMMMMM } ! # tile 117 (zap 6 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3263,3269 ---- MMMMMMFFFFMMMMMM MMMMMMMFFMMMMMMM } ! # tile 171 (zap 6 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2256,2262 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 118 (zap 6 2) { FFFMMMMMMMMMMMMM FFFFMMMMMMMMMMMM --- 3282,3288 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 172 (zap 6 2) { FFFMMMMMMMMMMMMM FFFFMMMMMMMMMMMM *************** *** 2275,2281 **** MMMMMMMMMMMMFFFF MMMMMMMMMMMMMFFF } ! # tile 119 (zap 6 3) { MMMMMMMMMMMMMFFF MMMMMMMMMMMMFFFF --- 3301,3307 ---- MMMMMMMMMMMMFFFF MMMMMMMMMMMMMFFF } ! # tile 173 (zap 6 3) { MMMMMMMMMMMMMFFF MMMMMMMMMMMMFFFF *************** *** 2294,2300 **** FFFFMMMMMMMMMMMM FFFMMMMMMMMMMMMM } ! # tile 120 (zap 7 0) { MMMMMMMGGMMMMMMM MMMMMMGGGGMMMMMM --- 3320,3326 ---- FFFFMMMMMMMMMMMM FFFMMMMMMMMMMMMM } ! # tile 174 (zap 7 0) { MMMMMMMGGMMMMMMM MMMMMMGGGGMMMMMM *************** *** 2313,2319 **** MMMMMMGGGGMMMMMM MMMMMMMGGMMMMMMM } ! # tile 121 (zap 7 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3339,3345 ---- MMMMMMGGGGMMMMMM MMMMMMMGGMMMMMMM } ! # tile 175 (zap 7 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2332,2338 **** MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 122 (zap 7 2) { GGGMMMMMMMMMMMMM GGGGMMMMMMMMMMMM --- 3358,3364 ---- MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 176 (zap 7 2) { GGGMMMMMMMMMMMMM GGGGMMMMMMMMMMMM *************** *** 2351,2357 **** MMMMMMMMMMMMGGGG MMMMMMMMMMMMMGGG } ! # tile 123 (zap 7 3) { MMMMMMMMMMMMMGGG MMMMMMMMMMMMGGGG --- 3377,3383 ---- MMMMMMMMMMMMGGGG MMMMMMMMMMMMMGGG } ! # tile 177 (zap 7 3) { MMMMMMMMMMMMMGGG MMMMMMMMMMMMGGGG *************** *** 2370,2376 **** GGGGMMMMMMMMMMMM GGGMMMMMMMMMMMMM } ! # tile 124 (warning 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3396,3402 ---- GGGGMMMMMMMMMMMM GGGMMMMMMMMMMMMM } ! # tile 178 (warning 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2389,2395 **** MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 125 (warning 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3415,3421 ---- MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 179 (warning 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2408,2414 **** MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 126 (warning 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3434,3440 ---- MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 180 (warning 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2427,2433 **** MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 127 (warning 3) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3453,3459 ---- MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 181 (warning 3) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2446,2452 **** MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 128 (warning 4) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3472,3478 ---- MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 182 (warning 4) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2465,2471 **** MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 129 (warning 5) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM --- 3491,3497 ---- MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 183 (warning 5) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM *************** *** 2484,2699 **** MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 130 (sub mine walls 0) { ! ANNLAJKKKKKJNNLA ! ALLLAJKJKKJJLLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! ALLLAJJKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKJKJLKJA ! ANNLAJKKKKKJNNLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! ALLLAJJKJKJJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA ! } ! # tile 131 (sub mine walls 1) ! { ! AAANLLAAAAANLLAA ! LLLNLLAJLLLNLLAJ ! KLLJJJAJKLLJJJAJ ! JJJJJJJJJJJJJJJJ ! KKJJJKKKKKJJJKKK ! KKNLLKKKKKNLLKKK ! LLNLLAJLLLNLLAJL ! LLJJJAJKLLJJJAJK ! JJJJJJJJJJJJJJJJ ! KKJLKKKKJLKKKJLK ! KKJKKKKKJKKKKJKK ! JJJJJJJJJJJJJJJJ ! JLKKKKJLKKKKJLKK ! JKKKKKJKKKKKJKKK ! JJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 132 (sub mine walls 2) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! AKKJJJJJJJJJKKKJ ! ALLLAAAAAAAALLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA ! } ! # tile 133 (sub mine walls 3) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! AKKJJJJJJJJJKKKJ ! ALLLAAAAAAAALLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA ! } ! # tile 134 (sub mine walls 4) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! KKJLKKKKJLKKKJLK ! KKJKKKKKJKKKKJKK ! JJJJJJJJJJJJJJJJ ! JLKKKKJLKKKKJLKK ! JKKKKKJKKKKKJKKK ! JJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 135 (sub mine walls 5) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! KKJLKKKKJLKKKJLK ! KKJKKKKKJKKKKJKK ! JJJJJJJJJJJJJJJJ ! JLKKKKJLKKKKJLKK ! JKKKKKJKKKKKJKKK ! JJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 136 (sub mine walls 6) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! AKKJJJJJJJJJKKKJ ! ALLLAAAAAAAALLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA ! } ! # tile 137 (sub mine walls 7) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! KKJLKKKKJLKKKJLK ! KKJKKKKKJKKKKJKK ! JJJJJJJJJJJJJJJJ ! JLKKKKJLKKKKJLKK ! JKKKKKJKKKKKJKKK ! JJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 138 (sub mine walls 8) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! AKKJJJJJJJJJKKKJ ! ALLLAAAAAAAALLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA ! } ! # tile 139 (sub mine walls 9) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! AKKJJJJJJJJJKKKJ ! ALLLAAAAAAAALLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA ! } ! # tile 140 (sub mine walls 10) ! { ! AAANNNNLLLLLLAAA ! NNNNAAJJKKKKLJJJ ! LLLNAJJKKKCCLJJJ ! LLLLLLLLLLLLLJJJ ! LLLKKKKKKKKKKJJJ ! LLLKKKKKKKKKKJJJ ! LLKKKKKKKKKKKKJJ ! LKKKKKKKKKKKKKKJ ! JJJJJJJJJJJJJJJJ ! AKKJJJJJJJJJKKKJ ! ALLLAAAAAAAALLLA ! ALLLAJKKKKKJLLLA ! ALLLAJKKKKKJLLLA ! AJAAAJJKKKKJJAJA ! AJJJAJJKKKKJJJJA ! ALKKAJJKKKKJLKJA } ! # tile 141 (sub gehennom walls 0) { ALLDAJMMMMMJLLDA ADDDAJMJMMJJDDDA --- 3510,3725 ---- MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ! # tile 184 (sub mine walls 0) { ! AJJKKKACJAAJJJAA ! AJKKKACLJJAJJJJA ! AJKKACLCKJJAJJJA ! AAKACLCKJJJJAAAA ! AAACLLKKJJJJJJAA ! AACLLKKKAAJJJJJA ! ACKKKKKACJAJJJJA ! AKKKKKACLJJAJJJA ! AAKKKACLKJJJAJAA ! AAKKACLKKJJJJJAA ! AACCCKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AAKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA ! } ! # tile 185 (sub mine walls 1) ! { ! AJAAAAAAJJAAAJAA ! JJJAAAJJJJJAAAAJ ! JJJACJAJJJACCJAJ ! AAACLJJAJACCLJJA ! AACLCKJJACCLCKJJ ! ACKCKKJJJCKCKKJA ! CJKKKKJJCKCKJJAC ! KJJKCJJCKKKJJJCK ! KJKKKJJKJKJJJJKK ! JJJKCJKKJKJJJCKJ ! JJJJJJKJKKJJJKKJ ! JJJJJKJJJJJJJJJJ ! JJJJJJJJJJJJJJJJ ! JJJJJJJJJJJJJJJJ ! JJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 186 (sub mine walls 2) ! { ! AAAAAAKCCKKJAAAA ! AAAAKKCLCJKJJAAA ! AAKKKCLCKJJJKKAA ! AKKKCLCKJJJJJJKA ! AKKCLLKKJJJJJJJA ! AKCLLKKKAAJJJJJJ ! ACKKKKKACJAJJJJJ ! AKKKKKACLJJAAJJJ ! AAKKKCLLKJJJAJAJ ! AAKKCCCKKJJJAJAA ! AACCKKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AAKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA ! } ! # tile 187 (sub mine walls 3) ! { ! AAAAAAKCCKKJAAAA ! AAAAKKCLCJKJJAAA ! AAKKKCLCKJJJKKAA ! AKKCCLCKJJJJJJKA ! KKCCLLKKJJJJJJJA ! KKCLKKKKAAJJJJJA ! KCLKKKKACJAJJJJA ! CKKKKKACLJJAAJJA ! KAKKKCLLKJJJAJAA ! AKKKCCCKKJJJAJAA ! AACCKKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AKKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA ! } ! # tile 188 (sub mine walls 4) ! { ! AKKKAAKKKKAAJJJA ! AKKAAKCCCJJJAAJA ! AKKAALLJJJACCJAA ! AKAACLJJJACCLJJA ! AAACCKJJACLLCKJJ ! AAACLKJJJCKCKKJA ! AACLKKJJCKCKJJAC ! AAKKCJJCKKKJJJCK ! ACKKKJJKJKJJJJKK ! ACKKCJKKJKJJJCKJ ! AKKKJJKJKKJJJKKJ ! ACKJJKJJJJJJJJJJ ! AKJJJJJJJJJJJJJJ ! AKJJJJJJJJJJJJJJ ! AJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 189 (sub mine walls 5) ! { ! AKKAAAKKAAAAJJJA ! AKAAKKLCKAAAAAJA ! AAKKCLCJJACCAJJA ! AKKCLJJJACCCLAJA ! AKCKKKJACCCLCAAA ! ACKKKKJACCKCKKAA ! CJKKKKACCKCKJJAA ! KJJKCJJCKKKJJJAA ! KJKKKJJKJKJJJJJA ! JJJKCJKKJKJJJJJA ! JJJJJJKJKKJJJJJA ! JJJJJKJJJJJJJJJA ! JJJJJJJJJJJJJJJA ! JJJJJJJJJJJJJJJA ! JJJJJJJJJJJJJJJA ! AAAAAAAAAAAAAAAA ! } ! # tile 190 (sub mine walls 6) ! { ! AAAAAAKCCKKJAAAA ! AAAAKCCLCJKJJAAA ! AAKKCCLCKJJJKKAA ! AKKKCLCKJJJJJJKA ! KKKCLKKKJJJJJJJA ! KKCLKKKKAAJJJJJJ ! KCKLKKKACJAJJJJJ ! CKKKKKACLJJAAJJJ ! KAKKKCLLKJJJAJAJ ! AKKKCCCKKJJJAJAA ! AACCKKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AKKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA ! } ! # tile 191 (sub mine walls 7) ! { ! AKKAAAKKKKAAJJJA ! AKAAKKLCCJJJAAJA ! AAKKCLCJJJACCJAA ! AKKCLJJJJACCLJJA ! AKCLCKJJACCLCKJJ ! ACKCKKJJJCKCKKJA ! CJKKKKJJCKCKJJAC ! KJJKCJJCKKKJJJCK ! KJKKKJJKJKJJJJKK ! JJJKCJKKJKJJJCKJ ! JJJJJJKJKKJJJKKJ ! JJJJJKJJJJJJJJJJ ! JJJJJJJJJJJJJJJJ ! JJJJJJJJJJJJJJJJ ! JJJJJJJJJJJJJJJJ ! AAAAAAAAAAAAAAAA ! } ! # tile 192 (sub mine walls 8) ! { ! AAAAAAKCCKKJAAAA ! AAAAKCCLCJKJJAAA ! AAKKKCLCKJJJKKAA ! AKKKCLCKJJJJJJKA ! KKCCLLKKJJJJJJJA ! KKCLLKKKAAJJJJJJ ! KCLLKKKACJAJJJJJ ! CKLKKKACLJJAAJJJ ! KAKKKCLLKJJJAJAJ ! AKKKCCCKKJJJAJAA ! AACCKKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AKKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA ! } ! # tile 193 (sub mine walls 9) ! { ! AKKAACKCCKKJAJJA ! AKACKKKLLJKJJAJA ! AAKKKCCCKJJJKKAA ! AKKKCCLKJJJJJJKA ! AKKCLLKKJJJJJJJA ! AKCLLKKKAAJJJJJJ ! ACLKKKKACJAJJJJJ ! AKKKKKACLJJAAJJJ ! AAKKKCLLKJJJAJAJ ! AAKKCCCKKJJJAJAA ! AACCKKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AAKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA ! } ! # tile 194 (sub mine walls 10) ! { ! AKKAACKCCKKJAJJA ! AKACKKCLCJKJJAJA ! AAKKCCLCKJJJKKAA ! AKKCLLCKJJJJJJKA ! KKCCLLKKJJJJJJJA ! KCKLLKKKAAJJJJJA ! CCKKKKKACJAJJJJA ! CKKKKKACLJJAAJJA ! KAKKKCLLKJJJAJAA ! AKKKCCCKKJJJAJAA ! AACCKKKAAJJJJJJA ! ACCKKKACJAJJJJJA ! ACKKKACLJJAJJJJA ! AKKKACLCKJJAJJAA ! AAJACKCKKJJJAJAA ! AAJCKKJAAAJJJJJA } ! # tile 195 (sub gehennom walls 0) { ALLDAJMMMMMJLLDA ADDDAJMJMMJJDDDA *************** *** 2712,2718 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 142 (sub gehennom walls 1) { AAALDDAAAAALDDAA DDDLDDAJDDDLDDAJ --- 3738,3744 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 196 (sub gehennom walls 1) { AAALDDAAAAALDDAA DDDLDDAJDDDLDDAJ *************** *** 2731,2737 **** JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 143 (sub gehennom walls 2) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3757,3763 ---- JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 197 (sub gehennom walls 2) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2750,2756 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 144 (sub gehennom walls 3) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3776,3782 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 198 (sub gehennom walls 3) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2769,2775 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 145 (sub gehennom walls 4) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3795,3801 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 199 (sub gehennom walls 4) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2788,2794 **** JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 146 (sub gehennom walls 5) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3814,3820 ---- JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 200 (sub gehennom walls 5) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2807,2813 **** JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 147 (sub gehennom walls 6) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3833,3839 ---- JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 201 (sub gehennom walls 6) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2826,2832 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 148 (sub gehennom walls 7) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3852,3858 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 202 (sub gehennom walls 7) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2845,2851 **** JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 149 (sub gehennom walls 8) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3871,3877 ---- JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } ! # tile 203 (sub gehennom walls 8) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2864,2870 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 150 (sub gehennom walls 9) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3890,3896 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 204 (sub gehennom walls 9) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2883,2889 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 151 (sub gehennom walls 10) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ --- 3909,3915 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 205 (sub gehennom walls 10) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ *************** *** 2902,2908 **** AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 152 (sub knox walls 0) { AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA --- 3928,3934 ---- AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } ! # tile 206 (sub knox walls 0) { AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA *************** *** 2921,2927 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 153 (sub knox walls 1) { AJAAAJAAAJAAAJAA JJJAAAJAJJJAAAJA --- 3947,3953 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 207 (sub knox walls 1) { AJAAAJAAAJAAAJAA JJJAAAJAJJJAAAJA *************** *** 2940,2946 **** KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 154 (sub knox walls 2) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 3966,3972 ---- KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 208 (sub knox walls 2) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 2959,2965 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 155 (sub knox walls 3) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 3985,3991 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 209 (sub knox walls 3) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 2978,2984 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 156 (sub knox walls 4) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4004,4010 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 210 (sub knox walls 4) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 2997,3003 **** KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 157 (sub knox walls 5) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4023,4029 ---- KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 211 (sub knox walls 5) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 3016,3022 **** KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 158 (sub knox walls 6) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4042,4048 ---- KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 212 (sub knox walls 6) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 3035,3041 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 159 (sub knox walls 7) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4061,4067 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 213 (sub knox walls 7) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 3054,3060 **** KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 160 (sub knox walls 8) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4080,4086 ---- KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } ! # tile 214 (sub knox walls 8) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 3073,3079 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 161 (sub knox walls 9) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4099,4105 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 215 (sub knox walls 9) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 3092,3098 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 162 (sub knox walls 10) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA --- 4118,4124 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 216 (sub knox walls 10) { AAAAAAKCJKAAAAAA AAAAKKCLKJKKAAAA *************** *** 3111,3117 **** AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 163 (sub sokoban walls 0) { ANNBAMEEEEEMNNBA ABBBAMEMEEMMBBBA --- 4137,4143 ---- AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA } ! # tile 217 (sub sokoban walls 0) { ANNBAMEEEEEMNNBA ABBBAMEMEEMMBBBA *************** *** 3130,3136 **** AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 164 (sub sokoban walls 1) { AAANBBAAAAANBBAA BBBNBBAMBBBNBBAM --- 4156,4162 ---- AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 218 (sub sokoban walls 1) { AAANBBAAAAANBBAA BBBNBBAMBBBNBBAM *************** *** 3149,3155 **** MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 165 (sub sokoban walls 2) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4175,4181 ---- MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 219 (sub sokoban walls 2) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3168,3174 **** AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 166 (sub sokoban walls 3) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4194,4200 ---- AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 220 (sub sokoban walls 3) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3187,3193 **** AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 167 (sub sokoban walls 4) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4213,4219 ---- AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 221 (sub sokoban walls 4) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3206,3212 **** MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 168 (sub sokoban walls 5) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4232,4238 ---- MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 222 (sub sokoban walls 5) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3225,3231 **** MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 169 (sub sokoban walls 6) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4251,4257 ---- MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 223 (sub sokoban walls 6) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3244,3250 **** AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 170 (sub sokoban walls 7) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4270,4276 ---- AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 224 (sub sokoban walls 7) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3263,3269 **** MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 171 (sub sokoban walls 8) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4289,4295 ---- MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } ! # tile 225 (sub sokoban walls 8) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3282,3288 **** AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 172 (sub sokoban walls 9) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4308,4314 ---- AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 226 (sub sokoban walls 9) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *************** *** 3301,3307 **** AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 173 (sub sokoban walls 10) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM --- 4327,4333 ---- AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ! # tile 227 (sub sokoban walls 10) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM *** nethack-3.3.1/win/share/thintile.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/share/thintile.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)thintile.c 3.3 95/11/26 */ /* Copyright (c) NetHack Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)thintile.c 3.4 1995/11/26 */ /* Copyright (c) NetHack Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 29,35 **** static void copy_colormap() { ! int i, r, g, b; char c[2]; while (fscanf(infile, "%[A-Za-z0-9] = (%d, %d, %d) ", c, &r, &g, &b) --- 29,35 ---- static void copy_colormap() { ! int r, g, b; char c[2]; while (fscanf(infile, "%[A-Za-z0-9] = (%d, %d, %d) ", c, &r, &g, &b) *************** *** 41,53 **** static boolean read_txttile() { ! int i, j, k; char buf[BUFSZ]; ! const char *p; char c[2]; ! if (fscanf(infile, "# tile %d (%[^)])", &i, buf) <= 0) return FALSE; Sprintf(comment,"# tile %d (%s)", i, buf); --- 41,54 ---- static boolean read_txttile() { ! int i, j; char buf[BUFSZ]; ! char buf2[BUFSZ]; ! char c[2]; ! if (fscanf(infile, "# %s %d (%[^)])", buf2, &i, buf) <= 0) return FALSE; Sprintf(comment,"# tile %d (%s)", i, buf); *************** *** 84,91 **** static void write_thintile() { ! const char *p; ! int i, j, k; Fprintf(outfile, "%s\n", comment); --- 85,91 ---- static void write_thintile() { ! int i, j; Fprintf(outfile, "%s\n", comment); *************** *** 104,111 **** int argc; char *argv[]; { - boolean x; - while (filenum < 3) { tilecount_per_file = 0; infile = fopen(tilefiles[filenum], RDTMODE); --- 104,109 ---- *** nethack-3.3.1/win/share/tile.h Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/share/tile.h Thu Mar 21 07:37:45 2002 *************** *** 23,29 **** --- 23,31 ---- #ifndef TILE_X #define TILE_X 16 #endif + #ifndef TILE_Y #define TILE_Y 16 + #endif #define Fprintf (void) fprintf *** nethack-3.3.1/win/share/tilemap.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/share/tilemap.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tilemap.c 3.3 2000/06/04 */ /* NetHack may be freely redistributed. See license for details. */ /* --- 1,4 ---- ! /* SCCS Id: @(#)tilemap.c 3.4 2000/06/04 */ /* NetHack may be freely redistributed. See license for details. */ /* *************** *** 180,186 **** } tilenum = 0; /* set-relative number */ ! for (i = 0; i < MAXPCHARS; i++) { if (set == OTH_GLYPH && tilenum == entry) { if (*defsyms[i].explanation) return defsyms[i].explanation; --- 180,186 ---- } tilenum = 0; /* set-relative number */ ! for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) { if (set == OTH_GLYPH && tilenum == entry) { if (*defsyms[i].explanation) return defsyms[i].explanation; *************** *** 211,217 **** tilenum++; } } ! i = entry - tilenum; if (i < (NUM_ZAP << 2)) { if (set == OTH_GLYPH) { --- 211,232 ---- tilenum++; } } ! /* explosions */ ! tilenum = MAXPCHARS - MAXEXPCHARS; ! i = entry - tilenum; ! if (i < (MAXEXPCHARS * EXPL_MAX)) { ! if (set == OTH_GLYPH) { ! static char *explosion_types[] = { /* hack.h */ ! "dark", "noxious", "muddy", "wet", ! "magical", "fiery", "frosty" ! }; ! Sprintf(buf, "explosion %s %d", ! explosion_types[i / MAXEXPCHARS], i % MAXEXPCHARS); ! return buf; ! } ! } ! tilenum += (MAXEXPCHARS * EXPL_MAX); ! i = entry - tilenum; if (i < (NUM_ZAP << 2)) { if (set == OTH_GLYPH) { *************** *** 345,351 **** } lastobjtile = tilenum - 1; ! for (i = 0; i < MAXPCHARS; i++) { tilemap[GLYPH_CMAP_OFF+i] = tilenum; tilenum++; while (conditionals[condnum].sequence == OTH_GLYPH && --- 360,366 ---- } lastobjtile = tilenum - 1; ! for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) { tilemap[GLYPH_CMAP_OFF+i] = tilenum; tilenum++; while (conditionals[condnum].sequence == OTH_GLYPH && *************** *** 355,365 **** } } for (i = 0; i < NUM_ZAP << 2; i++) { tilemap[GLYPH_ZAP_OFF+i] = tilenum; tilenum++; while (conditionals[condnum].sequence == OTH_GLYPH && ! conditionals[condnum].predecessor == (i + MAXPCHARS)) { condnum++; tilenum++; } --- 370,390 ---- } } + for (i = 0; i < (MAXEXPCHARS * EXPL_MAX); i++) { + tilemap[GLYPH_EXPLODE_OFF+i] = tilenum; + tilenum++; + while (conditionals[condnum].sequence == OTH_GLYPH && + conditionals[condnum].predecessor == (i + MAXPCHARS)) { + condnum++; + tilenum++; + } + } + for (i = 0; i < NUM_ZAP << 2; i++) { tilemap[GLYPH_ZAP_OFF+i] = tilenum; tilenum++; while (conditionals[condnum].sequence == OTH_GLYPH && ! conditionals[condnum].predecessor == (i + MAXEXPCHARS)) { condnum++; tilenum++; } *** nethack-3.3.1/win/share/tiletext.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/share/tiletext.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)tiletext.c 3.3 1999/10/24 */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" --- 1,4 ---- ! /* SCCS Id: @(#)tiletext.c 3.4 1999/10/24 */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" *** nethack-3.3.1/win/tty/getline.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/tty/getline.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)getline.c 3.3 96/01/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)getline.c 3.4 1996/01/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 72,83 **** *bufp = 0; } if(c == '\020') { /* ctrl-P */ ! if(!doprev) ! (void) tty_doprev_message(); /* need two initially */ ! (void) tty_doprev_message(); ! doprev = 1; ! continue; ! } else if(doprev) { tty_clear_nhwindow(WIN_MESSAGE); cw->maxcol = cw->maxrow; doprev = 0; --- 72,96 ---- *bufp = 0; } if(c == '\020') { /* ctrl-P */ ! if (iflags.prevmsg_window) { ! int sav = ttyDisplay->inread; ! ttyDisplay->inread = 0; ! (void) tty_doprev_message(); ! ttyDisplay->inread = sav; ! tty_clear_nhwindow(WIN_MESSAGE); ! cw->maxcol = cw->maxrow; ! addtopl(query); ! addtopl(" "); ! *bufp = 0; ! addtopl(obufp); ! } else { ! if (!doprev) ! (void) tty_doprev_message();/* need two initially */ ! (void) tty_doprev_message(); ! doprev = 1; ! continue; ! } ! } else if (doprev && !iflags.prevmsg_window) { tty_clear_nhwindow(WIN_MESSAGE); cw->maxcol = cw->maxrow; doprev = 0; *** nethack-3.3.1/win/tty/termcap.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/tty/termcap.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)termcap.c 3.3 2000/07/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)termcap.c 3.4 2000/07/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 1151,1156 **** --- 1151,1170 ---- has_color(color) int color; { + #ifdef X11_GRAPHICS + /* XXX has_color() should be added to windowprocs */ + if (windowprocs.name != NULL && + !strcmpi(windowprocs.name, "X11")) return TRUE; + #endif + #ifdef GEM_GRAPHICS + /* XXX has_color() should be added to windowprocs */ + if (windowprocs.name != NULL && + !strcmpi(windowprocs.name, "Gem")) return TRUE; + #endif + #ifdef AMII_GRAPHICS + /* hilites[] not used */ + return iflags.use_color; + #endif return hilites[color] != (char *)0; } *** nethack-3.3.1/win/tty/topl.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/tty/topl.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)topl.c 3.3 96/10/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)topl.c 3.4 1996/10/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 26,44 **** { register struct WinDesc *cw = wins[WIN_MESSAGE]; ! ttyDisplay->dismiss_more = C('p'); /* allowed at --More-- */ ! do { ! morc = 0; ! if (cw->maxcol == cw->maxrow) ! redotoplin(toplines); ! else if (cw->data[cw->maxcol]) ! redotoplin(cw->data[cw->maxcol]); ! cw->maxcol--; ! if (cw->maxcol < 0) cw->maxcol = cw->rows-1; ! if (!cw->data[cw->maxcol]) ! cw->maxcol = cw->maxrow; ! } while (morc == C('p')); ! ttyDisplay->dismiss_more = 0; return 0; } --- 26,62 ---- { register struct WinDesc *cw = wins[WIN_MESSAGE]; ! winid prevmsg_win; ! int i; ! ! if (iflags.prevmsg_window && !ttyDisplay->inread) { ! prevmsg_win = create_nhwindow(NHW_MENU); ! putstr(prevmsg_win, 0, "Message History"); ! putstr(prevmsg_win, 0, ""); ! i = cw->maxcol; ! do { ! if(cw->data[i] && strcmp(cw->data[i], "") ) ! putstr(prevmsg_win, 0, cw->data[i]); ! i = (i + 1) % cw->rows; ! } while (i != cw->maxcol); ! putstr(prevmsg_win, 0, toplines); ! display_nhwindow(prevmsg_win, TRUE); ! destroy_nhwindow(prevmsg_win); ! } else { ! ttyDisplay->dismiss_more = C('p'); /* allowed at --More-- */ ! do { ! morc = 0; ! if (cw->maxcol == cw->maxrow) ! redotoplin(toplines); ! else if (cw->data[cw->maxcol]) ! redotoplin(cw->data[cw->maxcol]); ! cw->maxcol--; ! if (cw->maxcol < 0) cw->maxcol = cw->rows-1; ! if (!cw->data[cw->maxcol]) ! cw->maxcol = cw->maxrow; ! } while (morc == C('p')); ! ttyDisplay->dismiss_more = 0; ! } return 0; } *************** *** 147,153 **** /* If there is room on the line, print message on same line */ /* But messages like "You die..." deserve their own line */ n0 = strlen(bp); ! if(ttyDisplay->toplin == 1 && cw->cury == 0 && n0 + (int)strlen(toplines) + 3 < CO-8 && /* room for --More-- */ (notdied = strncmp(bp, "You die", 7))) { Strcat(toplines, " "); --- 165,173 ---- /* If there is room on the line, print message on same line */ /* But messages like "You die..." deserve their own line */ n0 = strlen(bp); ! if( (ttyDisplay->toplin == 1 || ! (cw->flags & WIN_STOP && iflags.prevmsg_window)) && ! cw->cury == 0 && n0 + (int)strlen(toplines) + 3 < CO-8 && /* room for --More-- */ (notdied = strncmp(bp, "You die", 7))) { Strcat(toplines, " "); *************** *** 156,162 **** if(!(cw->flags & WIN_STOP)) addtopl(bp); return; ! } else if(!(cw->flags & WIN_STOP)) { if(ttyDisplay->toplin == 1) more(); else if(cw->cury) { /* for when flags.toplin == 2 && cury > 1 */ docorner(1, cw->cury+1); /* reset cury = 0 if redraw screen */ --- 176,182 ---- if(!(cw->flags & WIN_STOP)) addtopl(bp); return; ! } else if (!(cw->flags & WIN_STOP && !iflags.prevmsg_window)) { if(ttyDisplay->toplin == 1) more(); else if(cw->cury) { /* for when flags.toplin == 2 && cury > 1 */ docorner(1, cw->cury+1); /* reset cury = 0 if redraw screen */ *************** *** 279,287 **** do { /* loop until we get valid input */ q = lowc(readchar()); if (q == '\020') { /* ctrl-P */ ! if(!doprev) (void) tty_doprev_message(); /* need two initially */ ! (void) tty_doprev_message(); ! doprev = 1; q = '\0'; /* force another loop iteration */ continue; } else if (doprev) { --- 299,318 ---- do { /* loop until we get valid input */ q = lowc(readchar()); if (q == '\020') { /* ctrl-P */ ! if (iflags.prevmsg_window) { ! int sav = ttyDisplay->inread; ! ttyDisplay->inread = 0; ! (void) tty_doprev_message(); ! ttyDisplay->inread = sav; ! tty_clear_nhwindow(WIN_MESSAGE); ! cw->maxcol = cw->maxrow; ! addtopl(prompt); ! } else { ! if(!doprev) ! (void) tty_doprev_message(); /* need two initially */ ! (void) tty_doprev_message(); ! doprev = 1; ! } q = '\0'; /* force another loop iteration */ continue; } else if (doprev) { *** nethack-3.3.1/win/tty/wintty.c Thu Feb 14 07:59:40 2002 --- nethack-3.4.0/win/tty/wintty.c Thu Mar 21 07:37:45 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wintty.c 3.3 2000/06/27 */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wintty.c 3.4 2002/02/05 */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 45,50 **** --- 45,54 ---- /* Interface definition, for windows.c */ struct window_procs tty_procs = { "tty", + #ifdef MSDOS + WC_TILED_MAP|WC_ASCII_MAP| + #endif + WC_COLOR|WC_HILITE_PET|WC_INVERSE|WC_EIGHT_BIT_IN, tty_init_nhwindows, tty_player_selection, tty_askname, *************** *** 97,103 **** /* other defs that really should go away (they're tty specific) */ tty_start_screen, tty_end_screen, ! genl_outrip }; static int maxwin = 0; /* number of windows in use */ --- 101,108 ---- /* other defs that really should go away (they're tty specific) */ tty_start_screen, tty_end_screen, ! genl_outrip, ! genl_preference_update, }; static int maxwin = 0; /* number of windows in use */ *************** *** 308,323 **** { int i, k, n; char pick4u = 'n', thisch, lastch = 0; ! char pbuf[QBUFSZ]; winid win; anything any; menu_item *selected = 0; /* Should we randomly pick for the player? */ ! if (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE || ! flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE) { ! const char *prompt = "Shall I pick a character for you? [ynq] "; int echoline; tty_putstr(BASE_WINDOW, 0, ""); echoline = wins[BASE_WINDOW]->cury; --- 313,333 ---- { int i, k, n; char pick4u = 'n', thisch, lastch = 0; ! char pbuf[QBUFSZ], plbuf[QBUFSZ]; winid win; anything any; menu_item *selected = 0; + /* 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; *************** *** 347,366 **** } } /* 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) { /* Process the choice */ ! if (pick4u == 'y' || flags.initrole == ROLE_RANDOM) { /* Pick a random role */ flags.initrole = pick_role(flags.initrace, flags.initgend, ! flags.initalign); if (flags.initrole < 0) { tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); flags.initrole = randrole(); } ! } else { /* Prompt for a role */ win = create_nhwindow(NHW_MENU); start_menu(win); --- 357,382 ---- } } + (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(); } ! } 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); *************** *** 371,383 **** any.a_int = i+1; /* must be non-zero */ thisch = lowc(roles[i].name.m[0]); if (thisch == lastch) thisch = highc(thisch); add_menu(win, NO_GLYPH, &any, thisch, ! 0, ATR_NONE, an(roles[i].name.m), MENU_UNSELECTED); lastch = thisch; } } any.a_int = pick_role(flags.initrace, flags.initgend, ! flags.initalign)+1; if (any.a_int == 0) /* must be non-zero */ any.a_int = randrole()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, --- 387,412 ---- 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()+1; add_menu(win, NO_GLYPH, &any , '*', 0, ATR_NONE, *************** *** 385,391 **** any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, "Quit", MENU_UNSELECTED); ! end_menu(win, "Pick a role"); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 414,421 ---- 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); *************** *** 396,411 **** flags.initrole = selected[0].item.a_int - 1; free((genericptr_t) selected), selected = 0; } } ! /* 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.initrace = pick_race(flags.initrole, flags.initgend, ! flags.initalign); if (flags.initrace < 0) { tty_putstr(BASE_WINDOW, 0, "Incompatible race!"); flags.initrace = randrace(flags.initrole); --- 426,443 ---- 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); *************** *** 432,437 **** --- 464,471 ---- /* 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 */ *************** *** 443,449 **** 0, ATR_NONE, races[i].noun, MENU_UNSELECTED); } any.a_int = pick_race(flags.initrole, flags.initgend, ! flags.initalign)+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, --- 477,483 ---- 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, *************** *** 451,458 **** 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", ! roles[flags.initrole].name.m); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 485,491 ---- 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); *************** *** 464,469 **** --- 497,504 ---- } flags.initrace = k; } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); } /* Select a gender, if necessary */ *************** *** 472,480 **** if (flags.initgend < 0 || !validgend(flags.initrole, flags.initrace, flags.initgend)) { /* pre-selected gender not valid */ ! if (pick4u == 'y' || flags.initgend == ROLE_RANDOM) { flags.initgend = pick_gend(flags.initrole, flags.initrace, ! flags.initalign); if (flags.initgend < 0) { tty_putstr(BASE_WINDOW, 0, "Incompatible gender!"); flags.initgend = randgend(flags.initrole, flags.initrace); --- 507,515 ---- 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); *************** *** 501,506 **** --- 536,543 ---- /* 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 */ *************** *** 512,518 **** 0, ATR_NONE, genders[i].adj, MENU_UNSELECTED); } any.a_int = pick_gend(flags.initrole, flags.initrace, ! flags.initalign)+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, --- 549,555 ---- 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, *************** *** 520,528 **** 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 %s", ! races[flags.initrace].adj, ! roles[flags.initrole].name.m); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 557,563 ---- 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); *************** *** 534,539 **** --- 569,576 ---- } flags.initgend = k; } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); } /* Select an alignment, if necessary */ *************** *** 541,549 **** if (flags.initalign < 0 || !validalign(flags.initrole, flags.initrace, flags.initalign)) { /* pre-selected alignment not valid */ ! if (pick4u == 'y' || flags.initalign == ROLE_RANDOM) { flags.initalign = pick_align(flags.initrole, flags.initrace, ! flags.initgend); if (flags.initalign < 0) { tty_putstr(BASE_WINDOW, 0, "Incompatible alignment!"); flags.initalign = randalign(flags.initrole, flags.initrace); --- 578,586 ---- 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); *************** *** 570,575 **** --- 607,614 ---- /* 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 */ *************** *** 581,587 **** 0, ATR_NONE, aligns[i].adj, MENU_UNSELECTED); } any.a_int = pick_align(flags.initrole, flags.initrace, ! flags.initgend)+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, --- 620,626 ---- 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, *************** *** 589,600 **** 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 %s %s", ! genders[flags.initgend].adj, ! races[flags.initrace].adj, ! (flags.initgend && roles[flags.initrole].name.f) ? ! roles[flags.initrole].name.f : ! roles[flags.initrole].name.m); end_menu(win, pbuf); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); --- 628,634 ---- 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); *************** *** 1209,1216 **** if (cw->npages > 1) Sprintf(cw->morestr, "(%d of %d)", curr_page + 1, (int) cw->npages); ! else Strcpy(cw->morestr, msave); tty_curs(window, 1, page_lines); cl_end(); --- 1243,1252 ---- if (cw->npages > 1) Sprintf(cw->morestr, "(%d of %d)", curr_page + 1, (int) cw->npages); ! else if (msave) Strcpy(cw->morestr, msave); + else + Strcpy(cw->morestr, defmorestr); tty_curs(window, 1, page_lines); cl_end(); *************** *** 1483,1489 **** } else tty_clear_nhwindow(WIN_MESSAGE); ! if (cw->data) process_text_window(window, cw); else process_menu_window(window, cw); --- 1519,1525 ---- } else tty_clear_nhwindow(WIN_MESSAGE); ! if (cw->data || !cw->maxrow) process_text_window(window, cw); else process_menu_window(window, cw); *************** *** 1576,1582 **** cw->curx = --x; /* column 0 is never used */ cw->cury = y; #ifdef DEBUG ! if(x<0 || y<0 || y >= cw->rows || x >= cw->cols) { const char *s = "[unknown type]"; switch(cw->type) { case NHW_MESSAGE: s = "[topl window]"; break; --- 1612,1618 ---- cw->curx = --x; /* column 0 is never used */ cw->cury = y; #ifdef DEBUG ! if(x<0 || y<0 || y >= cw->rows || x > cw->cols) { const char *s = "[unknown type]"; switch(cw->type) { case NHW_MESSAGE: s = "[topl window]"; break; *************** *** 1703,1709 **** return; } ! if(str == (const char*)0 || (cw->flags & WIN_CANCELLED)) return; if(cw->type != NHW_MESSAGE) str = compress_str(str); --- 1739,1747 ---- return; } ! if(str == (const char*)0 || ! ( (cw->flags & WIN_CANCELLED) && ! (cw->type != NHW_MESSAGE || !iflags.prevmsg_window) )) return; if(cw->type != NHW_MESSAGE) str = compress_str(str); *************** *** 1815,1821 **** cw->maxrow = cw->cury; if(n0 > CO) { /* attempt to break the line */ ! for(i = CO-1; i && str[i] != ' ';) i--; if(i) { cw->data[cw->cury-1][++i] = '\0'; --- 1853,1859 ---- cw->maxrow = cw->cury; if(n0 > CO) { /* attempt to break the line */ ! for(i = CO-1; i && str[i] != ' ' && str[i] != '\n';) i--; if(i) { cw->data[cw->cury-1][++i] = '\0'; *************** *** 1874,1879 **** --- 1912,1919 ---- } else if(u.ux) docrt(); } else { winid datawin = tty_create_nhwindow(NHW_TEXT); + boolean empty = TRUE; + if(complain #ifndef NO_TERMS && nh_CD *************** *** 1890,1900 **** if ((cr = index(buf, '\r')) != 0) *cr = 0; #endif if (index(buf, '\t') != 0) (void) tabexpand(buf); tty_putstr(datawin, 0, buf); if(wins[datawin]->flags & WIN_CANCELLED) break; } ! tty_display_nhwindow(datawin, FALSE); tty_destroy_nhwindow(datawin); (void) dlb_fclose(f); } --- 1930,1941 ---- if ((cr = index(buf, '\r')) != 0) *cr = 0; #endif if (index(buf, '\t') != 0) (void) tabexpand(buf); + empty = FALSE; tty_putstr(datawin, 0, buf); if(wins[datawin]->flags & WIN_CANCELLED) break; } ! if (!empty) tty_display_nhwindow(datawin, FALSE); tty_destroy_nhwindow(datawin); (void) dlb_fclose(f); } *************** *** 2144,2151 **** response to a prompt, we'll assume that the display is up to date */ tty_putstr(WIN_MESSAGE, 0, mesg); /* if `mesg' didn't wrap (triggering --More--), force --More-- now */ ! if (ttyDisplay->toplin == 1) more(); /* normally means skip further messages, but in this case it means cancel the current prompt; any other messages should continue to be output normally */ --- 2185,2195 ---- response to a prompt, we'll assume that the display is up to date */ tty_putstr(WIN_MESSAGE, 0, mesg); /* if `mesg' didn't wrap (triggering --More--), force --More-- now */ ! if (ttyDisplay->toplin == 1) { more(); + ttyDisplay->toplin = 1; /* more resets this */ + tty_clear_nhwindow(WIN_MESSAGE); + } /* normally means skip further messages, but in this case it means cancel the current prompt; any other messages should continue to be output normally */ *************** *** 2179,2185 **** if(ttyDisplay->inmore) { addtopl("--More--"); (void) fflush(stdout); ! } else if(ttyDisplay->inread) { /* this can only happen if we were reading and got interrupted */ ttyDisplay->toplin = 3; /* do this twice; 1st time gets the Quit? message again */ --- 2223,2229 ---- if(ttyDisplay->inmore) { addtopl("--More--"); (void) fflush(stdout); ! } else if(ttyDisplay->inread > program_state.gameover) { /* this can only happen if we were reading and got interrupted */ ttyDisplay->toplin = 3; /* do this twice; 1st time gets the Quit? message again */ *************** *** 2249,2254 **** --- 2293,2299 ---- #endif } + #ifndef WIN32 void g_putch(in_ch) int in_ch; *************** *** 2280,2285 **** --- 2325,2331 ---- return; } + #endif /* !WIN32 */ #ifdef CLIPPING void *************** *** 2331,2508 **** * Since this is only called from show_glyph(), it is assumed that the * position and glyph are always correct (checked there)! */ void tty_print_glyph(window, x, y, glyph) winid window; xchar x, y; int glyph; { ! uchar ch; ! register int offset; ! boolean is_reverse = FALSE; ! #ifdef TEXTCOLOR int color; ! ! #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 invis_color(n) color = NO_COLOR ! #define pet_color(n) color = iflags.use_color ? mons[n].mcolor : \ ! /* If no color, try to hilite pets; black */ \ ! /* should be nh_HI */ \ ! ((iflags.hilite_pet && has_color(CLR_BLACK)) ? \ ! CLR_BLACK : NO_COLOR) ! #define warn_color(n) color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR ! # if defined(REINCARNATION) && defined(ASCIIGRAPH) ! # define ROGUE_COLOR ! # endif ! ! #else /* no text color */ ! ! #define zap_color(n) ! #define cmap_color(n) ! #define obj_color(n) ! #define mon_color(n) ! #define invis_color(n) ! #define pet_color(c) ! #define warn_color(n) ! #endif ! ! #ifdef ROGUE_COLOR ! # if defined(USE_TILES) && defined(MSDOS) ! #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && !iflags.grmode && \ ! Is_rogue_level(&u.uz)) ! # else ! #define HAS_ROGUE_IBM_GRAPHICS (iflags.IBMgraphics && Is_rogue_level(&u.uz)) ! # endif ! #endif ! #ifdef CLIPPING if(clipping) { if(x <= clipx || y < clipy || x >= clipxmax || y >= clipymax) return; } #endif ! /* ! * Map the glyph back to a character. ! * ! * Warning: For speed, this makes an assumption on the order of ! * offsets. The order is set in display.h. ! */ ! if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ ! ch = warnsyms[offset]; ! # ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS) ! color = NO_COLOR; ! else ! # endif ! warn_color(offset); ! } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ ! /* see swallow_to_glyph() in display.c */ ! ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) ! color = NO_COLOR; ! else ! #endif ! mon_color(offset >> 3); ! } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ ! /* see zapdir_to_glyph() in display.c */ ! ch = showsyms[S_vbeam + (offset & 0x3)]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) ! color = NO_COLOR; ! else ! #endif ! zap_color((offset >> 2)); ! } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ ! ch = showsyms[offset]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { ! if (offset >= S_vwall && offset <= S_hcdoor) ! color = CLR_BROWN; ! else if (offset >= S_arrow_trap && offset <= S_polymorph_trap) ! color = CLR_MAGENTA; ! else if (offset == S_corr || offset == S_litcorr) ! color = CLR_GRAY; ! else if (offset >= S_room && offset <= S_water) ! color = CLR_GREEN; ! else ! color = NO_COLOR; ! } else ! #endif ! cmap_color(offset); ! } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ ! ch = oc_syms[(int)objects[offset].oc_class]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { ! switch(objects[offset].oc_class) { ! case GOLD_CLASS: color = CLR_YELLOW; break; ! case FOOD_CLASS: color = CLR_RED; break; ! default: color = CLR_BRIGHT_BLUE; break; ! } ! } else ! #endif ! obj_color(offset); ! } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */ ! ch = monsyms[(int)mons[offset].mlet]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS) ! /* This currently implies that the hero is here -- monsters */ ! /* don't ride (yet...). Should we set it to yellow like in */ ! /* the monster case below? There is no equivalent in rogue. */ ! color = NO_COLOR; /* no need to check iflags.use_color */ ! else ! #endif ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ ! ch = oc_syms[(int)objects[CORPSE].oc_class]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) ! color = CLR_RED; ! else ! #endif ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */ ! ch = monsyms[(int)mons[offset].mlet]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS) ! color = NO_COLOR; /* no need to check iflags.use_color */ ! else ! #endif ! mon_color(offset); ! /* Disabled for now; anyone want to get reverse video to work? */ ! /* is_reverse = TRUE; */ ! } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ ! ch = DEF_INVISIBLE; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS) ! color = NO_COLOR; /* no need to check iflags.use_color */ ! else ! #endif ! invis_color(offset); ! } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ ! ch = monsyms[(int)mons[offset].mlet]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS) ! color = NO_COLOR; /* no need to check iflags.use_color */ ! else ! #endif ! pet_color(offset); ! } else { /* a monster */ ! ch = monsyms[(int)mons[glyph].mlet]; ! #ifdef ROGUE_COLOR ! if (HAS_ROGUE_IBM_GRAPHICS && iflags.use_color) { ! if (x == u.ux && y == u.uy) ! /* actually player should be yellow-on-gray if in a corridor */ ! color = CLR_YELLOW; ! else ! color = NO_COLOR; ! } else ! #endif ! mon_color(glyph); ! } /* Move the cursor. */ tty_curs(window, x,y); --- 2377,2402 ---- * Since this is only called from show_glyph(), it is assumed that the * position and glyph are always correct (checked there)! */ + void tty_print_glyph(window, x, y, glyph) winid window; xchar x, y; int glyph; { ! int ch; ! boolean reverse_on = FALSE; int color; ! unsigned special; ! #ifdef CLIPPING if(clipping) { if(x <= clipx || y < clipy || x >= clipxmax || y >= clipymax) return; } #endif ! /* map glyph to character and color */ ! mapglyph(glyph, &ch, &color, &special, x, y); /* Move the cursor. */ tty_curs(window, x,y); *************** *** 2515,2532 **** #endif #ifdef TEXTCOLOR - /* Turn off color if no color defined, or rogue level w/o PC graphics. */ - # ifdef REINCARNATION - # ifdef ASCIIGRAPH - if (!has_color(color) || (Is_rogue_level(&u.uz) && !HAS_ROGUE_IBM_GRAPHICS)) - # else - if (!has_color(color) || Is_rogue_level(&u.uz)) - # endif - # else - if (!has_color(color)) - # endif - color = NO_COLOR; - if (color != ttyDisplay->color) { if(ttyDisplay->color != NO_COLOR) term_end_color(); --- 2409,2414 ---- *************** *** 2535,2551 **** term_start_color(color); } #endif /* TEXTCOLOR */ #if defined(USE_TILES) && defined(MSDOS) if (iflags.grmode && iflags.tile_view) ! xputg(glyph,(int)ch); else #endif ! if (is_reverse) { /* not currently working */ ! term_start_attr(ATR_INVERSE); ! g_putch((int)ch); /* print the character */ ! term_end_attr(ATR_INVERSE); ! } else ! g_putch((int)ch); /* print the character */ wins[window]->curx++; /* one character over */ ttyDisplay->curx++; /* the real cursor moved too */ } --- 2417,2440 ---- term_start_color(color); } #endif /* TEXTCOLOR */ + + /* must be after color check; term_end_color may turn off inverse too */ + if (((special & MG_PET) && iflags.hilite_pet) || + ((special & MG_DETECT) && iflags.use_inverse)) { + term_start_attr(ATR_INVERSE); + reverse_on = TRUE; + } + #if defined(USE_TILES) && defined(MSDOS) if (iflags.grmode && iflags.tile_view) ! xputg(glyph,ch,special); else #endif ! g_putch(ch); /* print the character */ ! ! if (reverse_on) ! term_end_attr(ATR_INVERSE); ! wins[window]->curx++; /* one character over */ ttyDisplay->curx++; /* the real cursor moved too */ } *** nethack-3.3.1/win/X11/Install.X11 Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/Install.X11 Thu Mar 21 07:37:48 2002 *************** *** 40,45 **** --- 40,51 ---- the VARDATND setting in the top Makefile to contain the tile files before you do your 'make all'. + If you get a linker error referring to `substitute_tiles' then most + likely you have overlooked the WINSRC, WINOBJ, WINLIB step above. + Alternatively, you are building with more than one non-tty interface + specified but haven't followed the direction in src/Makefile to remove + all but one instance of tile.o from the WINxxxOBJ values used for WINOBJ. + When using tiles, you have the option of defining USE_XPM in config.h. This causes NetHack to use the XPM file format for the "x11tiles" file rather than a custom format. Since the XPM format can be processed by *** nethack-3.3.1/win/X11/NetHack.ad Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/NetHack.ad Thu Mar 21 07:37:48 2002 *************** *** 59,68 **** ! It is not guaranteed that the window manager will honor the icon selection. !NetHack*icon: nh56 ! ! ! If True, a popup for single character prompts such as y/n questions is _not_ ! ! used. ! !NetHack*slow: True ! ! ! The number of lines the message window will show without scrolling. !NetHack*message_lines: 12 ! --- 59,68 ---- ! It is not guaranteed that the window manager will honor the icon selection. !NetHack*icon: nh56 ! ! ! If True, the default, a popup for single character prompts such as y/n ! ! questions is _not_ used. ! NetHack*slow: True ! ! The number of lines the message window will show without scrolling. !NetHack*message_lines: 12 ! *** nethack-3.3.1/win/X11/nh32icon Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/nh32icon Thu Mar 21 07:37:48 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)nh32icon 3.3 95/07/19 */ /* Copyright (C) 1993,1995 by Robert Patrick Rankin */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)nh32icon 3.4 2002/02/12 */ /* Copyright (C) 1993,1995 by Robert Patrick Rankin */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 10,18 **** 0xff, 0x7f, 0xfe, 0xff, 0x01, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x40, 0x82, 0x21, 0x25, 0xc0, 0x83, 0x61, 0x25, 0x80, 0x81, 0xe1, 0x3d, 0x80, 0x81, 0xa1, 0x25, 0x80, 0x81, 0x21, 0x25, 0x80, 0x81, 0x01, 0x00, 0xe0, 0x87, ! 0x71, 0x38, 0x90, 0x89, 0x81, 0x40, 0x80, 0x81, 0x61, 0x30, 0x80, 0x81, ! 0x81, 0x40, 0x80, 0x81, 0x71, 0x3a, 0x84, 0x81, 0x03, 0x00, 0x8a, 0xc1, ! 0x02, 0x00, 0x84, 0x41, 0x32, 0x73, 0x80, 0x41, 0xf3, 0x7f, 0x80, 0xc1, 0xf1, 0x7f, 0x84, 0x81, 0x71, 0x77, 0x8a, 0x81, 0xb1, 0x68, 0x84, 0x81, 0x71, 0x77, 0x80, 0x81, 0x71, 0x77, 0x80, 0x81, 0xb1, 0x68, 0x84, 0x81, 0x71, 0x77, 0x8a, 0x81, 0xf1, 0x7f, 0x84, 0x81, 0xe1, 0x3f, 0x80, 0x81, --- 10,18 ---- 0xff, 0x7f, 0xfe, 0xff, 0x01, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x40, 0x82, 0x21, 0x25, 0xc0, 0x83, 0x61, 0x25, 0x80, 0x81, 0xe1, 0x3d, 0x80, 0x81, 0xa1, 0x25, 0x80, 0x81, 0x21, 0x25, 0x80, 0x81, 0x01, 0x00, 0xe0, 0x87, ! 0x71, 0x48, 0x90, 0x89, 0x81, 0x48, 0x80, 0x81, 0x61, 0x78, 0x80, 0x81, ! 0x81, 0x40, 0x80, 0x81, 0x71, 0x42, 0x84, 0x81, 0x03, 0x00, 0x8a, 0xc1, ! 0x02, 0x00, 0x84, 0x41, 0x32, 0x67, 0x80, 0x41, 0xf3, 0x7f, 0x80, 0xc1, 0xf1, 0x7f, 0x84, 0x81, 0x71, 0x77, 0x8a, 0x81, 0xb1, 0x68, 0x84, 0x81, 0x71, 0x77, 0x80, 0x81, 0x71, 0x77, 0x80, 0x81, 0xb1, 0x68, 0x84, 0x81, 0x71, 0x77, 0x8a, 0x81, 0xf1, 0x7f, 0x84, 0x81, 0xe1, 0x3f, 0x80, 0x81, *** nethack-3.3.1/win/X11/nh56icon Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/nh56icon Thu Mar 21 07:37:48 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)nh56icon 3.3 95/07/19 */ /* Copyright (c) 1993,1995 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)nh56icon 3.4 2002/02/12 */ /* Copyright (c) 1993,1995 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 25,36 **** 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, ! 0xc0, 0x43, 0x10, 0x21, 0x38, 0x70, 0x80, 0xc3, 0xc3, 0x10, 0x21, 0x38, ! 0x88, 0x40, 0xc4, 0xc3, 0x10, 0x21, 0x38, 0x80, 0x00, 0xc4, 0x43, 0x11, ! 0x21, 0x38, 0x80, 0x00, 0xc4, 0x43, 0x12, 0x3f, 0x38, 0x70, 0x80, 0xc3, ! 0x43, 0x12, 0x21, 0x38, 0x80, 0x00, 0xc4, 0x43, 0x14, 0x21, 0x38, 0x80, ! 0x00, 0xc4, 0x43, 0x18, 0x21, 0x38, 0x80, 0x00, 0xc4, 0x43, 0x18, 0x21, ! 0x38, 0x88, 0x4c, 0xc4, 0x43, 0x10, 0x21, 0x38, 0x70, 0x8c, 0xc3, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0xfb, 0xff, 0xff, 0x39, 0xff, 0xff, 0xdf, 0x0b, 0x00, 0x80, 0x7c, 0x02, 0x00, 0xd0, 0x0b, 0x00, 0x80, 0xee, 0x02, 0x00, 0xd0, 0xfb, 0xff, --- 25,36 ---- 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, ! 0xc0, 0x43, 0x10, 0x21, 0x38, 0x70, 0x20, 0xc2, 0xc3, 0x10, 0x21, 0x38, ! 0x88, 0x20, 0xc2, 0xc3, 0x10, 0x21, 0x38, 0x80, 0x20, 0xc2, 0x43, 0x11, ! 0x21, 0x38, 0x80, 0x20, 0xc2, 0x43, 0x12, 0x3f, 0x38, 0x70, 0xe0, 0xc3, ! 0x43, 0x12, 0x21, 0x38, 0x80, 0x00, 0xc2, 0x43, 0x14, 0x21, 0x38, 0x80, ! 0x00, 0xc2, 0x43, 0x18, 0x21, 0x38, 0x80, 0x00, 0xc2, 0x43, 0x18, 0x21, ! 0x38, 0x88, 0x0c, 0xc2, 0x43, 0x10, 0x21, 0x38, 0x70, 0x0c, 0xc2, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0xfb, 0xff, 0xff, 0x39, 0xff, 0xff, 0xdf, 0x0b, 0x00, 0x80, 0x7c, 0x02, 0x00, 0xd0, 0x0b, 0x00, 0x80, 0xee, 0x02, 0x00, 0xd0, 0xfb, 0xff, *** nethack-3.3.1/win/X11/nh72icon Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/nh72icon Thu Mar 21 07:37:48 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)nh72icon 3.3 93/01/21 */ /* Copyright (c) 1993 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)nh72icon 3.4 1993/01/21 */ /* Copyright (c) 1993 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/X11/tile2x11.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/tile2x11.c Thu Mar 21 07:37:49 2002 *************** *** 15,21 **** x11_header header; ! unsigned char tile_bytes[TILE_X*TILE_Y*MAX_GLYPH]; unsigned char *curr_tb = tile_bytes; unsigned char x11_colormap[MAXCOLORMAPSIZE][3]; --- 15,21 ---- x11_header header; ! unsigned char tile_bytes[TILE_X*TILE_Y*(MAX_GLYPH+TILES_PER_ROW)]; unsigned char *curr_tb = tile_bytes; unsigned char x11_colormap[MAXCOLORMAPSIZE][3]; *************** *** 44,51 **** /* Convert the tiles in the file to our format of bytes. */ static unsigned long ! convert_tiles(tb_ptr) unsigned char **tb_ptr; /* pointer to a tile byte pointer */ { unsigned char *tb = *tb_ptr; unsigned long count = 0; --- 44,52 ---- /* Convert the tiles in the file to our format of bytes. */ static unsigned long ! convert_tiles(tb_ptr, total) unsigned char **tb_ptr; /* pointer to a tile byte pointer */ + unsigned long total; /* total tiles so far */ { unsigned char *tb = *tb_ptr; unsigned long count = 0; *************** *** 54,65 **** while (read_text_tile(tile)) { count++; ! for (y = 0; y < TILE_Y; y++) for (x = 0; x < TILE_X; x++) ! *tb++ = pix_to_colormap(tile[y][x]); } - *tb_ptr = tb; /* update return val */ return count; } --- 55,74 ---- while (read_text_tile(tile)) { count++; ! total++; ! for (y = 0; y < TILE_Y; y++) { for (x = 0; x < TILE_X; x++) ! tb[x] = pix_to_colormap(tile[y][x]); ! tb += TILE_X * header.per_row; ! } ! ! /* repoint at the upper-left corner of the next tile */ ! *tb_ptr += TILE_X; ! if (header.per_row == 1 || (total % header.per_row) == 0) ! *tb_ptr += TILE_X * (TILE_Y - 1) * header.per_row; ! tb = *tb_ptr; } return count; } *************** *** 108,116 **** if (!fopen_text_file(fname, RDTMODE)) { Fprintf(stderr, "can't open file \"%s\"\n", fname); exit(1); ! } merge_text_colormap(); ! count = convert_tiles(&curr_tb); Fprintf(stderr, "%s: %lu tiles\n", fname, count); header.ntiles += count; fclose_text_file(); --- 117,125 ---- if (!fopen_text_file(fname, RDTMODE)) { Fprintf(stderr, "can't open file \"%s\"\n", fname); exit(1); ! } merge_text_colormap(); ! count = convert_tiles(&curr_tb, header.ntiles); Fprintf(stderr, "%s: %lu tiles\n", fname, count); header.ntiles += count; fclose_text_file(); *************** *** 122,128 **** xpm_write(fp) FILE *fp; { ! int i,j,n; if (header.ncolors > 64) { Fprintf(stderr, "Sorry, only configured for up to 64 colors\n"); --- 131,137 ---- xpm_write(fp) FILE *fp; { ! int i, j, n; if (header.ncolors > 64) { Fprintf(stderr, "Sorry, only configured for up to 64 colors\n"); *************** *** 130,163 **** /* All you need to do is add more char per color - below */ } ! fprintf(fp, "/* XPM */\n"); ! fprintf(fp, "static char* nhtiles[] = {\n"); ! fprintf(fp, "\"%lu %lu %lu %d\",\n", ! header.tile_width, ! header.tile_height*header.ntiles, header.ncolors, 1 /* char per color */); for (i = 0; i < header.ncolors; i++) ! fprintf(fp, "\"%c c #%02x%02x%02x\",\n", i+'0', /* just one char per color */ x11_colormap[i][0], x11_colormap[i][1], x11_colormap[i][2]); ! n=0; ! for (i = 0; i < header.tile_height*header.ntiles; i++) { ! fprintf(fp, "\""); ! for (j = 0; j < header.tile_width; j++) { /* just one char per color */ fputc(tile_bytes[n++]+'0', fp); } ! if (j==header.tile_width-1) ! fprintf(fp, "\"\n"); ! else ! fprintf(fp, "\",\n"); } ! return fprintf(fp, "};\n")>=0; } #endif /* USE_XPM */ --- 139,170 ---- /* All you need to do is add more char per color - below */ } ! Fprintf(fp, "/* XPM */\n"); ! Fprintf(fp, "static char* nhtiles[] = {\n"); ! Fprintf(fp, "\"%lu %lu %lu %d\",\n", ! header.tile_width*header.per_row, ! (header.tile_height*header.ntiles)/header.per_row, header.ncolors, 1 /* char per color */); for (i = 0; i < header.ncolors; i++) ! Fprintf(fp, "\"%c c #%02x%02x%02x\",\n", i+'0', /* just one char per color */ x11_colormap[i][0], x11_colormap[i][1], x11_colormap[i][2]); ! n = 0; ! for (i = 0; i < (header.tile_height*header.ntiles)/header.per_row; i++) { ! Fprintf(fp, "\""); ! for (j = 0; j < header.tile_width*header.per_row; j++) { /* just one char per color */ fputc(tile_bytes[n++]+'0', fp); } ! ! Fprintf(fp, "\",\n"); } ! return fprintf(fp, "};\n") >= 0; } #endif /* USE_XPM */ *************** *** 169,179 **** FILE *fp; int i; ! header.version = 1; header.ncolors = 0; header.tile_width = TILE_X; header.tile_height = TILE_Y; header.ntiles = 0; /* updated as we read in files */ if (argc == 1) { Fprintf(stderr, "usage: %s txt_file1 [txt_file2 ...]\n", argv[0]); --- 176,187 ---- FILE *fp; int i; ! header.version = 2; /* version 1 had no per_row field */ header.ncolors = 0; header.tile_width = TILE_X; header.tile_height = TILE_Y; header.ntiles = 0; /* updated as we read in files */ + header.per_row = TILES_PER_ROW; if (argc == 1) { Fprintf(stderr, "usage: %s txt_file1 [txt_file2 ...]\n", argv[0]); *************** *** 184,195 **** if (!fp) { Fprintf(stderr, "can't open output file\n"); exit(1); ! } for (i = 1; i < argc; i++) process_file(argv[i]); Fprintf(stderr, "Total tiles: %ld\n", header.ntiles); #ifdef USE_XPM if (xpm_write(fp) == 0) { Fprintf(stderr, "can't write XPM file\n"); --- 192,211 ---- if (!fp) { Fprintf(stderr, "can't open output file\n"); exit(1); ! } ! ! /* don't leave garbage at end of partial row */ ! (void) memset((genericptr_t)tile_bytes, 0, sizeof(tile_bytes)); for (i = 1; i < argc; i++) process_file(argv[i]); Fprintf(stderr, "Total tiles: %ld\n", header.ntiles); + /* round size up to the end of the row */ + if ((header.ntiles % header.per_row) != 0) { + header.ntiles += header.per_row - (header.ntiles % header.per_row); + } + #ifdef USE_XPM if (xpm_write(fp) == 0) { Fprintf(stderr, "can't write XPM file\n"); *************** *** 199,205 **** if (fwrite((char *)&header, sizeof(x11_header), 1, fp) == 0) { Fprintf(stderr, "can't open output header\n"); exit(1); ! } if (fwrite((char *)x11_colormap, 1, header.ncolors*3, fp) == 0) { Fprintf(stderr, "can't write output colormap\n"); --- 215,221 ---- if (fwrite((char *)&header, sizeof(x11_header), 1, fp) == 0) { Fprintf(stderr, "can't open output header\n"); exit(1); ! } if (fwrite((char *)x11_colormap, 1, header.ncolors*3, fp) == 0) { Fprintf(stderr, "can't write output colormap\n"); *** nethack-3.3.1/win/X11/Window.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/Window.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)Window.c 3.3 93/02/02 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)Window.c 3.4 1993/02/02 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/X11/winmap.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winmap.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winmap.c 3.3 96/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winmap.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 100,174 **** } else { uchar ch; - register int offset; register unsigned char *ch_ptr; #ifdef TEXTCOLOR - int color; register unsigned char *co_ptr; - - #define zap_color(n) color = zapcolors[n] - #define cmap_color(n) color = defsyms[n].color - #define obj_color(n) color = objects[n].oc_color - #define mon_color(n) color = mons[n].mcolor - #define invis_color(n) color = NO_COLOR - #define pet_color(n) color = mons[n].mcolor - #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 invis_color(n) - #define pet_color(n) - #define warn_color(n) - #endif ! ! /* ! * Map the glyph back to a character. ! * ! * Warning: For speed, this makes an assumption on the order of ! * offsets. The order is set in display.h. ! */ ! if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ ! ch = warnsyms[offset]; ! warn_color(offset); ! } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ ! /* see swallow_to_glyph() in display.c */ ! ch = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; ! mon_color(offset >> 3); ! } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ ! /* see zapdir_to_glyph() in display.c */ ! ch = showsyms[S_vbeam + (offset & 0x3)]; ! zap_color((offset >> 2)); ! } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ ! ch = showsyms[offset]; ! cmap_color(offset); ! } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ ! ch = oc_syms[(int) objects[offset].oc_class]; ! obj_color(offset); ! } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) {/* ridden mon */ ! ch = monsyms[(int) mons[offset].mlet]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ ! ch = oc_syms[(int) objects[CORPSE].oc_class]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { ! /* monster detection; should really be inverse */ ! ch = monsyms[(int) mons[offset].mlet]; ! mon_color(offset); ! } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ ! ch = DEF_INVISIBLE; ! invis_color(offset); ! } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ ! ch = monsyms[(int) mons[offset].mlet]; ! pet_color(offset); ! } else { /* a monster */ ! ch = monsyms[(int) mons[glyph].mlet]; ! mon_color(glyph); ! } ! /* Only update if we need to. */ ch_ptr = &map_info->mtype.text_map->text[y][x]; --- 100,115 ---- } else { uchar ch; register unsigned char *ch_ptr; + int color,och; + unsigned special; #ifdef TEXTCOLOR register unsigned char *co_ptr; #endif ! /* map glyph to character and color */ ! mapglyph(glyph, &och, &color, &special, x, y); ! ch = (uchar)och; ! /* Only update if we need to. */ ch_ptr = &map_info->mtype.text_map->text[y][x]; *************** *** 186,197 **** update_bbox = TRUE; } else update_bbox = FALSE; - - #undef zap_color - #undef cmap_color - #undef obj_color - #undef mon_color - #undef pet_color } if (update_bbox) { /* update row bbox */ --- 127,132 ---- *************** *** 271,281 **** Display *dpy = XtDisplay(toplevel); unsigned int width, height; - height = tile_height * tile_count; - width = tile_width; - if (tile_image == 0) return; /* no tiles */ tile_pixmap = XCreatePixmap(dpy, XtWindow(toplevel), width, height, --- 206,216 ---- Display *dpy = XtDisplay(toplevel); unsigned int width, height; if (tile_image == 0) return; /* no tiles */ + height = tile_image->height; + width = tile_image->width; + tile_pixmap = XCreatePixmap(dpy, XtWindow(toplevel), width, height, *************** *** 304,310 **** init_tiles(wp) struct xwindow *wp; { ! #ifndef USE_XPM FILE *fp = (FILE *)0; x11_header header; unsigned char *cp, *colormap = (unsigned char *)0; --- 239,248 ---- init_tiles(wp) struct xwindow *wp; { ! #ifdef USE_XPM ! XpmAttributes attributes; ! int errorcode; ! #else FILE *fp = (FILE *)0; x11_header header; unsigned char *cp, *colormap = (unsigned char *)0; *************** *** 313,325 **** XColor *colors = (XColor *)0; int i, x, y; int bitmap_pad; - unsigned int image_height, image_width; int ddepth; #endif Display *dpy = XtDisplay(toplevel); Screen *screen = DefaultScreenOfDisplay(dpy); struct map_info_t *map_info = (struct map_info_t *)0; struct tile_map_info_t *tile_info = (struct tile_map_info_t *)0; boolean result = TRUE; XGCValues values; XtGCMask mask; --- 251,264 ---- XColor *colors = (XColor *)0; int i, x, y; int bitmap_pad; int ddepth; #endif + char buf[BUFSZ]; Display *dpy = XtDisplay(toplevel); Screen *screen = DefaultScreenOfDisplay(dpy); struct map_info_t *map_info = (struct map_info_t *)0; struct tile_map_info_t *tile_info = (struct tile_map_info_t *)0; + unsigned int image_height = 0, image_width = 0; boolean result = TRUE; XGCValues values; XtGCMask mask; *************** *** 334,387 **** sizeof(struct tile_map_info_t)); #ifdef USE_XPM ! { ! char buf[BUFSZ]; ! XpmAttributes attributes; ! int errorcode; ! attributes.valuemask = XpmCloseness; ! attributes.closeness = 25000; ! errorcode=XpmReadFileToImage(dpy,appResources.tile_file,&tile_image,0,&attributes); if (errorcode == XpmColorFailed) { ! Sprintf(buf, "Insufficient colors available to load %s.",appResources.tile_file); X11_raw_print(buf); ! X11_raw_print("Try closing other colorful applications and restart."); ! X11_raw_print("Attempting to load with inferior colors."); ! attributes.closeness = 50000; ! errorcode=XpmReadFileToImage(dpy,appResources.tile_file,&tile_image,0,&attributes); ! } ! ! if (errorcode!=XpmSuccess) { ! if (errorcode == XpmColorFailed) { ! Sprintf(buf, "Insufficient colors available to load %s.",appResources.tile_file); ! X11_raw_print(buf); ! } else { ! Sprintf(buf, "Failed to load %s: %s",appResources.tile_file, ! XpmGetErrorString(errorcode)); ! X11_raw_print(buf); ! } ! result = FALSE; ! X11_raw_print("Switching to text-based mode."); ! goto tiledone; ! } ! ! if (tile_image->height%total_tiles_used != 0) { ! Sprintf(buf, ! "%s is not a multiple of %d (the number of tiles) pixels high", ! appResources.tile_file, total_tiles_used); X11_raw_print(buf); - XDestroyImage(tile_image); - tile_image = 0; - result = FALSE; - goto tiledone; } ! /* infer tile dimensions from image size */ ! tile_count=total_tiles_used; ! tile_width=tile_image->width; ! tile_height=tile_image->height/tile_count; } #else /* any less than 16 colours makes tiles useless */ --- 273,335 ---- sizeof(struct tile_map_info_t)); #ifdef USE_XPM ! attributes.valuemask = XpmCloseness; ! attributes.closeness = 25000; ! errorcode = XpmReadFileToImage(dpy, appResources.tile_file, ! &tile_image, 0, &attributes); ! if (errorcode == XpmColorFailed) { ! Sprintf(buf, "Insufficient colors available to load %s.", ! appResources.tile_file); ! X11_raw_print(buf); ! X11_raw_print("Try closing other colorful applications and restart."); ! X11_raw_print("Attempting to load with inferior colors."); ! attributes.closeness = 50000; ! errorcode = XpmReadFileToImage(dpy, appResources.tile_file, ! &tile_image, 0, &attributes); ! } + if (errorcode != XpmSuccess) { if (errorcode == XpmColorFailed) { ! Sprintf(buf, "Insufficient colors available to load %s.", ! appResources.tile_file); X11_raw_print(buf); ! } else { ! Sprintf(buf, "Failed to load %s: %s", appResources.tile_file, ! XpmGetErrorString(errorcode)); X11_raw_print(buf); } + result = FALSE; + X11_raw_print("Switching to text-based mode."); + goto tiledone; + } ! /* assume a fixed number of tiles per row */ ! if (tile_image->width % TILES_PER_ROW != 0) { ! Sprintf(buf, ! "%s is not a multiple of %d (number of tiles/row) pixels wide", ! appResources.tile_file, TILES_PER_ROW); ! X11_raw_print(buf); ! XDestroyImage(tile_image); ! tile_image = 0; ! result = FALSE; ! goto tiledone; ! } ! ! /* infer tile dimensions from image size, assume square tiles */ ! image_width = tile_image->width; ! image_height = tile_image->height; ! tile_width = image_width / TILES_PER_ROW; ! tile_height = tile_width; ! tile_count = (image_width * image_height) / (tile_width * tile_height); ! ! if (tile_count < total_tiles_used) { ! Sprintf(buf, "%s incomplete, expecting %d tiles, found %d", ! appResources.tile_file, total_tiles_used, tile_count); ! X11_raw_print(buf); ! result = FALSE; ! goto tiledone; } #else /* any less than 16 colours makes tiles useless */ *************** *** 405,416 **** goto tiledone; } # ifdef VERBOSE ! fprintf(stderr, "X11 tile file:\n version %ld\n ncolors %ld\n tile width %ld\n tile height %ld\n ntiles %ld\n", header.version, header.ncolors, header.tile_width, header.tile_height, header.ntiles); # endif --- 353,373 ---- goto tiledone; } + if (header.version != 2) { + Sprintf(buf, "Wrong tile file version, expected 2, got %lu", + header.version); + X11_raw_print(buf); + result = FALSE; + goto tiledone; + } + # ifdef VERBOSE ! fprintf(stderr, "X11 tile file:\n version %ld\n ncolors %ld\n tile width %ld\n tile height %ld\n per row %ld\n ntiles %ld\n", header.version, header.ncolors, header.tile_width, header.tile_height, + header.per_row, header.ntiles); # endif *************** *** 439,447 **** if (!XAllocColor(dpy, DefaultColormapOfScreen(screen), &colors[i]) && !nhApproxColor(screen, DefaultColormapOfScreen(screen), (char *)0, &colors[i])) { - char buf[BUFSZ]; Sprintf(buf, "%dth out of %ld color allocation failed", ! i, header.ncolors); X11_raw_print(buf); result = FALSE; goto tiledone; --- 396,403 ---- if (!XAllocColor(dpy, DefaultColormapOfScreen(screen), &colors[i]) && !nhApproxColor(screen, DefaultColormapOfScreen(screen), (char *)0, &colors[i])) { Sprintf(buf, "%dth out of %ld color allocation failed", ! i, header.ncolors); X11_raw_print(buf); result = FALSE; goto tiledone; *************** *** 453,460 **** * This alloc() and the one below require 32-bit ints, since tile_bytes * is currently ~200k and alloc() takes an int */ - tile_bytes = (unsigned char *) alloc((unsigned)header.ntiles*size); tile_count = header.ntiles; if (fread((char *) tile_bytes, size, tile_count, fp) != tile_count) { X11_raw_print("read of tile bytes failed"); result = FALSE; --- 409,419 ---- * This alloc() and the one below require 32-bit ints, since tile_bytes * is currently ~200k and alloc() takes an int */ tile_count = header.ntiles; + if ((tile_count % header.per_row) != 0) { + tile_count += header.per_row - (tile_count % header.per_row); + } + tile_bytes = (unsigned char *) alloc((unsigned)tile_count*size); if (fread((char *) tile_bytes, size, tile_count, fp) != tile_count) { X11_raw_print("read of tile bytes failed"); result = FALSE; *************** *** 462,468 **** } if (header.ntiles < total_tiles_used) { - char buf[BUFSZ]; Sprintf(buf, "tile file incomplete, expecting %d tiles, found %lu", total_tiles_used, header.ntiles); X11_raw_print(buf); --- 421,426 ---- *************** *** 479,486 **** tile_height = header.tile_height; } ! image_height = tile_height * tile_count; ! image_width = tile_width; /* calculate bitmap_pad */ if (ddepth > 16) --- 437,444 ---- tile_height = header.tile_height; } ! image_height = tile_height * tile_count / header.per_row; ! image_width = tile_width * header.per_row; /* calculate bitmap_pad */ if (ddepth > 16) *************** *** 509,527 **** if (appResources.double_tile_size) { unsigned long *expanded_row = ! (unsigned long *)alloc(sizeof(unsigned long)*(unsigned)tile_width); tb = tile_bytes; for (y = 0; y < image_height; y++) { ! for (x = 0; x < header.tile_width; x++) expanded_row[2*x] = expanded_row[(2*x)+1] = colors[*tb++].pixel; ! for (x = 0; x < tile_width; x++) XPutPixel(tile_image, x, y, expanded_row[x]); y++; /* duplicate row */ ! for (x = 0; x < tile_width; x++) XPutPixel(tile_image, x, y, expanded_row[x]); } free((genericptr_t)expanded_row); --- 467,485 ---- if (appResources.double_tile_size) { unsigned long *expanded_row = ! (unsigned long *)alloc(sizeof(unsigned long)*(unsigned)image_width); tb = tile_bytes; for (y = 0; y < image_height; y++) { ! for (x = 0; x < image_width/2; x++) expanded_row[2*x] = expanded_row[(2*x)+1] = colors[*tb++].pixel; ! for (x = 0; x < image_width; x++) XPutPixel(tile_image, x, y, expanded_row[x]); y++; /* duplicate row */ ! for (x = 0; x < image_width; x++) XPutPixel(tile_image, x, y, expanded_row[x]); } free((genericptr_t)expanded_row); *************** *** 554,565 **** */ mask = GCFunction | GCForeground | GCGraphicsExposures; values.graphics_exposures = False; - #if 1 values.foreground = WhitePixelOfScreen(screen) ^ XGetPixel(tile_image, 0, tile_height*glyph2tile[cmap_to_glyph(S_corr)]); - #else - values.foreground = ~((unsigned long) 0); - #endif values.function = GXxor; tile_info->white_gc = XtGetGC(wp->w, mask, &values); --- 512,519 ---- *************** *** 567,573 **** values.function = GXCopy; values.graphics_exposures = False; tile_info->black_gc = XtGetGC(wp->w, mask, &values); ! #endif tiledone: #ifndef USE_XPM --- 521,527 ---- values.function = GXCopy; values.graphics_exposures = False; tile_info->black_gc = XtGetGC(wp->w, mask, &values); ! #endif /* USE_WHITE */ tiledone: #ifndef USE_XPM *************** *** 582,587 **** --- 536,543 ---- map_info->square_width = tile_width; map_info->square_ascent = 0; map_info->square_lbearing = 0; + tile_info->image_width = image_width; + tile_info->image_height = image_height; } else { if (tile_info) free((genericptr_t)tile_info); tile_info = 0; *************** *** 623,629 **** XtSetArg(arg[1], XtNtopOfThumb, &top); XtGetValues(horiz_sb, arg, TWO); ! cursor_middle = (((float) wp->cursx) + 0.5) / (float) COLNO; do_call = True; #ifdef VERBOSE --- 579,587 ---- XtSetArg(arg[1], XtNtopOfThumb, &top); XtGetValues(horiz_sb, arg, TWO); ! /* [ALI] Don't assume map widget is the same size as actual map */ ! cursor_middle = (wp->cursx + 0.5) * wp->map_information->square_width / ! wp->pixel_width; do_call = True; #ifdef VERBOSE *************** *** 669,675 **** XtSetArg(arg[1], XtNtopOfThumb, &top); XtGetValues(vert_sb, arg, TWO); ! cursor_middle = (((float) wp->cursy) + 0.5) / (float) ROWNO; do_call = True; #ifdef VERBOSE --- 627,634 ---- XtSetArg(arg[1], XtNtopOfThumb, &top); XtGetValues(vert_sb, arg, TWO); ! cursor_middle = (wp->cursy + 0.5) * wp->map_information->square_height / ! wp->pixel_height; do_call = True; #ifdef VERBOSE *************** *** 743,753 **** --- 702,731 ---- /* Only do cursor check if new size is smaller. */ if (new_width < map_info->viewport_width || new_height < map_info->viewport_height) { + /* [ALI] If the viewport was larger than the map (and so the map + * widget was contrained to be larger than the actual map) then we + * may be able to shrink the map widget as the viewport shrinks. + */ + wp->pixel_width = map_info->square_width * COLNO; + if (wp->pixel_width < new_width) + wp->pixel_width = new_width; + wp->pixel_height = map_info->square_height * ROWNO; + if (wp->pixel_height < new_height) + wp->pixel_height = new_height; + XtSetArg(arg[0], XtNwidth, wp->pixel_width); + XtSetArg(arg[1], XtNheight, wp->pixel_height); + XtSetValues(wp->w, arg, TWO); + check_cursor_visibility(wp); } map_info->viewport_width = new_width; map_info->viewport_height = new_height; + + /* [ALI] These may have changed if the user has re-sized the viewport */ + XtSetArg(arg[0], XtNwidth, &wp->pixel_width); + XtSetArg(arg[1], XtNheight, &wp->pixel_height); + XtGetValues(wp->w, arg, TWO); } /* *************** *** 948,954 **** #ifdef VERBOSE printf("Font information:\n"); ! printf("fid = %d, direction = %d\n", fs->fid, fs->direction); printf("first = %d, last = %d\n", fs->min_char_or_byte2, fs->max_char_or_byte2); printf("all chars exist? %s\n", fs->all_chars_exist?"yes":"no"); --- 926,932 ---- #ifdef VERBOSE printf("Font information:\n"); ! printf("fid = %ld, direction = %d\n", fs->fid, fs->direction); printf("first = %d, last = %d\n", fs->min_char_or_byte2, fs->max_char_or_byte2); printf("all chars exist? %s\n", fs->all_chars_exist?"yes":"no"); *************** *** 960,966 **** fs->max_bounds.lbearing, fs->max_bounds.rbearing, fs->max_bounds.width, fs->max_bounds.ascent, fs->max_bounds.descent, fs->max_bounds.attributes); ! printf("per_char = 0x%x\n", fs->per_char); printf("Text: (max) width = %d, height = %d\n", map_info->square_width, map_info->square_height); #endif --- 938,944 ---- fs->max_bounds.lbearing, fs->max_bounds.rbearing, fs->max_bounds.width, fs->max_bounds.ascent, fs->max_bounds.descent, fs->max_bounds.attributes); ! printf("per_char = 0x%lx\n", (unsigned long) fs->per_char); printf("Text: (max) width = %d, height = %d\n", map_info->square_width, map_info->square_height); #endif *************** *** 1217,1244 **** if (map_info->is_tile) { struct tile_map_info_t *tile_map = map_info->mtype.tile_map; int cur_col; ! Display* dpy=XtDisplay(wp->w); ! Screen* screen=DefaultScreenOfDisplay(dpy); for (row = start_row; row <= stop_row; row++) { for (cur_col = start_col; cur_col <= stop_col; cur_col++) { int glyph = tile_map->glyphs[row][cur_col]; int tile = glyph2tile[glyph]; int dest_x = cur_col * map_info->square_width; int dest_y = row * map_info->square_height; XCopyArea(dpy, tile_pixmap, XtWindow(wp->w), ! tile_map->black_gc, /* no grapics_expose */ ! 0, ! tile * map_info->square_height, ! tile_width, tile_height, ! dest_x,dest_y); ! if (glyph_is_pet(glyph) ! #ifdef TEXTCOLOR ! && iflags.hilite_pet ! #endif ! ) { /* draw pet annotation (a heart) */ XSetForeground(dpy, tile_map->black_gc, pet_annotation.foreground); XSetClipOrigin(dpy, tile_map->black_gc, dest_x, dest_y); --- 1195,1220 ---- if (map_info->is_tile) { struct tile_map_info_t *tile_map = map_info->mtype.tile_map; int cur_col; ! Display* dpy = XtDisplay(wp->w); ! Screen* screen = DefaultScreenOfDisplay(dpy); for (row = start_row; row <= stop_row; row++) { for (cur_col = start_col; cur_col <= stop_col; cur_col++) { int glyph = tile_map->glyphs[row][cur_col]; int tile = glyph2tile[glyph]; + int src_x, src_y; int dest_x = cur_col * map_info->square_width; int dest_y = row * map_info->square_height; + src_x = (tile % TILES_PER_ROW) * tile_width; + src_y = (tile / TILES_PER_ROW) * tile_height; XCopyArea(dpy, tile_pixmap, XtWindow(wp->w), ! tile_map->black_gc, /* no grapics_expose */ ! src_x, src_y, ! tile_width, tile_height, ! dest_x, dest_y); ! if (glyph_is_pet(glyph) && iflags.hilite_pet) { /* draw pet annotation (a heart) */ XSetForeground(dpy, tile_map->black_gc, pet_annotation.foreground); XSetClipOrigin(dpy, tile_map->black_gc, dest_x, dest_y); *** nethack-3.3.1/win/X11/winmenu.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winmenu.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winmenu.c 3.3 96/08/15 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winmenu.c 3.4 1996/08/15 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/X11/winmesg.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winmesg.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winmesg.c 3.3 96/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winmesg.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/X11/winmisc.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winmisc.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winmisc.c 3.3 2000/05/21 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winmisc.c 3.4 2000/05/21 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 265,279 **** i, availcount, availindex; Widget popup, player_form; const char **choices; ! const char *namep; ! char qbuf[QBUFSZ]; while (flags.initrole < 0) { ! if (flags.initrole == ROLE_RANDOM) { flags.initrole = pick_role(flags.initrace, ! flags.initgend, flags.initalign); break; } /* select a role */ for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue; choices = (const char **)alloc(sizeof(char *) * num_roles); --- 265,285 ---- i, availcount, availindex; Widget popup, player_form; const char **choices; ! char qbuf[QBUFSZ], plbuf[QBUFSZ]; ! ! /* avoid unnecessary prompts further down */ ! rigid_role_checks(); ! ! (void) root_plselection_prompt(plbuf, QBUFSZ - 1, ! flags.initrole, flags.initrace, flags.initgend, flags.initalign); while (flags.initrole < 0) { ! if (flags.initrole == ROLE_RANDOM || flags.randomall) { flags.initrole = pick_role(flags.initrace, ! flags.initgend, flags.initalign, PICK_RANDOM); break; } + /* select a role */ for (num_roles = 0; roles[num_roles].name.m; ++num_roles) continue; choices = (const char **)alloc(sizeof(char *) * num_roles); *************** *** 295,301 **** else if (flags.initrace >= 0) flags.initrace = -1; else panic("no available ROLE+race+gender+alignment combinations"); } ! popup = make_menu("player_selection", "Choose a Role", player_select_translations, "quit", ps_quit, "random", ps_random, --- 301,308 ---- else if (flags.initrace >= 0) flags.initrace = -1; else panic("no available ROLE+race+gender+alignment combinations"); } ! Sprintf(qbuf, "Choose your %s Role", s_suffix(plbuf)); ! popup = make_menu("player_selection", qbuf, player_select_translations, "quit", ps_quit, "random", ps_random, *************** *** 325,334 **** } } while (!validrace(flags.initrole, flags.initrace)) { ! if (flags.initrace == ROLE_RANDOM) { flags.initrace = pick_race(flags.initrole, ! flags.initgend, flags.initalign); break; } /* select a race */ --- 332,344 ---- } } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); + while (!validrace(flags.initrole, flags.initrace)) { ! if (flags.initrace == ROLE_RANDOM || flags.randomall) { flags.initrace = pick_race(flags.initrole, ! flags.initgend, flags.initalign, PICK_RANDOM); break; } /* select a race */ *************** *** 355,365 **** flags.initrace = availindex; free((genericptr_t)choices), choices = 0; } else { ! namep = roles[flags.initrole].name.m; ! if (flags.initgend >= 0 && flags.female && ! roles[flags.initrole].name.f) ! namep = roles[flags.initrole].name.f; ! Sprintf(qbuf, "Pick your %s race", s_suffix(namep)); popup = make_menu("race_selection", qbuf, race_select_translations, "quit", ps_quit, --- 365,371 ---- flags.initrace = availindex; free((genericptr_t)choices), choices = 0; } else { ! Sprintf(qbuf, "Pick your %s race", s_suffix(plbuf)); popup = make_menu("race_selection", qbuf, race_select_translations, "quit", ps_quit, *************** *** 392,401 **** } /* more than one race choice available */ } while (!validgend(flags.initrole, flags.initrace, flags.initgend)) { ! if (flags.initgend == ROLE_RANDOM) { flags.initgend = pick_gend(flags.initrole, flags.initrace, ! flags.initalign); break; } /* select a gender */ --- 398,410 ---- } /* more than one race choice available */ } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); + while (!validgend(flags.initrole, flags.initrace, flags.initgend)) { ! if (flags.initgend == ROLE_RANDOM || flags.randomall) { flags.initgend = pick_gend(flags.initrole, flags.initrace, ! flags.initalign, PICK_RANDOM); break; } /* select a gender */ *************** *** 421,432 **** flags.initgend = availindex; free((genericptr_t)choices), choices = 0; } else { ! namep = roles[flags.initrole].name.m; ! if (flags.initgend >= 0 && flags.female && ! roles[flags.initrole].name.f) ! namep = roles[flags.initrole].name.f; ! Sprintf(qbuf, "Your %s %s gender?", ! races[flags.initrace].adj, s_suffix(namep)); popup = make_menu("gender_selection", qbuf, gend_select_translations, "quit", ps_quit, --- 430,436 ---- flags.initgend = availindex; free((genericptr_t)choices), choices = 0; } else { ! Sprintf(qbuf, "Your %s gender?", s_suffix(plbuf)); popup = make_menu("gender_selection", qbuf, gend_select_translations, "quit", ps_quit, *************** *** 459,468 **** } /* more than one gender choice available */ } while (!validalign(flags.initrole, flags.initrace, flags.initalign)) { ! if (flags.initalign == ROLE_RANDOM) { flags.initalign = pick_align(flags.initrole, flags.initrace, ! flags.initgend); break; } /* select an alignment */ --- 463,475 ---- } /* more than one gender choice available */ } + (void) root_plselection_prompt(plbuf, QBUFSZ - 1, + flags.initrole, flags.initrace, flags.initgend, flags.initalign); + while (!validalign(flags.initrole, flags.initrace, flags.initalign)) { ! if (flags.initalign == ROLE_RANDOM || flags.randomall) { flags.initalign = pick_align(flags.initrole, flags.initrace, ! flags.initgend, PICK_RANDOM); break; } /* select an alignment */ *************** *** 487,500 **** flags.initalign = availindex; free((genericptr_t)choices), choices = 0; } else { ! namep = roles[flags.initrole].name.m; ! if (flags.initgend >= 0 && flags.female && ! roles[flags.initrole].name.f) ! namep = roles[flags.initrole].name.f; ! Sprintf(qbuf, "%s %s %s alignment?", ! genders[flags.initgend].adj, ! races[flags.initrace].adj, s_suffix(namep)); ! qbuf[0] = highc(qbuf[0]); popup = make_menu("alignment_selection", qbuf, algn_select_translations, "quit", ps_quit, --- 494,500 ---- flags.initalign = availindex; free((genericptr_t)choices), choices = 0; } else { ! Sprintf(qbuf, "Your %s alignment?", s_suffix(plbuf)); popup = make_menu("alignment_selection", qbuf, algn_select_translations, "quit", ps_quit, *** nethack-3.3.1/win/X11/winstat.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winstat.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winstat.c 3.3 96/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winstat.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 111,119 **** XtSetArg(args[num_args], XtNrightMargin, &right_margin); num_args++; XtGetValues(wp->w, args, num_args); ! /* font height is ascent + descent */ ! wp->pixel_height = 2 * (fs->ascent + fs->descent) + ! top_margin + bottom_margin; wp->pixel_width = COLNO * fs->max_bounds.width + left_margin + right_margin; --- 111,117 ---- XtSetArg(args[num_args], XtNrightMargin, &right_margin); num_args++; XtGetValues(wp->w, args, num_args); ! wp->pixel_height = 2 * nhFontHeight(wp->w) + top_margin + bottom_margin; wp->pixel_width = COLNO * fs->max_bounds.width + left_margin + right_margin; *************** *** 600,606 **** --- 598,608 ---- case F_NAME: val = (long) 0L; break; /* special */ case F_DLEVEL: val = (long) 0L; break; /* special */ + #ifndef GOLDOBJ case F_GOLD: val = (long) u.ugold; break; + #else + case F_GOLD: val = money_cnt(invent); break; + #endif case F_HP: val = (long) (u.mtimedone ? (u.mh > 0 ? u.mh : 0): (u.uhp > 0 ? u.uhp : 0)); break; *** nethack-3.3.1/win/X11/wintext.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/wintext.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)wintext.c 3.3 96/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)wintext.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 156,168 **** struct text_info_t *text_info; Arg args[8]; Cardinal num_args; ! Dimension width, height; int nlines; text_info = wp->text_information; width = text_info->max_width + text_info->extra_width; text_info->blocked = blocking; text_info->destroy_on_ack = FALSE; /* * Calculate the number of lines to use. First, find the number of --- 156,169 ---- struct text_info_t *text_info; Arg args[8]; Cardinal num_args; ! Dimension width, height, font_height; int nlines; text_info = wp->text_information; width = text_info->max_width + text_info->extra_width; text_info->blocked = blocking; text_info->destroy_on_ack = FALSE; + font_height = nhFontHeight(wp->w); /* * Calculate the number of lines to use. First, find the number of *************** *** 172,188 **** * _some_ lines. Finally, use the number of lines in the text if * there are fewer than the max. */ ! nlines = (XtScreen(wp->w)->height - text_info->extra_height) / ! (text_info->fs->ascent + text_info->fs->descent); nlines -= 4; if (nlines > text_info->text.num_lines) nlines = text_info->text.num_lines; if (nlines <= 0) nlines = 1; ! /* Font height is ascent + descent. */ ! height = (nlines * (text_info->fs->ascent + text_info->fs->descent)) ! + text_info->extra_height; num_args = 0; --- 173,186 ---- * _some_ lines. Finally, use the number of lines in the text if * there are fewer than the max. */ ! nlines = (XtScreen(wp->w)->height - text_info->extra_height) / font_height; nlines -= 4; if (nlines > text_info->text.num_lines) nlines = text_info->text.num_lines; if (nlines <= 0) nlines = 1; ! height = nlines * font_height + text_info->extra_height; num_args = 0; *************** *** 469,476 **** Sprintf(rip_line[NAME_LINE], "%s", plname); /* Put $ on stone */ ! Sprintf(rip_line[GOLD_LINE], "%ld Au", u.ugold); ! /* Put together death description */ switch (killer_format) { default: impossible("bad killer format?"); --- 467,478 ---- Sprintf(rip_line[NAME_LINE], "%s", plname); /* Put $ on stone */ ! Sprintf(rip_line[GOLD_LINE], "%ld Au", ! #ifndef GOLDOBJ ! u.ugold); ! #else ! done_money); ! #endif /* Put together death description */ switch (killer_format) { default: impossible("bad killer format?"); *** nethack-3.3.1/win/X11/winval.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winval.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winval.c 3.3 92/3/7 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winval.c 3.4 1992/3/7 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *** nethack-3.3.1/win/X11/winX.c Thu Feb 14 07:59:38 2002 --- nethack-3.4.0/win/X11/winX.c Thu Mar 21 07:37:49 2002 *************** *** 1,4 **** ! /* SCCS Id: @(#)winX.c 3.3 1999/12/21 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ --- 1,4 ---- ! /* SCCS Id: @(#)winX.c 3.4 1999/12/21 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ *************** *** 92,97 **** --- 92,98 ---- /* Interface definition, for windows.c */ struct window_procs X11_procs = { "X11", + WC_COLOR|WC_HILITE_PET, X11_init_nhwindows, X11_player_selection, X11_askname, *************** *** 144,149 **** --- 145,151 ---- #else genl_outrip, #endif + genl_preference_update, }; /* *************** *** 265,271 **** long cdiff = 16777216; /* 2^24; hopefully our map is smaller */ XColor tmp; static XColor *table = 0; ! register i, j; register long tdiff; /* if the screen doesn't have a big colormap, don't waste our time */ --- 267,273 ---- long cdiff = 16777216; /* 2^24; hopefully our map is smaller */ XColor tmp; static XColor *table = 0; ! register int i, j; register long tdiff; /* if the screen doesn't have a big colormap, don't waste our time */ *************** *** 450,455 **** --- 452,489 ---- } } + /* [ALI] Utility function to ask Xaw for font height, since the previous + * assumption of ascent + descent is not always valid. + */ + Dimension + nhFontHeight(w) + Widget w; + #ifdef _XawTextSink_h + { + Widget sink; + XawTextPosition pos = 0; + int resWidth, resHeight; + Arg args[1]; + + XtSetArg(args[0], XtNtextSink, &sink); + XtGetValues(w, args, 1); + + XawTextSinkFindPosition(sink, pos, 0, 0, 0, &pos, &resWidth, &resHeight); + return resHeight; + } + #else + { + XFontStruct *fs; + Arg args[1]; + + XtSetArg(args[0], XtNfont, &fs); + XtGetValues(w, args, 1); + + /* Assume font height is ascent + descent. */ + return = fs->ascent + fs->descent; + } + #endif + /* Global Functions ======================================================== */ void X11_raw_print(str) *************** *** 870,876 **** static XtResource resources[] = { { "slow", "Slow", XtRBoolean, sizeof(Boolean), ! XtOffset(AppResources *,slow), XtRString, "False" }, { "autofocus", "AutoFocus", XtRBoolean, sizeof(Boolean), XtOffset(AppResources *,autofocus), XtRString, "False" }, { "message_line", "Message_line", XtRBoolean, sizeof(Boolean), --- 904,910 ---- static XtResource resources[] = { { "slow", "Slow", XtRBoolean, sizeof(Boolean), ! XtOffset(AppResources *,slow), XtRString, "True" }, { "autofocus", "AutoFocus", XtRBoolean, sizeof(Boolean), XtOffset(AppResources *,autofocus), XtRString, "False" }, { "message_line", "Message_line", XtRBoolean, sizeof(Boolean), *************** *** 1178,1189 **** XtPointer client_data; XtPointer call_data; { char *s; Widget dialog = (Widget) client_data; s = (char *) GetDialogResponse(dialog); ! Strcpy(getline_input, s); XtFree(s); nh_XtPopdown(XtParent(dialog)); exit_x_event = TRUE; } --- 1212,1231 ---- XtPointer client_data; XtPointer call_data; { + int len; char *s; Widget dialog = (Widget) client_data; s = (char *) GetDialogResponse(dialog); ! len = strlen(s); ! ! /* Truncate input if necessary */ ! if (len >= BUFSZ) len = BUFSZ - 1; ! ! (void) strncpy(getline_input, s, len); ! getline_input[len] = '\0'; XtFree(s); + nh_XtPopdown(XtParent(dialog)); exit_x_event = TRUE; } *************** *** 1389,1400 **** XtGetValues(dispfile, args, num_args); /* - * Font height is ascent + descent. - * * The data files are currently set up assuming an 80 char wide window * and a fixed width font. Soo.. */ ! new_height = num_lines * (fs->ascent + fs->descent) + top_margin + bottom_margin; new_width = 80 * fs->max_bounds.width + left_margin + right_margin; --- 1431,1440 ---- XtGetValues(dispfile, args, num_args); /* * The data files are currently set up assuming an 80 char wide window * and a fixed width font. Soo.. */ ! new_height = num_lines * nhFontHeight(dispfile) + top_margin + bottom_margin; new_width = 80 * fs->max_bounds.width + left_margin + right_margin;